proteus單片機.ppt_第1頁
proteus單片機.ppt_第2頁
proteus單片機.ppt_第3頁
proteus單片機.ppt_第4頁
proteus單片機.ppt_第5頁
免費預覽已結束,剩余316頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 基于PROTEUS ISIS的 單片機電路仿真,7.1 單片機最小系統(tǒng)實訓 7.2 模擬汽車轉向燈控制實訓 7.3 基于LED數碼管的簡易秒表設計實訓7.4 電子廣告牌實訓 7.5 數碼管動態(tài)顯示實訓 7.6 中斷掃描方式的矩陣式鍵盤設計實訓,7.7 模擬交通燈控制實訓7.8 液晶顯示控制實訓7.9 A/D轉換接口技術實訓7.10 D/A轉換接口技術實訓7.11 雙機通信技術實訓7.12 單片機課程設計,7.1 單片機最小系統(tǒng)實訓本實訓通過51單片機控制一個簡單的LED燈,實現閃爍功能,并將程序編譯下載到單片機中,從而使單片機工作起來。單片機最小系統(tǒng)實訓圖如圖7.1.1所示,所用元件清

2、單如表7.1.1所示。,圖7.1.1 單片機最小系統(tǒng)實訓圖,程序代碼為:#include sbit P1_0=P10;void delay(unsigned char i);void main( ) while(1) P1_0=0; delay(255); P1_0=1;,delay(255); void delay(unsigned char i) unsigned char j,k; for(k=0;ki;k+) for(j=0;j255;j+);,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-1-1.hex,雙擊AT89C51,將彈出如圖7.1.2所示的對話框。在圖7.1.2中

3、添加十六進制文件7-1-1.hex,點擊“OK”即可。最后進行仿真,可發(fā)現LED燈按要求實現了閃爍功能。,圖7.1.2 添加十六進制文件,7.2 模擬汽車轉向燈控制實訓安裝在汽車不同位置的信號燈是汽車駕駛員之間及駕駛員向行人傳遞汽車行駛狀況的工具,一般包括轉向燈、剎車燈、倒車燈等。其中轉向燈包括左轉燈和右轉燈,其狀態(tài)表示的意義如表7.2.1所示。,本實訓利用PROTEUS模擬汽車轉向燈控制,其中開關S0、S1模擬駕駛員發(fā)出命令,若開關狀態(tài)為0,則表示開關斷開,反之閉合。其實訓圖如圖7.2.1所示,所用元件清單如表7.2.2所示。,圖7.2.1 模擬汽車轉向燈控制實訓圖,在上述電路圖中,開關S0

4、、S1模擬駕駛員命令,發(fā)光二極管D1、D2模擬左轉燈和右轉燈,兩者之間的關系如表7.2.1所示。利用開關S0、S1的狀態(tài)即可控制D1和D2的狀態(tài)。程序代碼為:,#include sbit P1_0=P10;sbit P1_1=P11;sbit P3_0=P30;sbit P3_1=P31;void delay(unsigned char i);void main( ), bit left,right; while(1) P3_0=1; P3_1=1; left=P3_0; right=P3_1; switch(P3), case 0 xfc: P1_0=1,P1_1=1;break; case

5、 0 xfd: P1_0=0,P1_1=1;break; case 0 xfe: P1_0=1,P1_1=0;break; case 0 xff: P1_0=0,P1_1=0;break; delay(255); P1_0=1; P1_1=1; delay(255);,void delay(unsigned char i) unsigned char j,k; for(k=0;ki;k+) for(j=0;j255;j+);,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-2-1.hex,雙擊AT89C51,將彈出如圖7.2.2所示的對話框。在圖7.2.2中添加十六進制文件7-2-1.

6、hex,點擊“OK”即可。最后進行仿真,可實現表7.2.1的所有功能。,圖7.2.2 添加十六進制文件,7.3 基于LED數碼管的簡易秒表設計實訓利用51單片機控制1個LED數碼管,依次循環(huán)顯示09,顯示間隔時間為1 s,即可實現一位數的簡易秒表?;贚ED數碼管的簡易秒表設計實訓圖如圖7.3.1所示,所用元件清單如表7.3.1所示。,圖7.3.1 基于LED數碼管的簡易秒表設計實訓,在上述電路圖中,利用單片機的P2口控制一個共陽極LED數碼管,向P2口輸出相應字型碼即可顯示數字09。對于共陽極數碼管,當連接段控制端的I/O引腳輸出低電平時,相應段的發(fā)光管點亮。程序代碼為:,#includeu

