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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

實現按鍵次數在數碼管上顯示并通過串口發送到PC端

[復制鏈接]
跳轉到指定樓層
樓主
下面的代碼只實現了按鍵次數在數碼管上顯示,但是無論我怎么試,也沒有辦法把數碼管的數據發送至串口助手,求大佬指點。
#include<reg52.h>
#include<stdlib.h>
#define uint unsigned long
#define uchar unsigned char

sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;

sbit k1 = P3^5;
sbit k2 = P3^4;
sbit k3 = P3^3;
sbit k4 = P3^2;
uchar code table[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

uint num;

void delay(unsigned int i)
{
       
        while(i--);
  
  
}
void delayms(unsigned int i)
{
for(i=124;i>0;i--);  //Ñóê±124*8+10=1002us
}


void display(unsigned long num)
{
       
                led1=0;               
                P0=table[(num%10000)/1000];       
                delayms(1);               
                P0=0XFF;               
                led1=1;               

                led2=0;               
                P0=table[(num%1000)/100];       
                delayms(1);               
                P0=0XFF;               
                led2=1;

                led3=0;               
                P0=table[(num%100)/10];       
                delayms(1);               
                P0=0XFF;               
                led3=1;

                led4=0;               
                P0=table[num%10];       
                delayms(1);               
                P0=0XFF;               
                led4=1;
               
}



void main()
       
{
       
       



        num=0;       

        while(1)
        {
       
                SBUF=num;
                       
                display(num);
                       
                       
                if(k1==0)
                {
                       
                       
                        delayms(50);
                        if(k1==0)
                        {
                               
                                num++;
                        }
                       
                        while(!k1);
                        delayms(50);
                        while(!k1);
                               
                }
                       
        }
       
}

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

使用道具 舉報

沙發
ID:617449 發表于 2019-12-22 09:07 | 只看該作者
你好!
1、缺少串口初始化程序
2、缺少串口發送程序
3、增加上述程序后再試
回復

使用道具 舉報

板凳
ID:638320 發表于 2019-12-22 10:27 | 只看該作者
要用一個發送標志位TI來判斷,讓它發送完成才執行下面的程序,即SBFU=number;
while(!TI);等待發送完成
TI=0;清標志位
回復

使用道具 舉報

地板
ID:213173 發表于 2019-12-22 11:35 | 只看該作者
要開定時器1做波特率發生器,按鍵后才發送,發送語句要完整。
  1. #include<reg52.h>
  2. #include<stdlib.h>
  3. #define uint unsigned long
  4. #define uchar unsigned char

  5. sbit led1 = P2^0;
  6. sbit led2 = P2^1;
  7. sbit led3 = P2^2;
  8. sbit led4 = P2^3;

  9. sbit k1 = P3^5;
  10. sbit k2 = P3^4;
  11. sbit k3 = P3^3;
  12. sbit k4 = P3^2;
  13. uchar code table[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

  14. uchar key;

  15. void delayms(unsigned int i)
  16. {
  17.         unsigned int j;
  18.         while(i--)
  19.         {
  20.                 for(j=124;j>0;j--);
  21.         }
  22. }

  23. void display(uchar num)
  24. {       
  25.         led1=0;               
  26.         P0=table[(num%10000)/1000];        
  27.         delayms(1);               
  28.         P0=0XFF;
  29.         led1=1;               
  30.        
  31.         led2=0;               
  32.         P0=table[(num%1000)/100];        
  33.         delayms(1);               
  34.         P0=0XFF;               
  35.         led2=1;
  36.        
  37.         led3=0;               
  38.         P0=table[(num%100)/10];        
  39.         delayms(1);               
  40.         P0=0XFF;               
  41.         led3=1;
  42.        
  43.         led4=0;               
  44.         P0=table[num%10];        
  45.         delayms(1);               
  46.         P0=0XFF;               
  47.         led4=1;       
  48. }
  49. void main()        
  50. {//初始化定時器(波特率9600)
  51.         TMOD=0x20;
  52.         TH1=0xfd;
  53.         TH1=0xfd;
  54.         TR1=1;
  55.         REN=1;
  56.         SM0=0;
  57.         SM1=1;
  58. //初始鍵值
  59.         key=0;        
  60.         while(1)
  61.         {
  62.                 if(k1==0)
  63.                 {
  64.                         delayms(10);
  65.                         if(k1==0)
  66.                         {
  67.                                 if(key<255)
  68.                                         key++;
  69.                         }
  70.                         while(!k1);//等待松手
  71.                         SBUF=key;//鍵值發送到串口
  72.                         while(!TI);//等待發送完成
  73.                         TI=0;//清標志位
  74.                 }
  75.                 display(key);
  76.         }
  77. }
復制代碼
回復

使用道具 舉報

5#
ID:164602 發表于 2019-12-22 15:53 | 只看該作者
wulin 發表于 2019-12-22 11:35
要開定時器1做波特率發生器,按鍵后才發送,發送語句要完整。

wulin:看看我這個程序,后面有記錄。我解決不了。(用的是HC6800-ES-V2.0的板子)

#include<reg51.h>

#define GPIO_DIG P0//數碼管顯示口

sbit LSA=P2^2;//138譯碼器
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit k1=P3^1;//按鍵1

unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//數碼管顯示編碼
unsigned char DD[2]={0x3f,0x00};//數碼管顯示緩存
unsigned char D0,D1;//串口發送緩存

void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void UsartConfiguration()//設置串口
{
        SCON=0X50;//串口通信設置為工作方式1
        TMOD=0X20;//設置定時器1工作方式2
        PCON=0X80;//波特率加倍
        TH1=0XF3;//計數器初始值設置,注意波特率是4800的
        TL1=0XF3;
        TR1=1;//打開計數器
}

void DigDisplay()//數碼管顯示函數
{
        unsigned char i;
        unsigned char j;
        for(i=0;i<2;i++)//只有2個數碼管
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                }
                GPIO_DIG=DD;//發送段碼
                j=10;                                                 //掃描間隔時間設定
                while(j--);       
                GPIO_DIG=0x00;//消隱
        }
}

