标题:
单片机串口如何输入两位数字进行判断?
[打印本页]
作者:
paradox666
时间:
2020-3-26 23:08
标题:
单片机串口如何输入两位数字进行判断?
我使用STC89C52单片机,晶振为12MHz,串口通讯,工作方式为1,SMOD=1,波特率为4800,当接收到一位数字的时候,在一个数码管上显示这个数字,如果不是一位数字,则在数码管上显示一个“点”符号。我的代码实现了从串口输入0-9时,再数码管上显示对应数字,但是当输入两位数时,由于char是一位字节的限制,只能显示第一位数字,要如何修改我的代码才能进行判断后当从串口输入两位数字时在数码管上显示点?
求论坛里各位大神帮助!
单片机源程序如下:
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2; //define the input pins for 74HC138
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code display_digit[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f};
u8 saved_data[8];
void delay(u16 i)
{
while(i--);
}
u8 char2hex(u8 chr)
{
if(chr>='0'&&chr<='9')
return (chr-'0');
else
return ('a');
}
void display()
{
u8 counter;
for(counter=0; counter<8; counter++)
{
switch(counter)
{
case 0:
LSA = 0; LSB = 0; LSC = 0;
break; // exit from switch loop
case 1:
LSA = 1; LSB = 0; LSC = 0;
break;
case 2:
LSA = 0; LSB = 1; LSC = 0;
break;
case 3:
LSA = 1; LSB = 1; LSC = 0;
break;
case 4:
LSA = 0; LSB = 0; LSC = 1;
break;
case 5:
LSA = 1; LSB = 0; LSC = 1;
break;
case 6:
LSA = 0; LSB = 1; LSC = 1;
break;
case 7:
LSA = 1; LSB = 1; LSC = 1;
break;
}
P0 = saved_data[counter];
delay(100);
P0 = 0x00; // erase shoadows
}
}
void serial_init()
{
TMOD = 0x20;
TH1 = 0xf3;
TL1 = 0xf3;
PCON = 0x80;
TR1 = 1;
SCON = 0x50;
ES = 1;
EA = 1;
}
void main()
{
serial_init();
while(1);
}
void serial() interrupt 4
{
u8 received_data;
if(RI==1)
{
received_data = SBUF;
RI = 0;
SBUF = received_data;
while(!TI);
received_data = char2hex(received_data);
if (received_data!='a')
{
saved_data[0] = 0x00;
saved_data[1] = 0x00;
saved_data[2] = 0x00;
saved_data[3] = 0x00;
saved_data[4] = 0x00;
saved_data[5] = 0x00;
saved_data[6] = 0x00;
saved_data[7] = display_digit[received_data];
}
else
{
saved_data[0] = 0x80;
saved_data[1] = 0x80;
saved_data[2] = 0x80;
saved_data[3] = 0x80;
saved_data[4] = 0x80;
saved_data[5] = 0x80;
saved_data[6] = 0x80;
saved_data[7] = 0x80;
}
}
display();
}
复制代码
作者:
aking991
时间:
2020-3-27 08:33
开串口接收缓冲区,先把接收数据缓存下来,接收完后再去判断接收到的数据,根据数据再去判断要用还是不用,取有用的信息给显示就可以了
作者:
黎明初至
时间:
2020-3-27 09:03
数字都显示的原理是利用余晖动态显示,实际是不同位的数字来回切换,你的代码中只有接收中断进行过接收数字显示。即每位只显示1次100ms,之后停留在最新的那条中。当然显示不了全部的内容。
终端中不要进行太多内容操作。设个标志,外面查询标志去做处理。
作者:
paradox666
时间:
2020-3-27 14:47
黎明初至 发表于 2020-3-27 09:03
数字都显示的原理是利用余晖动态显示,实际是不同位的数字来回切换,你的代码中只有接收中断进行过接收数字 ...
谢谢回复,但是我不是想显示两位数字,我是想在输入两位数字的时候数码管显示一个点(即'.')。但是数码管上显示的都是数字。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1