7、nsigned char led=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/定義數組led存放數字09的字型碼void delay1s() /采用定時器1實現1s的延時 unsigned char i; for(i=0;i20;i+) /設置循環(huán)次數為20, TH1=0 x3c; /設置定時器初值為3CBOH TL1=0 xb0; TR1=1; /啟動定時器T1 while(!TF1); /查詢計數是否溢出,即50 ms時間到 則TF1=1 TF1=0; /將溢出標志位TF1清零 ,void main() /主函數

8、 unsigned char i; TMOD=0 x10; /設置定時器1在工作方式1 while(1), for(i=0;i10;i+) P2=ledi; /字型碼送段控制口P1 delay1s(); /延時1 s ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-3-1.hex,雙擊AT89C51,將彈出如圖7.3.2所示的對話框。在圖7.3.2中添加十六進制文件7-3-1.hex,點擊“OK”即可。最后進行仿真,可實現每隔1s依次循環(huán)顯示數字09。,圖7.3.2 添加十六進制文件,7.4 電子廣告牌實訓利用51單片機控制1個88 LED點陣顯示模塊,依次循環(huán)顯示09,顯示間隔時間

9、為1 s,實現一位數的簡易秒表。電子廣告牌實訓圖如圖7.4.1所示,所用元件清單如表7.4.1所示。,圖7.4.1 電子廣告牌實訓圖,LED點陣顯示是把很多LED按矩陣方式排列在一起,通過對各LED發(fā)光與不發(fā)光的控制來完成各種字符或圖形的顯示。88 LED點陣分別由8行和8列來控制。在圖7.3.1中,用單片機的P1口控制點陣屏的8行,用P0口控制點陣屏的8列。,實際應用中,P0口用于控制列線,需串聯一個300 左右的限流電阻。同時,為了提高單片機端口帶負載的能力,通常在端口和外接負載之間增加一個緩沖驅動器。圖7.4.1中P1口通過74LS245與點陣連接,既保證了點陣的亮度,又能保護單片機的引

10、腳。其程序代碼為:,#includevoid delay(unsigned char i) unsigned char k,j; for(k=0;ki;k+) for(j=0;j255;j+);,void delay1ms() /軟件實現延時1ms unsigned char i; for(i=0;i0 x10;i+);void main(), unsigned char code led=0 x00,0 x18,0 x24,0 x24,0 x24,0 x24,0 x18,0 x00, /0 0 x08,0 x18,0 x28,0 x08,0 x08,0 x08,0 x3e,0 x00, /1

11、 0 x00,0 x18,0 x24,0 x24,0 x08,0 x10,0 x3c,0 x00, /2 0 x00,0 x18,0 x24,0 x04,0 x18,0 x04,0 x24,0 x18, /3 0 x00,0 x08,0 x10,0 x28,0 x48,0 x3e,0 x08,0 x00, /4 0 x00,0 x2c,0 x20,0 x28,0 x04,0 x24,0 x18,0 x00, /5 0 x08,0 x10,0 x20,0 x38,0 x24,0 x24,0 x18,0 x00, /6,0 x00,0 x3c,0 x04,0 x08,0 x10,0 x10,0 x

12、10,0 x00, /7 0 x00,0 x18,0 x24,0 x24,0 x18,0 x24,0 x24,0 x18, /8 0 x00,0 x18,0 x24,0 x24,0 x1c,0 x04,0 x24,0 x18;/9 unsigned char w; unsigned int j,k,l,m; while(1), for(j=0;j10;j+)/字符個數控制變量 for(k=0;k1000;k+)/每個字符掃描1000次,控制每 個字符的顯示時間 w=0 x01;/行變量指向第一行 l=j*8; for(m=0;m8;m+), P1=0 x00; /關閉行,防止出現顯示殘留 P0

13、=ledl;/列數據取反后值送至P0口 P1=w;/打開行 delay1ms(); w=1; /逐行掃描,l+;/指向數組中下一個顯示碼 ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-4-1.hex,雙擊AT89C51,將彈出如圖7.4.2所示的對話框。在圖7.4.2中添加十六進制文件7-4-1.hex,點擊“OK”即可。最后進行仿真,可實現每隔1 s依次循環(huán)顯示09。,圖7.4.2 添加十六進制文件,如果要在88點陣上顯示的圖形如圖7.4.3所示,程序該如何修改?請讀者自行實現此功能。,圖7.4.3 顯示漢字字符,7.5 數碼管動態(tài)顯示實訓本節(jié)利用數碼管動態(tài)顯示自己的生日(修定生

14、日為1980年7月8日),實訓圖如圖7.5.1所示,所用元件清單如表7.5.1所示。,圖7.5.1 數碼管動態(tài)顯示實訓,在上述電路圖中,六位數碼管的位選端由P2.0P2.5控制,段選端由P1口控制,P1口通過74LS245與數碼管的段選端連接,既能保證數碼管的亮度,又能保護單片機引腳。其程序代碼為:,#includevoiddelay1ms() unsigned char i; TMOD=0 x20; TH1=6; TL1=6; TR1=1; for(i=0;i4;i+), while(!TF1); TF1=0; void disp() unsigned char led =0 x80,0 x

