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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

怎么改進這個單片機電子琴,多按了幾下按鈕就死機了為什么呀?

[復制鏈接]
跳轉到指定樓層
樓主
ID:919434 發表于 2021-5-11 22:14 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
小白求助!本來想達成按按鍵發出聲音然后顯示數字的功能,同時數字可以無限隨著按鍵向左移動。于是我注釋了if(num<=8)的語句,目的就是為了按鍵數字無限向左移動,但是這樣子按鍵超過10次且不清除數字的時候,單片機就會死機!
    要怎么改才能實現電子琴顯示數字無限向左移動且不死機呀?
拜托大佬了~

12796f7d81a59627.png (119.01 KB, 下載次數: 37)

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

使用道具 舉報

沙發
ID:919434 發表于 2021-5-11 22:16 來自觸屏版 | 只看該作者
仿真電路圖是這樣子的

1620742568569840601857166901574.jpg (1.12 MB, 下載次數: 41)

1620742568569840601857166901574.jpg
回復

使用道具 舉報

板凳
ID:919434 發表于 2021-5-11 22:50 來自觸屏版 | 只看該作者
上面發的代碼好像看不清,補發一下

-7806c17498801a7e.png (128.51 KB, 下載次數: 45)

-7806c17498801a7e.png

1b710af8f25114be.png (90.75 KB, 下載次數: 41)

1b710af8f25114be.png

15f80d6efb467b15.png (95.32 KB, 下載次數: 41)

15f80d6efb467b15.png

51c68dabd13f4ad3.png (52.92 KB, 下載次數: 41)

51c68dabd13f4ad3.png
回復

使用道具 舉報

地板
ID:139866 發表于 2021-5-12 09:21 | 只看該作者
你要知道,你無論移動多少數據,到最后顯示的只有8位,所以只要考慮8位顯示就行了,左移之后顯示低8位,就能達到你要的效果
回復

使用道具 舉報

5#
ID:919434 發表于 2021-5-12 09:51 來自觸屏版 | 只看該作者
天ノ憶 發表于 2021-5-12 09:21
你要知道,你無論移動多少數據,到最后顯示的只有8位,所以只要考慮8位顯示就行了,左移之后顯示低8位,就 ...

那怎么用程序表達顯示最近輸入的8位吶?
我現在的程序可以顯示最近八位,但是我想不通為什么會死機呀
回復

使用道具 舉報

6#
ID:139866 發表于 2021-5-12 10:23 | 只看該作者
烏拉拉嗚 發表于 2021-5-12 09:51
那怎么用程序表達顯示最近輸入的8位吶?
我現在的程序可以顯示最近八位,但是我想不通為什么會死機呀

數碼管顯示那里不要管邏輯處理,只需要做到接到什么數據顯示什么數據就行。
鍵盤讀到的數據出來起來就更簡單了,比如一開始是12345678,又讀到一個9,就這樣處理,
BUF = 12345678;
BUF = ((BUF << 1) | 9) & 0XFF;
這樣就保證了數據只有8位,然后送入顯示的函數進行顯示
回復

使用道具 舉報

7#
ID:919434 發表于 2021-5-12 22:30 來自觸屏版 | 只看該作者
天ノ憶 發表于 2021-5-12 10:23
數碼管顯示那里不要管邏輯處理,只需要做到接到什么數據顯示什么數據就行。
鍵盤讀到的數據出來起來就更 ...

這樣改不行呀,我不會改啊啊啊。我太菜了

IMG20210512222933.jpg (1.13 MB, 下載次數: 50)

IMG20210512222933.jpg
回復

使用道具 舉報

8#
ID:213173 發表于 2021-5-13 08:05 | 只看該作者
烏拉拉嗚 發表于 2021-5-12 09:51
那怎么用程序表達顯示最近輸入的8位吶?
我現在的程序可以顯示最近八位,但是我想不通為什么會死機呀

