采用模式1(8位),定時器1采用模式2產生波特率,11.0592MHz晶體,9600波特率,PC機上運行的串口助手向單片機發送16進制數據,然后單片機將接收到的數據(16進制)返回串口助手。單片機用P2口連接的LED燈和P1和P0口連接的數碼管顯示接收到的數據。源程序如下:
//此程序首發:51hei單片機學習網http://www.zg4o1577.cn
#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}; //十六進制-7段譯碼表
unsigned char ng, ns, temp; //ng是接收到數據的低4位,ns是高四位,temp是暫存接收數據的變量
void main (void)
{SCON = 0x50; //8位串行口模式1,允許接收,REN=1
TMOD = TMOD | 0x20 ; //定時器1,在模式2
TH1 = 0xFD; //波特率為9600,晶體頻率為 11.059MHz
TL1 = 0xFD; //波特率為9600,晶體頻率為11.059MHz
ES = 1; //使能串行口中斷
EA = 1; //使能全局中斷
TR1 = 1; //啟動定時器
while(1); //無限循環
}
void serial_IT(void) interrupt 4 //串口中斷服務程序
{if (RI == 1) //如果是接收中斷,則執行如下語句
{
RI = 0; //清除接收中斷標志
uart_data = SBUF; //接收數據
SBUF = uart_data //將接收的數據發送
temp=uart_data; //暫存接收到的數據
P2=~ temp; //將接收的數據求反后送P2口,用LED燈顯示
ng=temp & 0x0f; //取低4位,ng是接收到數據的低4位
ns=temp>>4; //將高4位右移4位
ns &=0x0f; //取低4位。ns是接收到數據的高4位
P0=table[ng]; //將低4位送P0口,用數碼管顯示低4位
P1=table[ns]; //將高4位送P1口,用數碼管顯示高4位
}
else TI = 0; //清除發送標志
}
#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}; //十六進制-7段譯碼表
unsigned char ng, ns, temp; //ng是接收到數據的低4位,ns是高四位,temp是暫存接收數據的變量
void main (void)
{SCON = 0x50; //8位串行口模式1,允許接收,REN=1
TMOD = TMOD | 0x20 ; //定時器1,在模式2
TH1 = 0xFD; //波特率為9600,晶體頻率為 11.059MHz
TL1 = 0xFD; //波特率為9600,晶體頻率為11.059MHz
ES = 1; //使能串行口中斷
EA = 1; //使能全局中斷
TR1 = 1; //啟動定時器
while(1); //無限循環
}
void serial_IT(void) interrupt 4 //串口中斷服務程序
{if (RI == 1) //如果是接收中斷,則執行如下語句
{
RI = 0; //清除接收中斷標志
uart_data = SBUF; //接收數據
SBUF = uart_data //將接收的數據發送
temp=uart_data; //暫存接收到的數據
P2=~ temp; //將接收的數據求反后送P2口,用LED燈顯示
ng=temp & 0x0f; //取低4位,ng是接收到數據的低4位
ns=temp>>4; //將高4位右移4位
ns &=0x0f; //取低4位。ns是接收到數據的高4位
P0=table[ng]; //將低4位送P0口,用數碼管顯示低4位
P1=table[ns]; //將高4位送P1口,用數碼管顯示高4位
}
else TI = 0; //清除發送標志
}