微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 串行口通信上位机发送0~65536间的数据,数码管上显示

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

时间:11-22 来源:互联网 点击:
一. 硬件设计


二. 软件设计

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


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top