不會死機,不受中斷干擾,逐鍵左移顯示鍵值。





  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar code table[]={//共陽數碼管段碼"0~f-."
  5.                 0xc0,0xf9,0xa4,0xb0,
  6.                 0x99,0x92,0x82,0xf8,
  7.                 0x80,0x90,0x88,0x83,
  8.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};

  9. uchar data key_buf[9]={0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xff};

  10. uchar KeyValue=0;//鍵值變量

  11. void keyscan()
  12. {
  13.         static uchar count=0;                //計數變量       
  14.         static bit sign=0;                        //位變量
  15.         uchar i;
  16.         P1=0xf0;
  17.         if(P1!=0xf0)
  18.         {
  19.                 if(++count>=10 && sign==0)
  20.                 {                       
  21.                         sign=1;
  22.                         switch(P1)
  23.                         {
  24.                                 case(0Xe0):KeyValue = 0;break;
  25.                                 case(0Xd0):KeyValue = 1;break;
  26.                                 case(0Xb0):KeyValue = 2;break;
  27.                                 case(0X70):KeyValue = 3;break;
  28.                         }
  29.                         P1=0x0f;       
  30.                         switch(P1)
  31.                         {
  32.                                 case(0X0e):KeyValue+= 0;break;
  33.                                 case(0X0d):KeyValue+= 4;break;
  34.                                 case(0X0b):KeyValue+= 8;break;
  35.                                 case(0X07):KeyValue+=12;break;
  36.                         }
  37.                         key_buf[8]=table[KeyValue];
  38.                         for(i=0;i<8;i++)
  39.                                 key_buf[i]=key_buf[i+1];//左移
  40.                 }
  41.         }
  42.         else
  43.         {
  44.                 sign=0;       
  45.                 count=0;
  46.         }
  47. }

  48. void Display()
  49. {
  50.         static uchar i;
  51.         P2=0x00;                        //消隱
  52.         P0=key_buf[i]; //送段碼
  53.         P2=0x01<<i;    //送位碼
  54.         i=++i%8;                        //循環計數
  55. }

  56. void Delay_Ms(uchar n)
  57. {
  58.         uchar k;
  59.         while(n--)
  60.         {
  61.                 for(k=0;k<113;k++);
  62.         }
  63. }

  64. void main()
  65. {
  66.         while(1)
  67.         {
  68.                 keyscan();
  69.                 Display();
  70.                 Delay_Ms(1);//控制主循環周期約1ms
  71.         }
  72. }
復制代碼



回復

使用道具 舉報

9#
ID:919434 發表于 2021-5-13 20:22 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-13 08:05
不會死機,不受中斷干擾,逐鍵左移顯示鍵值。

謝謝大佬,不過我放控制中斷的語句進去,揚聲器就會一直響
回復

使用道具 舉報

10#
ID:213173 發表于 2021-5-13 21:25 | 只看該作者
烏拉拉嗚 發表于 2021-5-13 20:22
謝謝大佬,不過我放控制中斷的語句進去,揚聲器就會一直響

開兩個定時器,一個隨鍵值控制喇叭發聲頻率,一個控制持續時間。不過要想聲音好聽就得添加DA轉換和按鍵力度檢測。
回復

使用道具 舉報

11#
ID:919434 發表于 2021-5-14 21:50 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-13 21:25
開兩個定時器,一個隨鍵值控制喇叭發聲頻率,一個控制持續時間。不過要想聲音好聽就得添加DA轉換和按鍵力 ...

