模块:数码管 串口通信
功能:计算机以十六进制发送数据 单片机接收后 以十进制在数码管上显示,并且将数据加一再发送到计算机
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint num; // 申明全局变量
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
//共阴数码管段选表0-9
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
void timer () //定时器1 的初始化函数
{
EA = 1; //总中断开关
ET0 = 1; // 定时器1中断开关
TR0 = 1;
REN = 1;//允许串口接收
TMOD |= 0x01; // 定时器1 16模式
TH0 = 0xee;
TL0 = 0x00; // 定时50ms
}
void UART () // 串口通信中断
{
EA = 1; //总中断开关
ES = 1; //串口中断开关
SM0 = 0; SM1 = 1;
REN = 1; //允许串口接收
TR1 = 1;
TMOD |= 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
}
void display(uchar i)
{
static uchar wei;
P0 = 0XFF;//清除断码
WE = 1;//打开位选锁存器
P0 = SMGwei[wei];
WE = 0;//锁存位选数据
switch(wei)
{
case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;
case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;
}
wei++;
if(wei == 3)
wei = 0;
}
void main ()
{
timer ();
UART ();
while(1);
}
void time () interrupt 1 // 定时中断函数
{
TH0 = 0xee;
TL0 = 0x00; // 定时50ms
display(num); //数码管显示
}
void UART1 () interrupt 4
{
if(RI)
{
uint temp;
RI = 0;
num = SBUF; // 接收数据
temp = num;
temp++;
SBUF = temp; // 发送数据
}
if(TI)
TI = 0;
}