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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于數碼管與單片機串口的問題,已經想了好幾天了,求助各位大神分析

[復制鏈接]
跳轉到指定樓層
樓主
ID:878202 發表于 2021-1-16 19:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
目前數碼管剛燒入后顯示255,輸入一個數字后顯示最后一個數字的ascll碼,想讓數碼管顯示輸入的數字,求教。

單片機源程序如下:
#include<reg52.h>//中斷法
typedef unsigned int u16;         
typedef unsigned char u8;
u8 a=0;
sbit LSA=P2^2;//控制數碼管顯示位數
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)//延時函數時間不精準
{
        while(i--);        
}
void DigDisplay(u16 num)//數碼管顯示函數
{
        u16 i;
        if(num<10){
                LSA=1;LSB=1;LSC=1;
          P0=smgduan[num];
                 }
        if(num>9&&num<100){
        for(i=0;i<2;i++)
        {
                switch(i)
                {
                   case(0):
                                LSA=1;LSB=1;LSC=1; break;
                        case(1):
                                LSA=0;LSB=1;LSC=1; break;
                }        if(i==0){
                P0=smgduan[num/10];
                delay(100);        
                P0=0x00;}        
                if(i==1){
                P0=smgduan[num%10];
                delay(100);        
                P0=0x00;}
        }}
        if(num>99&&num<1000)
        for(i=0;i<3;i++)
        {
                switch(i)
                {
                   case(0):
                                LSA=1;LSB=1;LSC=1; break;
                        case(1):
                                LSA=0;LSB=1;LSC=1; break;
                        case(2):
                                LSA=1;LSB=0;LSC=1; break;
                }if(i==0){
                P0=smgduan[num/100];
                delay(100);        
                P0=0x00;}        
                if(i==1){
                P0=smgduan[num/10%10];
                delay(100);        
                P0=0x00;}        
                if(i==2){
                P0=smgduan[num%10];
                delay(100);        
                P0=0x00;}
        }
}


void main()
{
REN=1;//串口允許接受信息;
SCON=0X50;//SM0,SM1同時控制工作方式;
TMOD=0x20;//設置定時器1工作方式為2;
TR1=1;//打開定時器1;
TH1=0xFD;//儲存器,控制頻率,由傳輸頻率計算,
TL1=0xFD;//與以上共同決定傳輸頻率,信息先進入TH1,溢出的進入TL1;
EA=1;//中斷打開,EA總中斷,ES串口中斷;
ES=1;
while(1)DigDisplay(a);
}


