介面程式設計 使用Proteus設計簡易電子琴

2021-10-02 02:35:42 字數 2869 閱讀 2617

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...