串口传输数据的一种简单利用。其中涉及了数码管,选择器等常规外设。通过串口等配置,用电脑通过串口,向板子发送16进制的数据。在通过简单的计算把所要传输的数据显示出来。
通过这个例程还可以和更多的外设相连接。例如通过串口设置一个参考值。与AD/DA,超声波,温度传感器,PWM等等联系起来。只要知道,串口是如何传输,传输后的数据是什么格式的。简单的利用分析运算。就可以实现很多功能。
如下是自己的代码,用电脑传输两位的数据。可请大家批评指正:
#include <reg52.h>
#include <intrins.h>
//-------------系统定义----------------//
sfr AUXR = 0x8e;
typedef unsigned char u8;
typedef unsigned int u16;
u8 code SMG_duanma[18]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
0xbf,0x7f
};
u8 yi,er,san,si,wu,liu,qi,ba;
u8 Rdat;
//--------------函数声明---------------//
void SelectHC573(u8 channel); //HC573锁存器函数
void sys_init(); //系统初始化函数(关闭LED,蜂鸣器等函数)
void Display_bit(u8 pos,u8 value);//单个数码管显示函数
void display_all(); //整体数码管显示函数
void delay(u16 t); //一般延时函数
void sendbyte(u8 dat); //串口发送函数
void uart_init(); //串口初始化
//--------------延时函数----------------//
void delay(u16 t)
{
while(t--);
}
//-------------系统初始化---------------//
void SelectHC573(u8 channel)
{
switch(channel)
{
case 4:
P2=P2&0x1f|0x80;
break;
case 5:
P2=P2&0x1f|0xa0;
break;
case 6:
P2=P2&0x1f|0xc0;
break;
case 7:
P2=P2&0x1f|0xe0;
break;
case 0:
P2=P2&0x1f|0x00;
break;
}
}
void sys_init()
{
SelectHC573(4);
P0=0xff;
SelectHC573(0);
SelectHC573(5);
P0=0x00;
SelectHC573(0);
SelectHC573(7);
P0=0xff;
SelectHC573(0);
}
//--------------数码管--------------//
void Display_bit(u8 pos,u8 value)
{
SelectHC573(6);
P0=0x01 << pos;
SelectHC573(0);
SelectHC573(7);
P0=value;
SelectHC573(0);
}
void display_all()
{
Display_bit(0,yi);
delay(300);Display_bit(0,0xff);
Display_bit(1,er);
delay(300);Display_bit(1,0xff);
Display_bit(2,san);
delay(300);Display_bit(2,0xff);
Display_bit(3,si);
delay(300);Display_bit(3,0xff);
Display_bit(4,wu);
delay(300);Display_bit(4,0xff);
Display_bit(5,liu);
delay(300);Display_bit(5,0xff);
Display_bit(6,qi);
delay(300);Display_bit(6,0xff);
Display_bit(7,ba);
delay(300);Display_bit(7,0xff);
}
//------------串口通信模块函数--------------//
void uart_init()
{
SCON = 0x50;
AUXR &= 0xBF;
AUXR &= 0xFE;
TMOD &= 0x0F;
TL1 = 0xE8;
TH1 = 0xFF;
EA = 1;
ES = 1;
ET1 = 0;
TR1 = 1;
}
void sendbyte(u8 dat)
{
SBUF = dat;
while(TI == 0);
TI=0;
}
void ServiceUart() interrupt 4
{
if(RI==1)
{
Rdat = SBUF;
RI = 0;
sendbyte(Rdat);
}
}
//--------------主函数--------------//
void main()
{
sys_init();
uart_init();
while(1)
{
yi=er=san=si=wu=liu=0xff;
qi = SMG_duanma[Rdat/16];
ba = SMG_duanma[Rdat%16];
display_all();
}
}
如果还有任何不解的地方可以评论,私信。