您的位置 首页 电路

串行口通讯上位机发送0~65536间的数据,数码管上显现

一硬件设计二软件设计1程序功能以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定2程

一. 硬件规划


二. 软件规划

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];

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/262289.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部