void CKFS (void)//串口發送
{
        SBUF = D1;
        while (!TI);
        TI = 0;
        SBUF = D0;
        while (!TI);
        TI = 0;
        SBUF = ' ';
        while (!TI);
        TI = 0;
}

void main(void)
{
        unsigned char i,j;//i為松手消抖計數變量;j為按鍵計數;
        UsartConfiguration();
        while(1)
        {       
                if(k1==0)//掃描鍵盤k1
                {
                        Delay10ms(1);//按下消抖
                        if(k1==0)
                        {
                                j++;
                                if (j>99)
                                {
                                        j=0;
                                }
                                if (j<10)
                                {
                                        DD[0]=DIG_CODE[j];
                                        DD[1]=0x00;
                                        D0 = (0x30+j);
                                        D1 = 0x00;
                                }
                                else
                                {
                                        DD[1]=DIG_CODE[j/10];
                                        DD[0]=DIG_CODE[j%10];
                                        D0 = (0x30+(j%10));
                                        D1 = (0x30+(j/10));
                                }
                            while((i<50)&&(k1==0))//松鍵消抖
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                        CKFS();
                }
                DigDisplay();
        }               
}


/*
編后感:
此程序是通過數碼管顯示按鍵次數(99以內),并且將次數通過串口發送到電腦。
但串口接收常常有亂碼!
通過調試,發現這樣的現象:
第一:單獨的數碼管顯示沒有問題;單獨的串口發送也沒有問題;
第二:個人感覺,兩功能組合后,接收出現問題,主要是按鍵的消抖延時,影響到了串口工作的時序,
比如:串口發送的語句單獨出現在按鍵程序中,串口根本接收不到有效數據,把它們集中到子函數中,
就可以接收到有效數據了。
第三:亂碼問題沒有根本解決,有部分數據沒有亂碼。根本原因沒有找到,就無法解決。
*/


回復

使用道具 舉報

6#
ID:213173 發表于 2019-12-22 23:39 | 只看該作者
HC6800-ES-V2.0 發表于 2019-12-22 15:53
wulin:看看我這個程序,后面有記錄。我解決不了。(用的是HC6800-ES-V2.0的板子)

#include

在此例程序中,按鍵與串口共用P3.1口,按鍵松手不穩,簧片抖動是產生亂碼的主要原因。在有些開發板由于功能交叉會產生這樣難題。寫個程序解決一下學習問題無所謂。在實際應用電路中絕不可如此設計。給你把程序修改了一下,你試試。
  1. #include<reg51.h>

  2. #define GPIO_DIG P0//數碼管顯示口

  3. sbit LSA=P2^2;//138譯碼器
  4. sbit LSB=P2^3;
  5. sbit LSC=P2^4;

  6. sbit k1=P3^1;//按鍵1

  7. unsigned char code DIG_CODE[16]={//數碼管顯示編碼
  8. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  10. unsigned char DD[]="00\n";//串口發送緩存
  11. //unsigned char D0,D1;//串口發送緩存
  12. unsigned char key=0;                //鍵值
  13. bit mark=0;//允許發送標志
  14. void Delayms(unsigned int c)
  15. {
  16.         unsigned int a;
  17.         for(c;c>0;c--)
  18.                 for(a=130;a>0;a--);
  19. }

  20. void UsartConfiguration()//設置串口
  21. {
  22.         SCON=0X50;//串口通信設置為工作方式1
  23.         TMOD=0X20;//設置定時器1工作方式2
  24.         PCON=0X80;//波特率加倍
  25.         TH1=0XF3;//計數器初始值設置,注意波特率是4800的
  26.         TL1=0XF3;
  27.         TR1=0;//關計數器
  28. }

  29. void DigDisplay()//數碼管顯示函數
  30. {
  31.         static bit i=0;
  32.         static unsigned int j=0;
  33.         if(++j>=100)
  34.         {
  35.                 j=0;
  36.                 GPIO_DIG=0x00;//消隱
  37.                 if(i){LSA=0;LSB=0;LSC=0;GPIO_DIG=DIG_CODE[key/10];}//顯示十位       
  38.                 else {LSA=1;LSB=0;LSC=0;GPIO_DIG=DIG_CODE[key%10];}//顯示個位
  39.                 i=~i;
  40.         }
  41. }
  42. void SendOneByte(unsigned char c)
  43. {
  44.     SBUF = c;                //發送數據
  45.     while(!TI);        //等待發送完成
  46.     TI = 0;                        //發送中斷請求標志位清0
  47. }
  48. void CKFS()//串口發送
  49. {
  50.         static unsigned int i=0,j;
  51.         if(mark==1)
  52.         {
  53.                 if(++i>=1000)//計數延時
  54.                 {
  55.                         TR1=1;//開T1
  56.                         i=200;
  57.                     while(i--);//小延時
  58.                         for(j=0;j<3;j++)//發送兩個字符+換行符
  59.                                 SendOneByte(DD[j]);
  60.                         TR1=0;//關T1
  61.                         mark=0;//允許發送標志清0
  62.                 }
  63.         }
  64. }

  65. void main(void)
  66. {
  67.         unsigned char count=0;        //消抖計數
  68.         bit flag=0;                                        //按鍵標志
  69.         UsartConfiguration();
  70.         Delayms(100);
  71.         while(1)
  72.         {        
  73.                 if(k1==0)//掃描鍵盤k1
  74.                 {
  75.                         if(++count>=100 && flag==0)
  76.                         {
  77.                                 flag=1;
  78.                                 key++;
  79.                                 if(key>99)
  80.                                         key=0;
  81.                                 if(key<10)
  82.                                 {
  83.                                         DD[0]=' ';
  84.                                         DD[1]=key%10+'0';
  85.                                 }
  86.                                 else
  87.                                 {
  88.                                         DD[0]=key/10+'0';
  89.                                         DD[1]=key%10+'0';
  90.                                 }
  91.                         }
  92.                 }
  93.                 else
  94.                 {
  95.                         if(flag)
  96.                         {
  97.                                 flag=0;
  98.                                 mark=1;//允許發送
  99.                         }
  100.                         count=0;
  101.                 }
  102.                 CKFS();
  103.                 DigDisplay();
  104.         }               
  105. }
復制代碼
回復

使用道具 舉報

7#
ID:164602 發表于 2019-12-23 08:39 | 只看該作者
wulin 發表于 2019-12-22 23:39
在此例程序中,按鍵與串口共用P3.1口,按鍵松手不穩,簧片抖動是產生亂碼的主要原因。在有些開發板由于功 ...

非常感謝你。程序已經驗證。你的編程方法,也給我很大的提示!!!!!
是你指出了問題的根源,所以,我更改了按鍵,用k4鍵,占用P33口,就不沖突了,一切正常。
再次謝謝!
回復

使用道具 舉報

8#
ID:670959 發表于 2019-12-23 09:45 | 只看該作者
wulin:看看我這個程序,后面有記錄。我解決不了。(用的是HC6800-ES-V2.0的板子)

#include<reg51.h>

#define GPIO_DIG P0//數碼管顯示口

sbit LSA=P2^2;//138譯碼器
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit k1=P3^1;//按鍵1

unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//數碼管顯示編碼
unsigned char DD[2]={0x3f,0x00};//數碼管顯示緩存
unsigned char D0,D1;//串口發送緩存

void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void UsartConfiguration()//設置串口
{
        SCON=0X50;//串口通信設置為工作方式1
        TMOD=0X20;//設置定時器1工作方式2
        PCON=0X80;//波特率加倍
        TH1=0XF3;//計數器初始值設置,注意波特率是4800的
        TL1=0XF3;
        TR1=1;//打開計數器
}

void DigDisplay()//數碼管顯示函數
{
        unsigned char i;
        unsigned char j;
        for(i=0;i<2;i++)//只有2個數碼管
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                }
                GPIO_DIG=DD;//發送段碼
                j=10;                                                 //掃描間隔時間設定
                while(j--);        
                GPIO_DIG=0x00;//消隱
        }
}