15、c0,0 xc0,0 xf8,0 xc0,0 x80; unsigned char i,w;,w=0 x01; for(i=0;i6;i+) P2=w; w=1; P1=ledi; delay1ms(); ,voidmain() while(1) disp(); ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-5-1.hex,雙擊AT89C51,將彈出如圖7.5.2所示的對話框。在圖7.5.2中添加十六進制文件7-5-1.hex,點擊“OK”即可。最后進行仿真,可顯示如圖7.5.3所示的生日。,圖7.5.2 添加十六進制文件,圖7.5.3 顯示生日圖,7.6 中斷掃描方式的矩陣式鍵盤

16、設計實訓采用中斷掃描方式設計44矩陣鍵盤,當某個鍵被按下時,LED數碼管顯示相應按鍵的鍵值。中斷掃描方式的矩陣式鍵盤實訓圖如圖7.6.1所示,所用元件清單如表7.6.1所示。,圖7.6.1 中斷掃描方式的矩陣式鍵盤實訓圖,44矩陣式鍵盤的4根行線連接到P0口的低四位,4根列線連接到P0口的高四位。按照矩陣式鍵盤的掃描方法可知,P0.0P0.3為掃描輸入線,P0.4P0.7為鍵輸出線。圖7.6.1中的與門用于產生按鍵中斷,其輸入端與各行線相連,再通過上拉電阻接至+5V電源,輸出端接至外部中斷0的輸入端P3.2。LED數碼管由單片機的P1口控制。,具體工作過程如下:當鍵盤沒有鍵按下時,與門各輸入端

17、均為高電平,與門輸出端也保持高電平;當有鍵被按下時,與門輸入端有低電平,相應地與門輸出端變?yōu)榈碗娖?,從而控制P3.2向CPU申請中斷,若CPU開放外部中斷,則會響應中斷請求,轉去執(zhí)行鍵盤掃描程序并獲得對應鍵值,最終通過LED數碼管顯示。,其程序代碼為:#include#define uchar unsigned char void display(uchar num);void delay10ms();uchar code led=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8, 0 x80,0 x90,0 x88,0 x83,0 xc6,0 x

18、a1,0 x86,0 x8e;,void main() P1=0 xff;TMOD=0 x10; /T1在工作方式1IE=0 x87;/開中斷總允許位和外部中斷0允許位IT0=1;/設置外部0中斷下降沿觸發(fā)while(1),P0=0 xef;P0=0 xdf;P0=0 xbf;P0=0 x7f;void display(uchar num)P1=lednum;,voiddelay10ms()TH1=0 xd8;TL1=0 xf0;TR1=1;while(!TF1);TF1=0;,voidinth() interrupt 0/外部中斷0uchar temp,key;P0=0 xef;/掃描第一行

19、temp=P0;/P0狀態(tài)送給變量temptemp=temp/與操作屏蔽低四位if(temp!=0 x0f)/P0高四位有低電位進入,delay10ms(); /延時10 mstemp=P0; /P0狀態(tài)送給變量temptemp=temp /判斷后的P0狀態(tài)送給變量temp switch(temp),case 0 xee:key=0;break; /鍵值為0的按鍵按下case 0 xed:key=4;break;/鍵值為1的按鍵按下 case 0 xeb:key=8;break;/鍵值為2的按鍵按下case 0 xe7:key=12;break;/鍵值為3的按鍵按下 while(temp!=0

20、 x0f) /等待按鍵釋放,即P0高四位恢復 高電位,結束循環(huán),temp=P0;temp=temp/顯示鍵值,P0=0 xdf;/掃描第一行temp=P0;/P0狀態(tài)送給變量temptemp=tempif(temp!=0 x0f),temp=P0;switch(temp)case 0 xde:key=1;break;case 0 xdd:key=5;break;case 0 xdb:key=9;break;case 0 xd7:key=13;break;,while(temp!=0 x0f)/等待按鍵釋放temp=P0;temp=temp/顯示鍵值,P0=0 xbf;/掃描第一行temp=P0

