標題:
51單片機串口接收PC發(fā)送的數(shù)字顯示到數(shù)碼管程序求助
[打印本頁]
作者:
安和聚聚子
時間:
2022-11-14 23:03
標題:
51單片機串口接收PC發(fā)送的數(shù)字顯示到數(shù)碼管程序求助
用的是普中開發(fā)板,
需求是用串口調(diào)試助 發(fā)送12345678 顯示到數(shù)碼管上
現(xiàn)在就是只有一位數(shù)碼管顯示,其他的都是空值
在此求大佬教一下
單片機源程序如下:
#include<reg51.h>
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
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) //位選,選擇點亮的數(shù)碼管,
{
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];//發(fā)送段碼
delay(100); //間隔一段時間掃描
P0=0x00;//消隱
}
}
void rs_init() //串口初始化,波特率設(shè)置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;
}
復(fù)制代碼
作者:
lkc8210
時間:
2022-11-14 23:24
main()呢?while(1)呢?
作者:
yzwzfyz
時間:
2022-11-15 09:11
做8個變量:LED1,LED2......LED8。
先學(xué)會如何將這8個變量中的數(shù),依序送到LED上顯示。
而后再考慮串口接收數(shù)據(jù)。
這時,只要將收到的數(shù)字放到LED1,LED2......LED8中就可以了。
作者:
Longan.Wang
時間:
2022-11-15 09:17
通過貼出的代碼看不出具體問題!。!
作者:
安和聚聚子
時間:
2022-11-15 15:17
代碼被吃掉了
作者:
安和聚聚子
時間:
2022-11-15 18:34
lkc8210 發(fā)表于 2022-11-14 23:24
main()呢?while(1)呢?
重新發(fā)了大佬
作者:
非凡科技
時間:
2022-11-15 19:03
EA不可以關(guān)閉這是總中斷
作者:
非凡科技
時間:
2022-11-15 19:05
我說錯了請斑竹刪了
作者:
非凡科技
時間:
2022-11-15 19:07
你關(guān)閉了總中斷,所以接收不到
作者:
非凡科技
時間:
2022-11-15 19:11
這是我經(jīng)常用的 你改改就行
{
static u8 rx_step = 0; //接收中斷函數(shù)里的步驟變量
static u8 array_cnt = 0; //接收緩存數(shù)組的下標
if (RI)
{
RI=0;
if (0 == rx_ok_flag) // 1代表已經(jīng)完成接收了一串新數(shù)據(jù),并且禁止接收其它新的數(shù)據(jù)
{
switch (rx_step)
{
case 0: //接頭暗號的步驟。判斷數(shù)據(jù)頭的步驟。
rx_buffer[0] =SBUF; //直接讀取剛接收完的一個字節(jié)的數(shù)據(jù)。
if (0x5a == rx_buffer[0]) //等于數(shù)據(jù)頭0x5a,接頭暗號吻合。
{
array_cnt = 1; //接收緩存的下標
rx_step = 1; //切換到下一個步驟,接收其它有效的數(shù)據(jù)
}
break;
case 1: //數(shù)據(jù)類型和長度
rx_buffer[array_cnt] = SBUF; //直接讀取剛接收完的一個字節(jié)的數(shù)據(jù)。
array_cnt++; //每接收一個字節(jié),數(shù)組下標都自加1,為接收下一個數(shù)據(jù)做準備
if (array_cnt >= 4)
{
rx_ok_flag = 1; //接收完成標志“置1”,通知主函數(shù)處理。
rx_step = 0; //及時切換回接頭暗號的步驟
}
break;
}
}
}
}
作者:
Hephaestus
時間:
2022-11-15 20:05
串口中斷里面的那個i必須是static的!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1