|
51單片機(jī)做信號發(fā)生器實(shí)例編程
http://www.zg4o1577.cn/mcu/1690.html
- //用51單片機(jī)做信號發(fā)生器,同時輸出四種頻率的方波。
- //要求:晶振為12MHz,用T0做定時器,在P1的低四位輸出四種頻率的方波:
- // P1.3 = 1.25kHz、P1.2 = 2.5kHz、P1.1 = 5kHz、P1.0 = 10kHz
- //另外,上述四個頻率要求用一個四選一數(shù)據(jù)選擇器,再選出其中的一個輸出出去。
- //P1.6、P1.7的輸出用來控制四選一數(shù)據(jù)選擇器的選擇位,它們由P3.0按鍵控制。
- //===================================================
- //現(xiàn)在增加了PROTEUS仿真圖片發(fā)上博客。
- //題目要求在相鄰四條接口線輸出的四種頻率,恰有二倍的關(guān)系,這就可以利用一個定時中斷來完成。
- //題目還要求使用一個數(shù)據(jù)選擇器,通過按鍵選擇一個頻率來輸出。
- //利用PROTEUS仿真的截圖如下所示。
- //圖中在輸出端接上了一個頻率計(jì)和一個揚(yáng)聲器,進(jìn)行頻率檢測。
- //當(dāng)按下按鍵時,輸出頻率可以輪番轉(zhuǎn)換。
- //圖中把四種頻率的檢測結(jié)果都截圖顯示,可以看出,輸出的頻率十分理想。
- //PC的揚(yáng)聲器也能聽到聲音,10kHz的頻率,比較刺耳。
- //以下程序已經(jīng)仿真成功。
- //---------------------------------------------------
- #include <reg52.h>
- #define uchar unsigned char
- #define TL_0SET (256 - 50) //定時時間選為50us
- //輸出的方波周期將為100us, 10kHz
- sbit P3_2 = P3^2; //用于按鍵
- sbit P1_0 = P1^0; //四個頻率輸出
- sbit P1_1 = P1^1; //
- sbit P1_2 = P1^2; //
- sbit P1_3 = P1^3; //
- sbit P1_6 = P1^6; //兩個選擇控制輸出
- sbit P1_7 = P1^7; //
-
- bdata uchar x = 0;
- sbit p16 = x^0;
- sbit p17 = x^1;
-
- uchar i, j;
- //---------------------------------------------------
- void e0int() interrupt 0 //外部中斷0作開關(guān),控制四選一數(shù)據(jù)選擇器
- {
- while(P3_2 == 0) {;} //等待按鍵釋放
- x++;
- if(x == 4) x = 0; //改變當(dāng)前輸出的選擇
- P1_7 = p16;
- P1_6 = p17;
- }
- //---------------------------------------------------
- void time0() interrupt 1 //T0的中斷服務(wù)程序
- { //T0工作在方式2,自動裝入初始值
- i++;
- j = i % 16; //取i的低四位
- j += x << 6; //組合上數(shù)據(jù)選擇器的控制信號
- P1 = j; //輸出四種頻率的方波以及控制信號
- }
- //---------------------------------------------------
- void main()
- {
- TMOD = 0x02; //T0定時方式2
- TH0 = TL_0SET; //自裝入式的定時初始值
- TR0 = 1; //啟動T0
- ET0 = 1;
- IT0 = 1; //外部中斷0由下降沿觸發(fā)
- EX0 = 1; //外部中斷0允許
- EA = 1;
- while(1) {;}
- }
- //---------------------------------------------------
復(fù)制代碼 |
|