采用模式1(8位),定時(shí)器1采用模式2產(chǎn)生波特率,11.0592MHz晶體,9600波特率,PC機(jī)上運(yùn)行的串口助手向單片機(jī)發(fā)送16進(jìn)制數(shù)據(jù),然后單片機(jī)將接收到的數(shù)據(jù)(16進(jìn)制)返回串口助手。單片機(jī)用P2口連接的LED燈和P1和P0口連接的數(shù)碼管顯示接收到的數(shù)據(jù)。源程序如下:
#include "reg_c51.h"
unsigned char uart_data;
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0x08,0x03,0x46,0x21,0x06,0x0e}; //十六進(jìn)制-7段譯碼表
unsigned char ng, ns, temp; //ng是接收到數(shù)據(jù)的低4位,ns是高四位,temp是暫存接收數(shù)據(jù)的變量
void main (void)
{SCON = 0x50; //8位串行口模式1,允許接收,REN=1
TMOD = TMOD | 0x20 ; //定時(shí)器1,在模式2
TH1 = 0xFD; //波特率為9600,晶體頻率為 11.059MHz
TL1 = 0xFD; //波特率為9600,晶體頻率為11.059MHz
ES = 1; //使能串行口中斷
EA = 1; //使能全局中斷
TR1 = 1; //啟動(dòng)定時(shí)器
while(1); //無(wú)限循環(huán)
}
void serial_IT(void) interrupt 4 //串口中斷服務(wù)程序
{if (RI == 1) //如果是接收中斷,則執(zhí)行如下語(yǔ)句
{
RI = 0; //清除接收中斷標(biāo)志
uart_data = SBUF; //接收數(shù)據(jù)
SBUF = uart_data //將接收的數(shù)據(jù)發(fā)送
temp=uart_data; //暫存接收到的數(shù)據(jù)
P2=~ temp; //將接收的數(shù)據(jù)求反后送P2口,用LED燈顯示
ng=temp & 0x0f; //取低4位,ng是接收到數(shù)據(jù)的低4位
ns=temp>>4; //將高4位右移4位
ns &=0x0f; //取低4位。ns是接收到數(shù)據(jù)的高4位
P0=table[ng]; //將低4位送P0口,用數(shù)碼管顯示低4位
P1=table[ns]; //將高4位送P1口,用數(shù)碼管顯示高4位
}
else TI = 0; //清除發(fā)送標(biāo)志
}
<!--v:3.2-->