21、;/P0狀態(tài)送給變量temptemp=temp,temp=temp,while(temp!=0 x0f)/等待按鍵釋放temp=P0;temp=temp /顯示鍵值,P0=0 x7f;/掃描第一行temp=P0;/P0狀態(tài)送給變量temptemp=tempif(temp!=0 x0f),temp=P0;switch(temp)case 0 x7e:key=3;break;case 0 x7d:key=7;break;case 0 x7b:key=11;break;case 0 x77:key=15;break;,while(temp!=0 x0f)/等待按鍵釋放temp=P0;temp=tem

22、p /顯示鍵值 ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-6-1.hex,雙擊AT89C51,將彈出如圖7.6.2所示的對話框。在圖7.6.2中添加十六進制文件7-6-1.hex,點擊“OK”即可。最后進行仿真,若按鍵S0按下,數碼管顯示的數字為“0”;若按鍵S1按下,數碼管顯示的數字為“1”;若按鍵S2按下,數碼管顯示的數字為“2”,以此類推,若按鍵S15按下,數碼管顯示的數字為“F”。,圖7.6.2 添加十六進制文件,7.7 模擬交通燈控制實訓 (1) 正常情況下雙方向輪流點亮信號燈。信號燈的狀態(tài)如表7.7.1所示。(2) 有緊急車輛通過時,A、B方向均亮紅燈。本實訓主要是

23、定時控制東南西北四個方向上的12盞交通信號燈,并且出現緊急情況時,能及時調整交通燈指示狀態(tài)。,觀察表7.7.1不難發(fā)現,在不考慮左轉彎行駛車輛的情況下,東、西兩個方向的信號燈的顯示狀態(tài)是一樣的,所以對應兩個方向上的6個發(fā)光二極管只用P1口的3根I/O口線控制即可。同理,南、北方向上的6個發(fā)光二極管可用P1口的另外3根I/O口線控制。當I/O口線輸出高電平時,對應的交通燈滅;反之,當I/O口線輸出低電平時,對應的交通燈亮。各控制口線的分配以及控制狀態(tài)如表7.7.2所示。,根據上述分析,模擬交通燈控制實訓圖如圖7.7.1所示,所用元件清單如表7.7.3所示。,表7.7.3 模擬交通燈控制實訓元件清

24、單,圖7.7.1 模擬交通燈控制實訓圖,按鍵S1模擬緊急情況發(fā)生,當S1為高電平(不按按鍵)時表示正常情況,S1為低電平(按下按鍵)時表示緊急情況。S1按鍵接至(P3.2)腳可實現外部中斷0中斷申請,實現A、B方向雙向紅燈顯示。,其程序代碼為:#includeunsigned char t0,t1;void delay0_5s() for(t0=0;t010;t0+) TH1=0 x3c; TL1=0 xb0; TR1=1; while(!TF1); TF1=0; ,void delay_t1(unsigned char t) for(t1=0;t1t;t1+) delay0_5s();voi

25、d int_0() interrupt 0, unsigned char i,j,k,l,m; i=P1; j=t0; k=t1; l=TH1; m=TH0; P1=0 xdb; delay_t1(20);,P1=i; t0=j; t1=k; TH1=1; TH0=m;void main(), unsigned char k; TMOD=0 x10; EA=1; EX0=1; IT0=1; while(1) P1=0 xf3; delay_t1(10); for(k=0;k3;k+), P1=0 xf3; delay0_5s(); P1=0 xfb; delay0_5s(); P1=0 xeb

26、; delay_t1(4); P1=0 xde; delay_t1(10); for(k=0;k3;k+), P1=0 xde; delay0_5s(); P1=0 xdf; delay0_5s(); P1=0 xdd; delay_t1(4); ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-7-1.hex,雙擊AT89C51,將彈出如圖7.7.2所示的對話框。在圖7.7.2中添加十六進制文件7-7-1.hex,點擊“OK”即可。最后進行仿真,可實現表7.7.1的所有功能,且當緊急情況發(fā)生(按鍵S1按下)時,A、B兩方向雙向紅色顯示。,圖7.7.2 添加十六進制文件,7.8 液晶顯

