久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2709|回復: 12
打印 上一主題 下一主題
收起左側

串口接受0~65536數字,然后再在數碼管上顯示出來程序有點問題,麻煩大神幫忙改改

[復制鏈接]
跳轉到指定樓層
樓主
ID:225054 發表于 2017-10-13 07:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define BUF_LEN 2
sbit dula = P2^6;
sbit wela = P2^7;
uint table1[BUF_LEN],temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar bai,shi,ge,flag,num;//,num1;
uint temp;
void delay(uint xm)
{
uint j,i;
for(i=xm;i>0;i--)
  for(j=110;j>0;j--);
}
void display(uchar,uchar,uchar);
void init(void);
void main(void)
{
init();
while(1)
{
  
display( bai, shi, ge);
  if(flag==1)
  {
  temp=(((uchar)table1[1])<<8)|table[0];//為什么這樣合并后回事亂碼?
   flag=0;
  }
}
}
void init(void)
{
TMOD=0X20;
TH1=0xfd;
TL1=0Xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
num=0;

}
void ser() interrupt 4
{
RI=0;
num++;
if(num==1)
table1[num]=SBUF;
if(num==2)
{
table1[num]=SBUF;
num=0;
flag=1;
}
}//怎么樣才能接受兩個八位數據然后在合并成一個16位呢?

void display(uchar bai,uchar shi,uchar ge)
{
  
  
    bai=temp/100;
    shi=temp%100/10;
    ge=temp%10;
  
  wela=1;
  P0=0Xfe;
  wela=0;
  dula=1;
  P0=table[bai];
  dula=0;
  P0=0xff;
  delay(1);
  


    wela=1;
  P0=0Xfd;
  wela=0;
  dula=1;
  P0=table[shi];
  dula=0;
  P0=0xff;
  delay(1);


  wela=1;
  P0=0Xfb;
  wela=0;
  dula=1;
  P0=table[ge];
  dula=0;
  P0=0xff;
  delay(1);

}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:225054 發表于 2017-10-13 13:21 來自手機 | 只看該作者
沒人幫忙看看嗎?
回復

使用道具 舉報

板凳
ID:225054 發表于 2017-10-13 22:38 來自手機 | 只看該作者
w322405 發表于 2017-10-13 13:21
沒人幫忙看看嗎?

高手呢?
回復

使用道具 舉報

地板
ID:123289 發表于 2017-10-14 19:30 | 只看該作者
一步步調試,看哪一步不是你所設想的。
回復

使用道具 舉報

5#
ID:126608 發表于 2017-10-15 21:19 | 只看該作者
為什么段碼和位碼都在p0口,可是別的程序都在兩個口。
回復

使用道具 舉報

6#
ID:225054 發表于 2017-10-15 23:30 來自手機 | 只看該作者
1123212143255 發表于 2017-10-15 21:19
為什么段碼和位碼都在p0口,可是別的程序都在兩個口。

使用的是郭天祥的板子,數碼管是通過兩個鎖存器和單片機連接的,位選和段選公用P0口的
回復

使用道具 舉報

7#
ID:213173 發表于 2017-10-16 15:02 | 只看該作者
1.你定義緩存數組為2,可你在串口中斷中用了if(num==2) table1[num]=SBUF;是不存在的,只有table1[0]和table1[1]。
2.在合并數據時table1[0]和table1[1]都要強制轉換數據類型,
3.在顯示程序中16位數據最大0xffff=65535,需要5位數碼管才能完整顯示。
這是在你的程序基礎修改過的程序,先發送低4位,后發送高4位。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//#define BUF_LEN 2
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar data table1[2];
uchar wan,qian,bai,shi,ge;
uint temp=0;
bit num,flag=0;
void display();
void init();

void delay(uint xm)
{
        uint j,i;
        for(i=xm;i>0;i--)
          for(j=110;j>0;j--);
}

void main(void)
{
        init();
        while(1)
        {  
                if(flag==1)
                {
                        flag=0;
                        temp=(uint)(table1[1]<<8)|(uint)(table1[0]);
//                        temp=(((uchar)table1[1])<<8)|table[0];//為什么這樣合并后回事亂碼?
                }
                wan  = temp/10000;                // 萬位
                qian = temp%10000/1000;                // 千位
                bai  = temp%1000/100;                        // 百位
                shi  = temp%100/10;                                // 十位
                ge   = temp%10;                                //個位
                display();
        }
}