void CKFS (void)//串口發送
{
        SBUF = D1;
        while (!TI);
        TI = 0;
        SBUF = D0;
        while (!TI);
        TI = 0;
        SBUF = ' ';
        while (!TI);
        TI = 0;
}

void main(void)
{
        unsigned char i,j;//i為松手消抖計數變量;j為按鍵計數;
        UsartConfiguration();
        while(1)
        {        
                if(k1==0)//掃描鍵盤k1
                {
                        Delay10ms(1);//按下消抖
                        if(k1==0)
                        {
                                j++;
                                if (j>99)
                                {
                                        j=0;
                                }
                                if (j<10)
                                {
                                        DD[0]=DIG_CODE[j];
                                        DD[1]=0x00;
                                        D0 = (0x30+j);
                                        D1 = 0x00;
                                }
                                else
                                {
                                        DD[1]=DIG_CODE[j/10];
                                        DD[0]=DIG_CODE[j%10];
                                        D0 = (0x30+(j%10));
                                        D1 = (0x30+(j/10));
                                }
                            while((i<50)&&(k1==0))//松鍵消抖
                            {
                                    Delay10ms(1);
                                    i++;
                            }
                            i=0;
                        }
                        CKFS();
                }
                DigDisplay();
        }               
}


/*
編后感:
此程序是通過數碼管顯示按鍵次數(99以內),并且將次數通過串口發送到電腦。
但串口接收常常有亂碼!
通過調試,發現這樣的現象:
第一:單獨的數碼管顯示沒有問題;單獨的串口發送也沒有問題;
第二:個人感覺,兩功能組合后,接收出現問題,主要是按鍵的消抖延時,影響到了串口工作的時序,
比如:串口發送的語句單獨出現在按鍵程序中,串口根本接收不到有效數據,把它們集中到子函數中,
就可以接收到有效數據了。
第三:亂碼問題沒有根本解決,有部分數據沒有亂碼。根本原因沒有找到,就無法解決。
*/
回復