27、示控制實訓在實際生活中,經??梢钥吹桨硕蜭ED數碼管構成的廣告牌顯示屏,但數碼管構成的顯示屏顯示的字符有限,不能靈活顯示更多的字符和文字。對于顯示多個字符的應用場合,就需要使用液晶顯示器。液晶顯示控制實訓圖如圖7.8.1所示,所用元件清單如表7.8.1所示。,圖7.8.1 液晶顯示控制實訓,其程序代碼為:#includetypedef unsigned char uint8;typedef unsigned int uint16;sbit RS=P20;sbit RW=P21;sbit EN=P25;sbit BUSY=P07;unsigned char code word1=“Welcome

28、 to Shenz”; /定義顯示的字符unsigned char code word2=“hen Polytechnic”; /定義顯示的字符,void delay() uint16 i,j; for(i=0;i200;i+) for(j=0;j200;j+);void wait() /等待繁忙標志 P0=0 xff; do, RS=0; RW=1; EN=0; EN=1; while(BUSY=1); EN=0;,void w_dat(uint8 dat) /寫數據 wait(); EN=0; P0=dat; RS=1; RW=0; EN=1; EN=0;,void w_cmd(uint8

29、 cmd) /寫命令 wait(); EN=0; P0=cmd; RS=0; RW=0; EN=1; EN=0;,void Init_LCD1602() /初始化 w_cmd(0 x38); w_cmd(0 x0f); w_cmd(0 x06); w_cmd(0 x01);void w_string(uint8 addr_start, uint8 *p) /顯示字符, w_cmd(addr_start); while (*p != 0) w_dat(*p+); delay(); main(), Init_LCD1602(); w_string(0 x80,word1); w_string(0

30、xc0,word2); w_cmd(0 x0c); while(1);,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-8-1.hex,雙擊AT89C51,將彈出如圖7.8.2所示的對話框。在圖7.8.2中添加十六進制文件7-8-1.hex,點擊“OK”即可。最后進行仿真,從仿真結果來看,液晶上顯示的字符為“Welcome to Shenzhen Polytechnic”。,圖7.8.2 添加十六進制文件,7.9 A/D轉換接口技術實訓采用TI公司生產的A/D轉換芯片TLC2543采集05V連續(xù)可變的模擬電壓信號,并將其轉變?yōu)?2位數字信號,送至51單片機進行處理,在四位數碼管上顯示出

31、對應的數字信號。05 V的模擬電壓信號可通過調節(jié)電位器獲得。A/D轉換接口技術實訓圖如圖7.9.1所示,所用元件清單如表7.9.1所示。,圖7.9.1 A/D轉換接口技術實訓圖,在上述電路圖中,05 V模擬電壓信號可通過調節(jié)電位器獲得,并被送至A/D芯片TLC2543的AIN0通道。數據輸出端SDO、串行數據輸入端SDI、片選端和輸入/輸出時鐘CLK分別與51單片機的P1.0P1.3相連。四位數碼管選用共陽極數碼管,位選端由單片機的P3.0P3.3控制,段碼端由單片機的P2.0P2.7控制,采用動態(tài)掃描法顯示。,其程序代碼為:#include#include#include#define uc

32、har unsigned char#define uint unsigned intsbit AD_CLOCK=P13; /TLC2543控制位的宏定義sbit AD_IN=P11;sbit AD_OUT=P10;,sbit AD_CS=P12;uchar table10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; /共陽極數碼管段碼static const uchar ad_channel_select= 0 x08,0 x18,0 x28,0 x38,0 x48,0 x58,0 x68,0 x78,0 x88,0

33、 x98,0 xa8; /通道010均為12位數據,MSB在前,無符號uint ad2543(uchar chunnel_select) /二進制,A/D轉換子程序,讀出上一次AD值(12位精 /度),并開始下一次轉換, uint din,j; uchar dout,i; din=0; dout=ad_channel_selectchunnel_select; for(j=0;j100;j+); /延時大于1us AD_CLOCK=0; AD_CS=0; for(i=0;i12;i+), if(dout ,AD_CS=1; for(j=0;j100;j+); /延時大于1us return(d

34、in);void display(uint num) /AD輸出12位數字信號,數碼管顯示程序, uint a; P3=0 x08; P2=tablenum/1000; for(a=0;a1000;a+); P3=0 x04; P2=table(num%1000)/100; for(a=0;a1000;a+); P3=0 x02;,P2=table(num%1000)%100)/10; for(a=0;a1000;a+); P3=0 x01; P2=table(num%1000)%100)%10; for(a=0;a1000;a+); void main(void), uint ad; whi

