STC89C52RC單片機、LED燈或?qū)嶒炏洹?/div>
4 實驗步驟- 在Keil開發(fā)環(huán)境下建立一個工程。
- 程序的編寫。
- 程序下載調(diào)試(可先進行仿真)。
5 附注51單片機串行口的SBUF有兩個:接收SBUF和發(fā)送SBUF,二者在物理結(jié)構(gòu)上是獨立的,單片機用它們來接收和發(fā)送數(shù)據(jù)。串行通訊的波特率隨串行口工作方式選擇的不同而不同,它除了與系統(tǒng)的振蕩頻率f,電源控制寄存器PCON的SMOD位有關(guān)外,還與定時器T1的設(shè)置有關(guān)。
1、在工作方式0時,波特率固定不變,僅與系統(tǒng)振蕩頻率有關(guān),其大小為f/12。
2、在工作方式2時,波特率也只固定為兩種情況:
當(dāng)SMOD=1時, 波特率=f/32
當(dāng)SMOD=0時, 波特率=f/64
3、在工作方式1和3時,波特率是可變的:
當(dāng)SMOD=1時, 波特率=定時器T1的溢出率/16
當(dāng)SMOD=0時, 波特率=定時器T1的溢出率/32
其中,定時器T1的溢出率=f/(12*(256-N)),N為T1的定時時間常數(shù)。
在實際應(yīng)用中,往往是給定通訊波特率,而后去確定時間常數(shù)。例如:f=6.144MHZ,波特率等于1200,SMOD=0時,則1200=6144000/(12*32*(256-N)),計算得N=F2H。
本例程中設(shè)置串行口工作于方式1,SMOD=0,波特率為1200。
6 附注例程中斷方式C代碼:
#include
#define unchar unsigned char
#define unint unsigned int
sbit Key = P1^1;
sbit Led = P1^0;
void uartsend(unchar dat);
void Uartsend(unchar k) //串口發(fā)送子函數(shù)
{
SBUF = k; //發(fā)送數(shù)據(jù)
while(!TI); //待待發(fā)送結(jié)束
}
void main()
{
unchar tmp;
TMOD = 0x20; //定時器1工作方式2
TH1 = 0xfa;
TL1 = 0xfa; //裝入定時器初值11.0592M晶振,波特率4800
PCON = 0; //波特率不倍增
ET1 = 0; //定時器1中斷允許
EA = 1; //總中斷允許
ES = 1; //串口中斷允許
TR1 = 1; //定時器0開始計時
SCON = 0x50; //串口工作方工1,準(zhǔn)備接收
while(1) //死循環(huán)
{
if(Key) //判斷是否有鍵按下
{
Uartsend(0xaa); //用串口發(fā)送0xaa
while(Key); //等待鍵釋放
}
else
{
Uartsend(0x55);
while(!Key);
}
}
}
void uart() interrupt 4
{
unchar temp;
if(RI) //判斷是否為接收中斷
{
temp = SBUF; //讀數(shù)據(jù)
switch(temp) //判斷數(shù)據(jù)
{
case 0x55:Led = 1;break;
case 0xaa:Led = 0;break;
default:break;
}
RI = 0; //清除中斷標(biāo)志
}
TI = 0; //清除中斷標(biāo)志
}
對應(yīng)匯編代碼:
KEY EQU P1.1
LED EQU P1.0
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP UART
ORG 0100H
MAIN: MOV TMOD,#020H
MOV TH1,#0FAH
MOV TL1,#0FAH
MOV PCON,#00H
CLR ET1
SETB EA
SETB ES
SETB TR1
MOV SCON,#050H
KEYLED: JNB KEY,OFFL
MOV SBUF,#0AAH
KEY0: JB KEY,$
OFFL: MOV SBUF,#055H
KEY1: JNB KEY,$
SJMP KEYLED
UART: JNB RI,RRET
CLR RI
MOV R7,SBUF
CJNE R7,#0AAH,OFFLED
CLR LED
SJMP RRET
OFFLED: SETB LED
RRET: CLR TI
RETI
END
查詢方式C代碼:
#include
#define unchar unsigned char
#define unint unsigned int
sbit Key = P1^1;
sbit Led = P1^0;
void uartsend(unchar dat) //串口發(fā)送子函數(shù)
{
SBUF = dat; //發(fā)送數(shù)據(jù)
while(!TI); //待待發(fā)送結(jié)束
TI = 0; //清除中斷標(biāo)志
}
void uartrec() //串口接收數(shù)據(jù)子函數(shù)
{
unchar temp;
if(RI)
{
temp = SBUF; //讀數(shù)據(jù)
switch(temp) //判斷數(shù)據(jù)
{
case 0x55:Led = 1;break;
case 0xaa:Led = 0;break;
default:break;
}
RI = 0; //清除中斷標(biāo)志
}
}
void main()
{
TMOD = 0x20; //定時器1工作方式2
TH1 = 0xfa;
TL1 = 0xfa; //裝入定時器初值11.0592M晶振,波特率4800
PCON = 0; //波特率不倍增
ET1 = 0; //定時器0中斷允許
EA = 0; //總中斷關(guān)閉
ES = 1; //串口中斷允許
TR1 = 1; //定時器0開始計時
SCON = 0x50; //串口工作方工1,準(zhǔn)備接收
while(1)
{
if(Key) //判斷鍵是否按下
{
uartsend(0xaa);
while(Key)uartrec(); //等鍵釋放并接收數(shù)據(jù)
}
uartsend(0x55);
while(!Key)uartrec();
}
}
對應(yīng)匯編代碼:
KEY EQU P1.1
LED EQU P1.0
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV TMOD,#020H
MOV TH1,#0FAH
MOV TL1,#0FAH
MOV PCON,#00H
CLR ET1
CLR EA
SETB ES
SETB TR1
MOV SCON,#050H
KEYLED: JNB KEY,OFFL
MOV SBUF,#0AAH
JNB TI,$
CLR TI
SJMP KEY1
OFFL: MOV SBUF,#055H
JNB TI,$
CLR TI
KEY0: JB KEY,KEYLED
LCALL UARTRI
SJMP KEY0
KEY1: JNB KEY,OFFL
LCALL UARTRI
SJMP KEY1
UARTRI: JNB RI,RETT
CLR RI
MOV R7,SBUF
CJNE R7,#0AAH,OFFLED
CLR LED
RETT: RET
OFFLED: SETB LED
SJMP RETT
END
附實驗仿真電路:
2.006.jpg (62.79 KB, 下載次數(shù): 108)
下載附件
2016-5-16 03:13 上傳
注:MCU1的TX接MCU2的RX,MCU1的RX接MCU2的TX。
作者: WFX777888
時間: 2016-5-17 12:08
謝謝分享資料
作者: 627654530@qq.co
時間: 2016-5-18 10:09
按鍵控制LED燈的亮滅,我們可以采用外部中斷的方式(實驗四會講),獨立按鍵的接法希望大家注意,直接接地,在沒有按鍵的情況下IO口為高電平(注:因為本實驗中按鍵接P1口,內(nèi)部集成上拉電阻。若使用P0口作為通用IO口使用時必須外接500Ω左右的上拉電阻。見實驗四附圖2),當(dāng)有按鍵按下時IO口為低電平。
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |