采用模式1(8位),定时器1采用模式2产生波特率,11.0592MHz晶体,9600波特率,PC机上运行的串口助手向单片机发送16进制数据,然后单片机将接收到的数据(16进制)返回串口助手。单片机用P2口连接的LED灯和P1和P0口连接的数码管显示接收到的数据。源程序如下:
//此程序首发:51hei单片机学习网http://www.51hei.com
#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; //清除发送标志
}