一个串口通信实例

/*
功能描述
通过串口向单片机发送一个信号,数码管显示该信号值
函数分析
数码管扫描
定时器设置定时
串口配置函数
*/
#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();
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值