void ser() interrupt 4//中斷函數,一共有五個,標號4是第五個中斷函數,是串行口中斷函數
{ TH0=0xfc;
        TL0=0x18;
        RI=0;//RI串口接收中斷申請標志位,數據接收到停止位時RI自動為1;任何標識符初始為0;
a=SBUF;
;


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

使用道具 舉報

沙發
ID:390416 發表于 2021-1-17 08:24 | 只看該作者
串口發送和接收代碼分享
第一個:http://www.zg4o1577.cn/bbs/dpj-201660-1.html
第二個:http://www.zg4o1577.cn/bbs/dpj-200927-1.html
回復

使用道具 舉報

板凳
ID:235200 發表于 2021-1-17 09:02 | 只看該作者
需要改寫void DigDisplay(u16 num)//數碼管顯示函數
具體改寫的方法有多種,可以把接收的數據放入緩沖區,顯示程序掃描顯示緩沖區信息,掃描顯示程序最好用定時計數器固定掃描時間
回復

使用道具 舉報

地板
ID:213173 發表于 2021-1-17 11:03 | 只看該作者
串行口相關寄存器設置不當,顯示函數也太啰嗦。給你改了。
  1. #include<reg52.h>//中斷法
  2. typedef unsigned int u16;         
  3. typedef unsigned char u8;

  4. sbit LSA=P2^2;//控制數碼管顯示位數
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. u8 a=0;

  8. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  10. //12MHz延時時長 T=i*9+16us
  11. void delay(u16 i)
  12. {
  13.         while(i--);        
  14. }

  15. void DigDisplay(u16 num)//數碼管顯示函數
  16. {
  17.         static u8 i=0;
  18.         u8 buf[3]={0,0,0};
  19.         if(num>99)
  20.         {
  21.                 buf[0]=smgduan[num/100%10];
  22.                 buf[1]=smgduan[num/10%10];
  23.                 buf[2]=smgduan[num%10];

  24.         }
  25.         else if(num>9)
  26.         {
  27.                 buf[0]=smgduan[num/10];
  28.                 buf[1]=smgduan[num%10];
  29.                 buf[2]=0x00;
  30.         }
  31.         else
  32.         {
  33.                 buf[0]=smgduan[num];
  34.                 buf[1]=0x00;
  35.                 buf[2]=0x00;
  36.         }
  37.         P0=0x00;
  38.         P2&=0xe3;
  39.         P2|=((7-i)<<2);
  40.         P0=buf[i];
  41.         i++;
  42.         i%=3;
  43. }

  44. void main()
  45. {
  46. //        REN=1;//串口允許接受信息;
  47.         SCON=0X50;//SM0,SM1同時控制工作方式;
  48.         TMOD=0x20;//設置定時器1工作方式為2;
  49.         TR1=1;//打開定時器1;
  50.         TH1=0xFD;//儲存器,控制頻率,由傳輸頻率計算,
  51.         TL1=0xFD;//與以上共同決定傳輸頻率,信息先進入TH1,溢出的進入TL1;
  52.         EA=1;//中斷打開,EA總中斷,ES串口中斷;
  53.         ES=1;
  54.         while(1)
  55.         {               
  56.                 DigDisplay(a);               
  57.                 delay(100);//約1ms
  58.         }
  59. }

  60. void ser() interrupt 4//中斷函數,一共有五個,標號4是第五個中斷函數,是串行口中斷函數
  61. {
  62. //        TH0=0xfc;
  63. //        TL0=0x18;
  64.         RI=0;//RI串口接收中斷申請標志位,數據接收到停止位時RI自動為1;任何標識符初始為0;
  65.         a=SBUF;
  66. }

復制代碼
回復

使用道具 舉報

5#
ID:878202 發表于 2021-1-17 16:38 | 只看該作者
csmyldl 發表于 2021-1-17 09:02
需要改寫void DigDisplay(u16 num)//數碼管顯示函數
具體改寫的方法有多種,可以把接收的數據放入緩沖區, ...

謝謝大神指導
回復

使用道具 舉報

6#
ID:878202 發表于 2021-1-17 16:40 | 只看該作者
wulin 發表于 2021-1-17 11:03
串行口相關寄存器設置不當,顯示函數也太啰嗦。給你改了。

謝謝大神修改
回復

使用道具 舉報

7#
ID:844772 發表于 2021-1-18 10:44 | 只看該作者
你在“ void DigDisplay(u16 num)//數碼管顯示函數 ”這個函數里,加一句就可以顯示輸入的數字而不是ascii碼: num-=48;
因為零的ascii就是48,加在判斷之前就行。

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩三级 | 亚洲伊人影院 | 国产黄色在线观看 | 国产免费自拍视频 | 亚洲精品视频在线播放 | 免费看黄色大片 | 午夜免费看片 | 午夜激情影视 | 欧美美女视频 | 日本亚洲欧美 | 91亚洲国产成人久久精品网站 | 蜜桃91丨九色丨蝌蚪91桃色 | 六月色婷婷 | 国产成人三级一区二区在线观看一 | 亚洲a级片| 亚洲区在线 | 久操精品视频 | 国产午夜三级一区二区三 | 日韩精品视频在线免费观看 | 老司机午夜免费精品视频 | 韩国精品一区二区 | 黄色影院在线观看 | 一区二区三区在线播放 | 国内自拍偷拍 | 国产深夜福利 | 亚洲第一免费视频 | 成年人一级片 | 五月天婷婷在线观看 | 成人高潮片免费网站 | www.青青草| 日韩一区二区三区av | 天天操天天操 | 激情综合色 | 夜夜骑夜夜 | 亚洲视频网 | 久久免费精品视频 | 欧美成人免费 | 成人网在线 | av不卡在线播放 | 亚洲视频在线免费观看 | 麻豆av在线免费观看 |