proteus版本:8.0
使用晶元:8086、並行介面晶元8255a、可程式設計定時/計數器8253、鎖存器74hc373、解碼器74hc138
1、設計乙個簡易的電子琴有21個音階,故採用3*7個按鈕來模擬。
2、通過pb輸出的資料以及從pc口讀入的資料來判斷按下的是哪個鍵,然後通過c語言程式設計將對應的音訊輸入到8253a中,使得clk0開始工作,發聲然後通過控制gate0訊號來使計數停止。
參考8255a晶元詳解
1、使用一片8255a晶元讀取按鈕的按下情況
2、這裡僅僅使用0方式,pa、pb口輸出,pc口輸入,控方式命令字為89h
參考8253a晶元詳解
1、這裡使用可程式設計定時/計數晶元8253a來達到控制蜂鳴器發聲的效果
1、通過74hc138來進行8255a、8253a晶元的選中
2、8255a晶元 /cs引腳與74hc138的y0引腳相連,故8255a晶元的pa、pb、pc以及命令口位址分別為8000h、8002h、8004h、8006h。
3、8253a晶元 /cs引腳與 74hc138的 y2引腳相連,故8253a晶元的三個計數器位址以及命令口位址分別為0a000h、0a002h、0a004h、0a006h。
/* main.c file generated by new project wizard
* * created: 2019 12 16
* processor: 8086
* compiler: digital mars c
* * before starting simulation set internal memory size
* in the 8086 model properties to 0x10000
*/#define tcontro 0a006h//00000110b
#define tcon0 0a000h
#define tcon1 0a002h
#define tcon2 0a004h
#define iocon 8006h //控制口
#define ioa 8000h //a資料口
#define iob 8002h //b資料口
#define ioc 8004h //c資料口
//以下是c調低音的音訊巨集定義
#define l_dao 382 //將「l_dao」巨集定義為低音「1」的頻率262hz
#define l_re 350 //將「l_re」巨集定義為低音「2」的頻率286hz
#define l_mi 322 //將「l_mi」巨集定義為低音「3」的頻率311hz
#define l_fa 287 //將「l_fa」巨集定義為低音「4」的頻率349hz
#define l_sao 254 //將「l_sao」巨集定義為低音「5」的頻率392hz
#define l_la 227 //將「l_a」巨集定義為低音「6」的頻率440hz
#define l_xi 202 //將「l_xi」巨集定義為低音「7」的頻率494hz
//以下是c調中音的音訊巨集定義
#define dao 191 //將「dao」巨集定義為中音「1」的頻率523hz
#define re 170 //將「re」巨集定義為中音「2」的頻率587hz
#define mi 152 //將「mi」巨集定義為中音「3」的頻率659hz
#define fa 143 //將「fa」巨集定義為中音「4」的頻率698hz
#define sao 128 //將「sao」巨集定義為中音「5」的頻率784hz
#define la 114 //將「la」巨集定義為中音「6」的頻率880hz
#define xi 101 //將「xi」巨集定義為中音「7」的頻率523h
//以下是c調高音的音訊巨集定義
#define h_dao 96 //將「h_dao」巨集定義為高音「1」的頻率1046hz
#define h_re 85 //將「h_re」巨集定義為高音「2」的頻率1174hz
#define h_mi 76 //將「h_mi」巨集定義為高音「3」的頻率1318hz
#define h_fa 72 //將「h_fa」巨集定義為高音「4」的頻率1396hz
#define h_sao 64 //將「h_sao」巨集定義為高音「5」的頻率1567hz
#define h_la 57 //將「h_la」巨集定義為高音「6」的頻率1760hz
#define h_xi 51 //將「h_xi」巨集定義為高音「7」的頻率1975hz
void outp(unsigned int addr, char data)
// write a byte to the specified i/o port }
char inp(unsigned int addr)
// read a byte from the specified i/o port
return result;
}void delay()
void main(void)
; outp(iocon,0x89);// 0x88=10001000b a組0方式 pa輸出 pc4-7輸入 b組0方式 pb輸出 pc0-3輸出
outp(tcontro,0x36); //計數器0,只寫計算值低8位,方式3,二進位制計數 00110110b
while(1)
outp(ioa,0x00);
}
}}
1、csdn:簡易電子琴壓縮包 基於proteus的狀態機設計
參考資料 理論上說,任何乙個需要周而復始的執行一系列任務 例如cpu中按順序從儲存器取出指令 再執行指令 的時序系統都可以用狀態機 state machine 模型來描述。時序系統的執行週期可以描述為乙個預定順序的時間週期序列,每個週期都對應狀態機中乙個指定的狀態。狀態機在每個週期中產生特定的操作,...
面向介面程式設計的設計模式
為了避免上面的問題發生,工廠模式建議讓computer類組合乙個output型別的物件,將computer類與printer類完全分離。computer物件實際組合的是printer物件還是betterprinter物件,對computer而言完全透明。當printer物件切換到betterprin...
使用GtkBuilder設計Gtk 介面
linuxeden管理團隊c aries gtk 使用glade進行介面設計能有效地加快專案進度和提高程式的可維護性。自從gtk2.12,gtk 已經內建了gtkbuilder,用以代替使用glade編寫的程式所依賴的libglade庫檔案。下面介紹如何使用gtkbuilder寫乙個最基本的介面。1...