一.
硬件设计![](../img/eep/emb/emb-59213pgbtgbyjycr.jpg)
二. 软件设计
1. 程序功能
以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定.
2. 程序源码
#include
#define uchar unsigned char
#define uint unsigned int
#define BUF_LEN 2
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uint inbuf[BUF_LEN], dData;
uchar flag, count;
uchar wan, qian, bai, shi, ge;
//数码管编码表
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms);
void display(uchar,uchar,uchar,uchar,uchar);
void init();
void main()
{
init();
while (1)
{
if (flag == 1)
{
//flag手动清0,便于下次检测
flag = 0;
//关闭串口中断, 防止数据还未显示完成进入新的串口中断
ES = 0;
//将两个8位数据组合成16位数据
dData = (inbuf[1] < 8) | inbuf[0];
//获取万,千,百,十,个位
wan = dData / 10000;
qian = dData % 10000 / 1000;
bai = dData % 1000 / 100;
shi = dData % 100 / 10;
ge = dData % 10;
//发送万位,下同
SBUF = wan;
//检测是否发送完毕
while (!TI);
//TI手动清0
TI = 0;
SBUF = qian;
while (!TI);
TI = 0;
SBUF = bai;
while (!TI);
TI = 0;
SBUF = shi;
while (!TI);
TI = 0;
SBUF = ge;
while (!TI);
TI = 0;
//将存放两个8位数据的数组清空
inbuf[0] = 0;
inbuf[1] = 0;
//开启串口中断
ES = 1;
}
display(wan, qian, bai, shi, ge);
}
}
void init()
{
//设置定时器1为工作方式2
TMOD = 0x20;
//波特率选择9600bps,给计时器1初值
TH1 = 0xfd;
TL1 = 0xfd;
//启动定时器1
TR1 = 1;
//ET1 = 1; 这里不需要开启定时器1中断,因为定时器1工作在方式2,为8位自动重装方式,进入中断也无事可做
//设置串口工作方式1
//10位异步收发(8位数据)
SM0 = 0;
SM1 = 1;
//容许串口中断
REN = 1;
//开启总中断
EA = 1;
//开启串口中断
ES = 1;
}
//延时毫秒函数
void delayms(uint xms)
{
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
//共阳极数码管显示
void display(uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)
{
dula = 1;
P0=table[wan];
dula=0;
P0 = 0xff;
wela = 1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[qian];
dula=0;
P0 = 0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
dula=1;
P0=table[bai];
dula=0;
P0 = 0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(5);
dula=1;
P0=table[shi];
dula=0;
P0 = 0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0 = 0xff;
wela=1;
P0=0xef;
wela=0;
delayms(5);
}
//串口中断
void ser() interrupt 4
{
//定义uchar类型数据,便于接受8位数据
uchar ch;
//查询中断是否发生
if (RI)
{
//RI手动清0
RI = 0;
//数组索引递增
count++;
//获取串口中8位数据
ch = SBUF;
//保存数据到数据中
inbuf[count - 1] = ch;
if (count == 2)
{
//数据索引清0
count = 0;
//将标志位flag置1, 以方便在主程序中查询判断是否已经收到数据
flag = 1;
}
}
}
3. 程序小结
a. 发送数据时,需要在"多字串发送区"填入你需要发送的字符, 比如填入1: 0(hex),2: 1(hex),则发送00001
注意,程序要求先发送低位数据,再发送高位数据
b. 如果需要先发送高位数据,再发送低位数据, 则需要将主函数中的dData = (inbuf[1] < 8) | inbuf[0];
换成dData = (inbuf[0] < 8) | inbuf[1];