請前輩幫我看看代碼,雖然知道功能但是不太會用代碼表達呀。
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar DisBuf[8];
  4. sbit P3_7=P3^7;
  5. unsigned char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //
  6. unsigned char BitCode[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};    //                                             
  7. uchar code key_buf[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd, 0x7d,0xeb,
  8.                         0xdb, 0xbb, 0x7b,0xe7, 0xd7,0xb7,0x77}; //
  9. unsigned int wu[]={64580,64684,64777,64820,64898,64968,65030,65058,65058,65111};
  10. uchar KeyValue;   
  11. unsigned int num=0;   
  12. unsigned char i;

  13. void Delay_Ms(uchar n) //
  14. {
  15. uchar k;
  16. while(n--)
  17. {
  18.   for(k=0;k<113;k++);
  19. }
  20. }

  21. void Display()//
  22. {
  23.   uchar i;
  24.   for(i=0;i<8;i++)
  25. {
  26.   P0=DisBuf[i];   
  27.   P2=BitCode[i];  
  28.   Delay_Ms(1);
  29.   P0=0xff;
  30. }
  31. }

  32. uchar KeyScan()    //
  33. {
  34. uchar scan1,scan2,temp,j;
  35. P1 = 0x0f;
  36. scan1 = P1 & 0x0f;  

  37. if (scan1 != 0x0f)
  38. {
  39.   Delay_Ms(10);   
  40.   scan1 = P1 & 0x0f;

  41.   if (scan1 != 0x0f)  
  42.   {
  43.    P1 = 0xf0;
  44.    scan2 = P1 &  0xf0;

  45.    temp = scan1 | scan2 ;
  46.    for (j=0;j<16;j++)
  47.    {
  48.     if (temp == key_buf[j])
  49.      return j;   
  50.    }
  51.       
  52.   }
  53.   return (16);   
  54. }
  55. else
  56.   return (16);     
  57. }

  58. void main(void)
  59. {
  60.         
  61.         TMOD=0x01;
  62.         ET0=1;
  63.         EA=1;
  64. for(i=0;i<8;i++)
  65. {
  66. DisBuf[i]=0xff;
  67. }
  68.   while(1)
  69. {
  70.    Display();
  71.    KeyValue = KeyScan();
  72.            TR0=1;
  73.   if (KeyValue<16)
  74. {
  75.   while(KeyScan()<16);
  76.         
  77.   if(KeyValue<10)
  78. {
  79.   num++;
  80.         TR0=1;
  81. //if(num<=8)
  82. {
  83.   for(i=num-1;i>=1;i--)
  84. {
  85.   DisBuf[i]=DisBuf[i-1];//移位
  86.         
  87. }
  88.   DisBuf[0]=table[KeyValue];
  89. }
  90. }
  91.   else
  92. {
  93.         if(KeyValue==10)//清屏
  94.         {
  95.   for(i=0;i<=7;i++)
  96. {
  97.   DisBuf[i]=0xff;  
  98. }
  99.   num = 0;
  100. }
  101.    }
  102.   }
  103. }
  104. }

  105. void time() interrupt 1 //中斷發聲
  106. {
  107.         if(KeyValue<=9)
  108.         {
  109.         TH0=wu[KeyValue]/256;
  110.         TL0=wu[KeyValue]%256;
  111.         P3_7=!P3_7;
  112.         }
  113. }
復制代碼
回復

使用道具 舉報

12#
ID:213173 發表于 2021-5-16 07:31 | 只看該作者
烏拉拉嗚 發表于 2021-5-14 21:50
請前輩幫我看看代碼,雖然知道功能但是不太會用代碼表達呀。

改好了
簡易電子琴.zip (117.76 KB, 下載次數: 16)

回復

使用道具 舉報

13#
ID:919434 發表于 2021-5-16 16:12 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-16 07:31
改好了

非常感謝~
回復

使用道具 舉報

14#
ID:919434 發表于 2021-5-24 21:20 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-16 07:31
改好了

前輩,我發現我之前的問題了,就是我定義的緩沖數組只有8個儲存空間,所以按鍵超過儲存空間時(按鍵次數超過8時),單片機就會死機,而且用我的代碼,緩沖數組最多只能定義2的6次方的儲存空間。
  但是前輩的代碼可以實現無限左移動,并且沒有緩沖數組的限制,小弟不才,沒有看懂前輩的代碼,不是很清楚前輩的代碼是如何達到目的的,肯請前輩指教。
