标题:
51单片机串口接收PC发送的数字显示到数码管程序求助
[打印本页]
作者:
安和聚聚子
时间:
2022-11-14 23:03
标题:
51单片机串口接收PC发送的数字显示到数码管程序求助
用的是普中开发板,
需求是用串口调试助 发送12345678 显示到数码管上
现在就是只有一位数码管显示,其他的都是空值
在此求大佬教一下
单片机源程序如下:
#include<reg51.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
unsigned char buffer[8];
u8 DisplayData[8];
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void delay(u16 i)
{
while(i--);
}
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第7位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
}
P0=smgduan[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void rs_init() //串口初始化,波特率设置2400
{
SCON=0x40;
PCON=0x00;
TMOD=0x20;
TL1=0xf4;//bs
TH1=0xf4;
TR1=1;
}
void main()
{
rs_init();
REN=1;
EA=1;
ES=1;
while(1){
DigDisplay();
}
}
void serial() interrupt 4
{
unsigned char i=0;
EA=0;
RI=0;
buffer[i]=smgduan[SBUF];
i++;
if(i==8);
i=0;
EA=1;
}
复制代码
作者:
lkc8210
时间:
2022-11-14 23:24
main()呢?while(1)呢?
作者:
yzwzfyz
时间:
2022-11-15 09:11
做8个变量:LED1,LED2......LED8。
先学会如何将这8个变量中的数,依序送到LED上显示。
而后再考虑串口接收数据。
这时,只要将收到的数字放到LED1,LED2......LED8中就可以了。
作者:
Longan.Wang
时间:
2022-11-15 09:17
通过贴出的代码看不出具体问题!!!!
作者:
安和聚聚子
时间:
2022-11-15 15:17
代码被吃掉了
作者:
安和聚聚子
时间:
2022-11-15 18:34
lkc8210 发表于 2022-11-14 23:24
main()呢?while(1)呢?
重新发了大佬
作者:
非凡科技
时间:
2022-11-15 19:03
EA不可以关闭这是总中断
作者:
非凡科技
时间:
2022-11-15 19:05
我说错了请斑竹删了
作者:
非凡科技
时间:
2022-11-15 19:07
你关闭了总中断,所以接收不到
作者:
非凡科技
时间:
2022-11-15 19:11
这是我经常用的 你改改就行
{
static u8 rx_step = 0; //接收中断函数里的步骤变量
static u8 array_cnt = 0; //接收缓存数组的下标
if (RI)
{
RI=0;
if (0 == rx_ok_flag) // 1代表已经完成接收了一串新数据,并且禁止接收其它新的数据
{
switch (rx_step)
{
case 0: //接头暗号的步骤。判断数据头的步骤。
rx_buffer[0] =SBUF; //直接读取刚接收完的一个字节的数据。
if (0x5a == rx_buffer[0]) //等于数据头0x5a,接头暗号吻合。
{
array_cnt = 1; //接收缓存的下标
rx_step = 1; //切换到下一个步骤,接收其它有效的数据
}
break;
case 1: //数据类型和长度
rx_buffer[array_cnt] = SBUF; //直接读取刚接收完的一个字节的数据。
array_cnt++; //每接收一个字节,数组下标都自加1,为接收下一个数据做准备
if (array_cnt >= 4)
{
rx_ok_flag = 1; //接收完成标志“置1”,通知主函数处理。
rx_step = 0; //及时切换回接头暗号的步骤
}
break;
}
}
}
}
作者:
Hephaestus
时间:
2022-11-15 20:05
串口中断里面的那个i必须是static的!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1