/*
功能描述
通过串口向单片机发送一个信号,数码管显示该信号值
函数分析
数码管扫描
定时器设置定时
串口配置函数
*/
#include <reg52.h>
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char TORH=0;
unsigned char TORL=0;
unsigned char refresh=1;
unsigned char code ledchar[]={0XC0,0XF9,0XA4,0XB0,
0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};//数码管数值取值
unsigned char leddd[6]={0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char ledsuff=0;
void ledscan()
{
static unsigned char i=0;
P0=0xff;
P1=(P1&0XF8)|i;
P0=leddd[i];
i++;
if(i>2)
i=0;
}
void config(unsigned int ms)
{
unsigned long tmp;
tmp=11059200*ms/12000;
tmp=65536-tmp;
TORH=(unsigned char)(tmp>>8);
TORL=(unsigned char)(tmp);
TMOD&=0XF0;
TMOD|=0X01;
TH0=TORH;
TL0=TORL;
ET0=1;
TR0=1;
}
void configg(unsigned int baud)
{
SCON=0X50; //配置串口为模式1
TMOD&=0X0F;
TMOD|=0X20; //配置T1为模式2 即8位重装模式
TH1=256-(11059200/12/32)/baud;
TL1=TH1; //这里设置定时器1主要是用来作为波特率发生器,故不使能中断
ET1=0; //禁止T1中断
ES=1; //使能串口中断
TR1=1; //启动T1
}
int main()
{
//打开138
ADDR3=1;
ENLED=0;
EA=1;
config(2);//设置1ms中断
configg(9600);//设置9600波特率
while(1)
{
if(refresh) //接收数据
{
leddd[0]=ledchar[ledsuff&0x0f];
leddd[1]=ledchar[ledsuff>>4];
refresh=0;
}
}
}
void InterruptUART() interrupt 4
{
if(RI) //接收完毕
{
RI=0;
ledsuff=SBUF;
SBUF=ledsuff;
refresh=1;
}
if(TI) //发送完毕
{
TI=0;
}
}
void InterruptTimer() interrupt 1
{
TH0=TORH;
TL0=TORL;
ledscan();
}
一个串口通信实例
最新推荐文章于 2023-09-08 17:45:41 发布