回復

使用道具 舉報

15#
ID:213173 發表于 2021-5-25 06:02 | 只看該作者
烏拉拉嗚 發表于 2021-5-24 21:20
前輩,我發現我之前的問題了,就是我定義的緩沖數組只有8個儲存空間,所以按鍵超過儲存空間時(按鍵次數 ...

        uchar data key_buf[9]={0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xff};//顯示緩沖數組長度9,初值任意填寫。

        key_buf[8]=table[KeyValue];//將當前鍵值保存在緩沖數組的最后并覆蓋上次保存的鍵值
        for(i=0;i<8;i++)
                key_buf=key_buf[i+1];//循環8次由后向前逐一覆蓋替換保存的鍵值

        數碼管只顯示key_buf[0]~key_buf[7]就達到隨按鍵左移顯示鍵值的目的
回復

使用道具 舉報

16#
ID:919434 發表于 2021-5-25 23:57 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-25 06:02
uchar data key_buf[9]={0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xff};//顯示緩沖數組長度9,初值任 ...

非常感謝前輩!終于弄好了,不過又出現了消影小問題,應該是我的鍵盤掃描函數的原因,我再想辦法改改,單片機真的好磨人呀!
回復

使用道具 舉報

17#
ID:213173 發表于 2021-5-26 06:06 | 只看該作者
烏拉拉嗚 發表于 2021-5-25 23:57
非常感謝前輩!終于弄好了,不過又出現了消影小問題,應該是我的鍵盤掃描函數的原因,我再想辦法改改,單 ...

消隱問題是顯示函數沒有處理好,不在按鍵掃描函數。
回復

使用道具 舉報

18#
ID:919434 發表于 2021-5-26 08:27 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-26 06:06
消隱問題是顯示函數沒有處理好,不在按鍵掃描函數。

顯示函數我用的和前輩是一樣的,主函數也差不多

Screenshot_2021-05-26-08-27-28-53.jpg (238.59 KB, 下載次數: 37)

Screenshot_2021-05-26-08-27-28-53.jpg
回復

使用道具 舉報

19#
ID:919434 發表于 2021-5-27 12:02 來自觸屏版 | 只看該作者
wulin 發表于 2021-5-26 06:06
消隱問題是顯示函數沒有處理好,不在按鍵掃描函數。

找到問題了,我換臺電腦就可以了。
回復

使用道具 舉報

20#
ID:942522 發表于 2021-6-22 16:20 | 只看該作者

大佬,怎么刪除字符,比如說按鍵按錯了,想要刪除數碼管顯示的錯誤數,怎么辦啊?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区在线观看 | 美女天堂av| 国产日韩免费视频 | 久久国产欧美日韩精品 | 国产成人区 | 国产综合精品 | 黄色在线免费看 | 久久久精品一区二区三区 | 久久国产精品72免费观看 | 成年人在线观看视频 | www.五月婷婷.com | 999久久久精品 | 中文字幕在线播放第一页 | av资源在线看 | 日韩在线小视频 | 国产精品久久国产精品 | 日韩视频专区 | 一级视频在线免费观看 | 一区二区免费看 | 自拍 亚洲 欧美 老师 丝袜 | 日韩一级不卡 | 宅女噜噜66国产精品观看免费 | 蜜桃视频在线观看www社区 | 国产一级片精品 | 国产成人精品网站 | 在线免费观看视频你懂的 | 日本亚洲精品成人欧美一区 | 99精品国产一区二区青青牛奶 | 视频一区在线播放 | 亚洲成人一区 | 先锋资源站 | 九色在线观看 | 国产日韩精品在线 | 色毛片| av特级毛片 | 久久久精| 国产一区二区 | 日韩精品在线观看免费 | 97国产精品视频 | 午夜激情网| 精品亚洲二区 |