使用道具 舉報

9#
ID:669905 發表于 2019-12-28 10:18 | 只看該作者
wulin 發表于 2019-12-22 11:35
要開定時器1做波特率發生器,按鍵后才發送,發送語句要完整。

你好,我試了您給的代碼,但是在串口助手不是1234 這樣的按鍵次數,而是81 82 83 84 85 86 87 80 81 8A 83 84 8D 8E 8F 90 91 82 83 8C 85 86 97 88 89 8A 8F 8C 8D這樣的數
回復

使用道具 舉報

10#
ID:213173 發表于 2019-12-28 16:48 | 只看該作者
tomorrow101 發表于 2019-12-28 10:18
你好,我試了您給的代碼,但是在串口助手不是1234 這樣的按鍵次數,而是81 82 83 84 85 86 87 80 81 8A 8 ...

可能是你的串口助手沒有調好。


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产羞羞视频在线观看 | 免费观看毛片 | 欧美一级片免费看 | 免费看一区二区三区 | 日韩av一区二区在线观看 | 亚洲综合日韩精品欧美综合区 | 欧美午夜激情在线 | 国产在线一区二区 | 玖玖视频免费 | 精品无码久久久久久国产 | 福利片在线| av黄色在线观看 | av成年人网站 | 成人国产一区二区三区精品麻豆 | 在线成人av| 自拍视频网站 | 欧美日韩亚洲一区 | 秋霞av国产精品一区 | 色接久久| 欧美专区在线 | 欧美日本韩国一区二区 | 欧美一区二区三区视频 | 欧美精品网站 | 欧美久久免费观看 | 欧美三级三级三级爽爽爽 | 国产成人精品a视频一区www | 久久男人 | 日韩欧美在线观看视频 | 久久国产精品久久国产精品 | 四虎在线观看 | 男女国产网站 | 日韩av一区二区在线 | 亚洲人va欧美va人人爽 | 国产999精品久久久 精品三级在线观看 | 九九热在线视频观看这里只有精品 | 粉嫩一区二区三区国产精品 | 天天激情综合 | 99久久国产综合精品麻豆 | 成人精品 | 天天搞天天搞 | 丁香一区二区 |