35、le (1) ad=ad2543(0); display(ad); ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-9-1.hex,雙擊AT89C51,將彈出如圖7.9.2所示的對話框。在圖7.9.2中添加十六進制文件7-9-1.hex,點擊“OK”即可。,圖7.9.2 添加十六進制文件,最后進行仿真,調節(jié)電位器的滑動旋鈕,發(fā)現在四位數碼管上可正確顯示A/D轉換后的12位數據:若模擬電壓為5 V(最大值),其數碼管上顯示1111 1111 1111(FFFH),即十進制為4095;若模擬電壓為0 V(最小值),其數碼管上顯示0000 0000 0000(000H),即十進制為0000

36、;若模擬電壓為2.5 V(中間值),其數碼管上顯示1000 0000 0000(800H),即十進制為2048。,7.10 D/A轉換接口技術實訓采用TI公司生產的D/A轉換芯片TLC5615及51單片機組成波形發(fā)生器,編制程序產生鋸齒波信號,通過程序控制鋸齒波信號的幅值及周期。D/A轉換接口技術實訓如圖7.10.1所示,所用元件清單如表7.10.1所示。,圖7.10.1 D/A轉換接口技術實訓圖,在上述電路圖中,TLC5615與單片機的連接只需3根線,即串行時鐘輸入端SCLK、片選端和串行輸入端DIN分別與單片機的P3.0P3.2相連;參考電壓端REFIN通過穩(wěn)壓管與電阻相連,以實現各種不同

37、的輸入參考電壓;輸出端OUT與示波器相連,以觀察鋸齒波波形幅值及周期。,其程序代碼為:#include sbit SCK=P30; /TLC5615控制位的宏定義sbit CS=P31;sbit DIN=P32;void TLC5615(unsigned int x) /TLC5615轉換子程序, unsigned char y; CS=1; SCK=0; DIN=0; CS=0; x=6; /舍棄前6位,16位數據的低10位變?yōu)楦?0位 for(y=0;y12;y+) /高位到低位發(fā)送, DIN=xvoid main( ), unsigned int V_dat=0; unsigned ch

38、ar i; while(1) if(V_dat700) V_dat+=10; /V_dat的取值決定了鋸齒波的幅值及頻率 /其值越大,信號幅值及周期就越大,else V_dat=0; TLC5615(V_dat); /進行數/模轉換 i=10; while(i-); ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-10-1.hex,雙擊AT89C51,將彈出如圖7.10.2所示的對話框。在圖7.10.2中添加十六進制文件7-10-1.hex,點擊“OK”即可。最后進行仿真,可從示波器上觀察到鋸齒波波形,如圖7.10.3所示。,圖7.10.2 添加十六進制文件,圖7.10.3 鋸齒波波

39、形小提示,7.11 雙機通信技術實訓本實訓通過51單片機建立一套簡單的單片機串行口雙機通信測試系統(tǒng),發(fā)射和接收各用一套AT89C51單片機電路,分別稱為甲機和乙機,將單片機甲機中存放的數據(例如617528)發(fā)送給乙機,并在乙機的6個數碼管上顯示出來。雙機通信技術實訓圖如圖7.11.1所示,所用元件清單如表7.11.1所示。,圖7.11.1 雙機通信技術實訓圖,在上述電路圖中,乙機的六個數碼管采用動態(tài)連接方式,各位共陽極數碼管相應的段選控制端并聯在一起,由P1口控制,由同相三態(tài)緩沖器/線驅動器74LS245驅動,各位數碼管的位選端由P2口控制。甲機作為發(fā)送端,乙機作為接收端,將甲機的TXD(P

40、3.1,串行數據發(fā)送端)引腳接乙機的RXD(P3.0,串行數據接收端)引腳,將甲機的RXD引腳接乙機的TXD引腳。值得注意的是,兩個系統(tǒng)必須共地。,其程序代碼如下。(1) 甲機發(fā)送數據的程序代碼:#include void main() /主函數 unsigned char i; unsigned char send=6,1,7,5,2,8; /定義要發(fā)送的數據,TMOD=0 x20; /定時器1工作于方式2 TL1=0 xf4; /波特率為2400 b/s TH1=0 xf4; TR1=1; SCON=0 x40; /定義串行口工作于方式1 for (i=0;i6;i+), SBUF=sen

41、di; /發(fā)送第i個數據 while(TI=0); /查詢等待發(fā)送是否完成 TI=0; /發(fā)送完成,TI由軟件清0 while(1);,(2) 乙機接收數據的程序代碼:#include code unsigned char tab=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; /定義09顯示字型碼unsigned char buffer =0 x00,0 x00,0 x00,0 x00,0 x00,0 x00;/定義接收數據緩沖區(qū)void disp(void); /顯示函數聲明void main() /主函數, uns