void init(void)
{
        TMOD=0X20;
        TH1=0xfd;
        TL1=0Xfd;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        num=1;//初始為1
}
void ser() interrupt 4
{
        RI=0;
        num=~num;//初始為1
        table1[num]=SBUF;//低4位存table1[0],高4位存table1[1],
        if(num==1)
                flag=1;
}//怎么樣才能接受兩個八位數據然后在合并成一個16位呢?

void display()//16位數據最大0xffff=65535,需要5位十進制才能顯示
{
        wela=1;
        P0=0Xfe;
        wela=0;
        dula=1;
        P0=table[wan];
        dula=0;
        P0=0xff;
        delay(1);
       
        wela=1;
        P0=0Xfd;
        wela=0;
        dula=1;
        P0=table[qian];
        dula=0;
        P0=0xff;
        delay(1);
       
        wela=1;
        P0=0Xfb;
        wela=0;
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        delay(1);

        wela=1;
        P0=0Xf7;
        wela=0;
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        delay(1);
       
        wela=1;
        P0=0Xef;
        wela=0;
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        delay(1);
}



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:237942 發表于 2017-10-16 15:18 | 只看該作者
位選信號定義的有問題
回復

使用道具 舉報

9#
ID:237942 發表于 2017-10-16 15:18 | 只看該作者
位選信號定義有問題
回復

使用道具 舉報

10#
ID:225054 發表于 2017-10-17 07:24 來自手機 | 只看該作者
GG276192978 發表于 2017-10-16 15:18
位選信號定義有問題

沒錯啊,我自己定義一個數可以正常顯示
回復

使用道具 舉報

11#
ID:225054 發表于 2017-10-18 16:05 來自手機 | 只看該作者
wulin 發表于 2017-10-16 15:02
1.你定義緩存數組為2,可你在串口中斷中用了if(num==2) table1[num]=SBUF;是不存在的,只有table1[0]和tabl ...

謝謝啊
回復

使用道具 舉報

12#
ID:225054 發表于 2017-10-18 16:06 來自手機 | 只看該作者
wulin 發表于 2017-10-16 15:02
1.你定義緩存數組為2,可你在串口中斷中用了if(num==2) table1[num]=SBUF;是不存在的,只有table1[0]和tabl ...

如何確定接收的是高位和低位啊,這里我還是有點糊涂,
回復

使用道具 舉報

13#
ID:213173 發表于 2017-10-19 13:35 | 只看該作者
本帖最后由 wulin 于 2017-10-19 16:58 編輯
w322405 發表于 2017-10-18 16:06
如何確定接收的是高位和低位啊,這里我還是有點糊涂,

你隨便發兩個不一樣的HEX數,例如:令低8位為0x01、令高8位為0x02,得到513就說明順序對了,如果得到258說明順序錯了。只要把發送順序、接收保存順序、合并轉換順序三者之一對調一下就行了。順便說明一下,上面回復的《2.在合并數據時table1[0]和table1[1]都要強制轉換數據類型》不完全正確,不同數據類型的運算中系統會自動轉換數據類型再運算,所以這一句可以改為     temp=table1[1]<<8|table1[0];   你原來這樣寫temp=(((uchar)table1[1])<<8)|table[0];是會出錯的。所以:
正確   temp=table1[1]<<8|table1[0];
正確   temp=(uint)(table1[1]<<8)|(uint)(table1[0]);
錯誤          temp=(((uchar)table1[1])<<8)|table[0];

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 51ⅴ精品国产91久久久久久 | 国产91精品久久久久久久网曝门 | 国产在线精品一区二区三区 | 99爱在线 | 一区二区三区四区在线视频 | 91视频在线看 | 成人免费黄色 | 精品久久久一区二区 | 一区二区三区av | 亚洲一区二区在线视频 | 欧美一区二区三区视频 | 欧洲尺码日本国产精品 | 亚洲一区二区国产 | 99久久久无码国产精品 | 国偷自产av一区二区三区 | 伊人网站视频 | 久久中文一区二区 | 国产大学生情侣呻吟视频 | 韩日av在线| 精品欧美乱码久久久久久 | 亚洲国产精品久久 | 午夜小电影 | 日韩综合在线 | 亚州精品天堂中文字幕 | 久久激情视频 | 久久精品亚洲国产奇米99 | 国产农村妇女毛片精品久久麻豆 | av手机在线免费观看 | 亚洲欧美日韩精品久久亚洲区 | 特黄特色大片免费视频观看 | 国产在线a| 成年无码av片在线 | 美女在线一区二区 | 中文字幕一区二区视频 | 中文字幕在线免费观看 | 一级片在线观看 | 夜夜骚 | 成人高清视频在线观看 | 日韩伦理一区二区 | 国产精品99久久久久久www | 色婷婷激情综合 |