基于51单片机的串口通信实验

/**************************************************************************************
*                    串口通信实验  *
实现现象:通过串口向单片机发送 10 进制数字,将数字 16 进制显示在数码管上。
注意事项:10进制数字范围为0000~9999 ,且发送时必须选用HEX发送  
***************************************************************************************/


#include "reg52.h"  //此文件中定义了单片机的一些特殊功能寄存器


typedef unsigned int u16;  //对数据类型进行声明定义
typedef unsigned char u8;


sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


u16 shu,shu1,shu2;
u8 a1,a2,b1,b2,num;


u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值


/*******************************************************************************
* 函 数 名         : delay
* 函数功能   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}


/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=smgduan[shu%4096%256%16];delay(100);P0=0x00; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0;P0=smgduan[shu%4096%256/16];delay(100);P0=0x00; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0;P0=smgduan[shu%4096/256];delay(100);P0=0x00; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0;P0=smgduan[shu/4096];delay(100);P0=0x00; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1;P0=smgduan[6];delay(100);P0=0x00; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1;P0=smgduan[1];delay(100);P0=0x00; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1;P0=smgduan[0];delay(100);P0=0x00; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1;P0=smgduan[0];delay(100);P0=0x00; break;//显示第7位
}
}
}


/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能 :设置串口
* 输入           : 无
* 输出         : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1;    //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能 : 主函数
* 输    入       : 无
* 输    出     : 无
*******************************************************************************/
void main()
{
UsartInit();        // 串口初始化
while(1)
{
   DigDisplay();   //  数码管显示函数
}
}


/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
* 输入           : 无
* 输出         : 无
*******************************************************************************/
void Usart() interrupt 4
{
num++;
if(num==1)
{
    a1=SBUF;
RI=0;
b1=a1;
shu1=b1/16*1000+b1%16*100;
}
if(num==2)
{
    a2=SBUF;
b2=(a1<<8)|a2;
RI=0;
num=0;
shu2=b2/16*10+b2%16;
}
shu=shu1+shu2;
}

猜你喜欢

转载自blog.csdn.net/Cheetah2/article/details/80172760