42、igned char i; TMOD=0 x20; /定時器1工作于方式2 TL1=0 xf4; /波特率定義 TH1=0 xf4; TR1=1; SCON=0 x40; /定義串行口工作于方式1 for(i=0;i6;i+), REN=1; /接收允許 while(RI=0); /查詢等待接收標志為1,表示接收到數據 bufferi=SBUF; /接收數據 RI=0; /RI由軟件清0 for(; ;) disp(); /顯示接收數據,void disp() unsigned char w,i,j; w=0 x01; /位碼賦初值 for(i=0;i6;i+), P2=w; w5;j-);/

43、顯示延時 ,在KEIL軟件中輸入上述發(fā)送和接收代碼,編譯后產生十六進制文件7-11-1.hex和7-11-2.hex,分別雙擊甲機的AT89C51和乙機的AT89C51,將彈出如圖7.11.2所示的對話框。在圖7.11.2中分別添加十六進制文件7-11-1.hex和7-11-2.hex,點擊“OK”即可。最后進行仿真,可觀察到乙機的6位數碼管上顯示的正是甲機發(fā)送過來的數據“617528”,如圖7.11.3所示。,圖7.11.2 添加十六進制文件,圖7.11.3 仿真后乙機顯示的數據,7.12 單片機課程設計7.12.1 數字頻率計1. 設計題目利用51單片機設計一個簡易頻率計,要求如下:(1)

44、 測量范圍為1 Hz9999 Hz,誤差在20 Hz以內。(2) 用四位數碼管顯示測量值。(3) 可測量方波、三角波及正弦波等多種波形。,2. 設計過程本數字頻率計采用單片機的定時器T0,工作于計數狀態(tài),P2口控制四位數碼管段碼顯示,P0口控制四位數碼管位碼,其實訓圖如圖7.12.1所示,所用元件清單如表7.12.1所示。,圖7.12.1 數字頻率計課程設計實訓圖,在上述電路圖中,單刀三擲開關可選擇正弦波、矩形波、三角波外部輸入信號,74HC14為帶施密特整形功能的非門,可將正弦波、三角波信號整形為矩形波信號,輸入到AT89C51的P3.4作為計數脈沖輸入端,P2.0P2.7控制四位數碼管段碼

45、ADP,P0.0P0.3控制四位數碼管位碼。,其程序代碼為:#include/頭文件#include/頭文件#define uchar unsigned char/宏定義#define uint unsigned int/宏定義sfr16 DPTR=0 x82;/定義DPTRbit status_F=1;/狀態(tài)標志位uint aa, qian, bai,shi,ge,bb,wan,shiwan; /定義變量uchar cout;,unsigned long temp;/定義長整型變量uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x

46、7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delay(uint z); /子函數聲明void init();void display(uint qian,uint bai,uint shi,uint ge);void xtimer0();void xtimer1();void xint0();,void main() /主函數P0=0 xFF; /初始化P0口init();/調用定時器,計數器初始化while(1)if(aa=19)/定時20*50ms=1s,aa=0;/定時完成一次后清0status_F=1;/

47、完成計數 TR1=0; /關閉T1定時器,定時1 s完成delay(46); /延時校正誤差TR0=0;/關閉T0DPL=TL0; /計數量的低8位DPH=TH0;/計數量的高8位temp=DPTR+cout*65535; /計數值放入變量,qian=temp%10000/1000;/顯示千位bai=temp%1000/100;/顯示百位shi=temp%100/10;/顯示十位ge=temp%10;/顯示個位display(qian,bai,shi,ge); /調用顯示函數,void init() /定時器,計數器初始化temp=0;/變量賦初值aa=0;cout=0;IE=0X8A;/開中

48、斷,T0,T1中斷TMOD=0 x15;/T0為定時器工作于方式1,T1為計數器工作于方式1TH1=0 x3c;/定時器賦高8初值,12 MHz晶振,TL1=0 xb0;/定時器賦低8初值,12 MHz晶振TR1=1;/開定時器1TH0=0;/計數器賦高8初值TL0=0;/計數器賦低8初值TR0=1;/開計數器0void display(uint qian,uint bai,uint shi,uint ge) /顯示子函數,P0=0 xf7;/P0口是位選端P2=tableqian;/顯示千位delay(3);P0=0 xfb;/P0口是位選端P2=tablebai;/顯示百位delay(3)

49、;P0=0 xfd; /P0口是位選端P2=tableshi;/顯示十位,delay(3);P0=0 xfe;/P0口是位選端P2=tablege;/顯示個位delay(3);void xtimer1() interrupt 3 /定時中斷子函數,TH1=0 x3c;/定時器賦高8初值TL1=0 xb0;/定時器賦低8初值aa+;void xtimer0() interrupt 1 /計數器中斷子函數, cout+;void delay(uint z) /延時子函數, 延時1 msuint i,j;for(i=0;iz;i+)for(j=0;j110;j+);,在KEIL軟件中輸入上述代碼,編

50、譯后產生十六進制文件7-12-1.hex,雙擊AT89C51,將彈出如圖7.12.2所示的對話框。在圖7.12.2中添加十六進制文件7-12-1.hex,點擊“OK”即可。,圖7.12.2 添加十六進制文件,雙擊正弦波信號源CP1,在彈出的對話框中設置其幅值為4 V,頻率為1 kHz。開始仿真,數碼管上顯示的頻率值為998 Hz,如圖7.12.3所示。同理,設置矩形波和三角波的頻率分別為1234 Hz及1 Hz,撥動單刀三擲開關,四位數碼管顯示的頻率分別為1231 Hz及1 Hz,如圖7.12.4和圖7.12.5所示,均符合課程設計題目要求。,圖7.12.3 顯示正弦波信號頻率值,圖7.12.

51、4 顯示方波信號頻率值,圖7.12.5 顯示三角波信號頻率值,7.12.2 波形發(fā)生器1. 設計題目利用51單片機設計一個簡易波形發(fā)生器,要求如下:(1) 可輸出鋸齒波、三角波、方波和正弦波四種波形;(2) 上述四種波形分別由開關S0S3進行切換;(3) 可由程序控制各種波形的頻率及幅值。,2. 設計過程本波形發(fā)生器采用AT89C51單片機實現,采用程序設計方法編程實現鋸齒波、三角波、方波和正弦波四種波形,再通過D/A轉化器DAC0832將數字信號轉換成模擬信號,最后經過運算放大器放大,由示波器顯示所需要的波形,各種波形頻率及幅值可由程序控制。其實訓圖如圖7.12.6所示,所用元件清單如表7.

52、12.2所示。,圖7.12.6 波形發(fā)生器課程設計實訓圖,在上述電路圖中,開關S0S3分別為四種波形的控制鍵,利用單片機P0口將8位數字量與數/模轉換芯片DAC0832連接,數/模轉換后經運算放大器OPAMP進行放大,最后在示波器的A通道顯示所需要的波形。圖中各器件的連接多采用網絡標號連接。,其程序代碼為:#include#define uchar unsigned char sbit ksaw=P10; /鋸齒波按鍵sbit ktran=P11; /三角波按鍵sbit ksquare=P12; /方波按鍵sbit ksin=P13; /正弦波按鍵void delay( );,uchar co

53、de tab128=64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,36,33,31,28,25,23,21,18,16,14,12

54、,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60;/正弦波數據,void delay( ) uchar i; for(i=0;i255;i+);void saw(void) /鋸齒波 uchar i; while(1) ,for(i=0;i255;i+) P0=i; if(ksaw=0) delay( ); if(ksaw=0) while(ksaw=0); break; ,void tran(void) /三角波 uchar

55、 i; while(1) for(i=0;i0;i-) P0=i; if(ktran=0),delay( ); if(ktran=0) while(ktran=0); break; void square(void) /方波, while(1) P0=0 x00; delay(); P0=0 xff; delay(); if(ksquare=0) delay( ); if(ksquare=0), while(ksquare=0); break; void sin( ) /正弦波 unsigned int i; while(1), if(+i=128)i=0; P0=tabi; if(ksin=

56、0) delay( ); if(ksin=0) while(ksin=0); break; ,void main(void) /主函數 if(ksaw=0) delay( ); if(ksaw=0) while(ksaw=0); saw(); ,if(ktran=0) delay( ); if(ktran=0) while(ktran=0); tran( ); if(ksquare=0) ,delay( ); if(ksquare=0) while(ksquare=0); square( ); if(ksin=0) delay();,if(ksin=0) while(ksin=0); sin( ); ,在KEIL軟件中輸入上述代碼,編譯后產生十六進制文件7-12-2.hex,雙擊AT89C51,將彈出如圖7.12.7所示的對話框。在圖7.12.7中添加十六進制文件7-12-2.hex,點擊“OK”即可。,圖7.12.7 添加十

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論