找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4803|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)+74HC164芯片控制數(shù)碼管有很明顯跳動的疑問

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:376199 發(fā)表于 2019-2-28 22:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本人用單片機(jī)驅(qū)動74HC164芯片串入并出驅(qū)動數(shù)碼管,結(jié)果發(fā)現(xiàn)數(shù)碼管顯示一直有很明顯跳動


我認(rèn)為是我的serial_Output函數(shù)有問題,于是加了個_nop_()延時,可是抖動還是很明顯,本人想不出如何修改,望指教

單片機(jī)源碼:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int

  5. u8 code seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
  6. const u16 m[] = {10000, 1000, 100, 10};                                                          //數(shù)位分解所用權(quán)值表
  7. u16 val = 42950;                                                                                                  //所演示的起始值
  8. u8 Buf[5];                                                                                                                  //分解以后的存放緩沖
  9. sbit DAT = P3^4;                                                                                                  //串行數(shù)據(jù)線
  10. sbit CLK = P3^7;                                                                                                  //串行時鐘線

  11. void delayms(u8 ms)
  12. {
  13.         u8 i;

  14.         while(ms--)
  15.                 for(i = 0; i < 120; i++);
  16. }

  17. void Decompose(u16 x, u8 d[])
  18. {                                                                                                                                   //分解整數(shù)x
  19.         u8 i;

  20.         for(i = 0; i < 4; i++)
  21.         {
  22.                 d[i] = 0;
  23.                 while(x >= m[i]) {x -= m[i]; d[i]++;}
  24.         }
  25.         d[4] = x;
  26. }

  27. void serial_Output(u8 d)                                                                                  //模擬時序向74HC164串行輸出1字節(jié)數(shù)據(jù)
  28. {
  29.         u8 i;

  30.         for(i = 0; i < 8; i++)
  31.         {
  32.                 CLK = 0;
  33.                 d <<= 1; DAT = CY;                                                                                  //移出一位,高位優(yōu)先
  34.                 _nop_();                                                                                                  //加延時修補(bǔ)
  35.                 CLK = 1;                                                                                                  //上升沿移入數(shù)據(jù)
  36.         }
  37. }

  38. void main()
  39. {
  40.         u8 i;

  41.         while(1)
  42.         {
  43.                 Decompose(val, Buf);                                                                          //分解顯示數(shù)據(jù)val
  44.                 for(i = 4; i != 0xff; i--)                                                                  //串行發(fā)送各數(shù)字段碼
  45.                 {
  46.                         
  47.                         serial_Output(seg[Buf[i]]);
  48.                         //delayms(2);
  49.                 }                                                         
  50.                 delayms(500);
  51.                 val++;
  52.         }
  53. }
復(fù)制代碼


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

使用道具 舉報

沙發(fā)
ID:246917 發(fā)表于 2019-3-1 01:18 | 只看該作者
delayms(500)時間太長了,縮短到10ms左右再試試,多次刷新利用余輝
回復(fù)

使用道具 舉報

板凳
ID:479009 發(fā)表于 2019-3-1 03:58 | 只看該作者
把164換成595吧,164每次移位都會輸出,前面7次輸出的值都不是你想要的
回復(fù)

使用道具 舉報

地板
ID:245053 發(fā)表于 2019-3-1 10:08 | 只看該作者
視頻每秒24幀,也就是說每秒刷新了24幅圖片人眼才不會感覺到畫面閃爍。動態(tài)刷新數(shù)碼管一樣,也需在1秒內(nèi)刷新24遍,才會感覺不到閃爍,自己算:1/24秒內(nèi)要刷新完你的數(shù)碼管,每一個數(shù)碼管的時間多少。。。
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2019-3-1 11:13 | 只看該作者
主要原因是你消隱沒有處理好,在傳輸段碼過程中要關(guān)閉數(shù)碼管。否則在仿真時會閃爍,在實際電路中可能會有鬼影。給你把程序修改了一下就正常了。




  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int

  5. u8 code seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xaa};
  6. const u16 m[] = {10000, 1000, 100, 10};//數(shù)位分解所用權(quán)值表
  7. u16 val = 42950;  //所演示的起始值                                                                                                                 //分解以后的存放緩沖
  8. u8 Buf[5];
  9. sbit DAT = P3^4; //串行數(shù)據(jù)線
  10. sbit CLK = P3^7; //串行時鐘線
  11. sbit Hide= P3^5; //消隱

  12. void delayms(u16 ms)
  13. {
  14.         u8 i;        
  15.         while(ms--)
  16.                 for(i = 0; i < 120; i++);
  17. }

  18. void Decompose(u16 x, u8 d[])   //分解顯示數(shù)據(jù)val
  19. {                                                                                                                                   //分解整數(shù)x
  20.         u8 i;        
  21.         for(i=0;i<4;i++)
  22.         {
  23.                 d[i]= 0;
  24.                 while(x>=m[i])
  25.                 {
  26.                         x -= m[i];
  27.                         d[i]++;
  28.                 }
  29.         }
  30.         d[4] = x;
  31. }

  32. void serial_Output(u8 d)//模擬時序向74HC164串行輸出1字節(jié)數(shù)據(jù)
  33. {
  34.         u8 i;
  35.         for(i=0;i<8;i++)
  36.         {
  37.                 d <<= 1;
  38.                 DAT = CY; //移出一位,高位優(yōu)先
  39.                 CLK = 0;
  40.                 CLK = 1; //上升沿移入數(shù)據(jù)
  41.         }
  42. }

  43. void main()
  44. {
  45.         u8 i;
  46.         while(1)
  47.         {
  48.                 Decompose(val, Buf);    //分解顯示數(shù)據(jù)val
  49.                 Hide=0;//消隱,關(guān)閉數(shù)碼管電源
  50.                 for(i = 4; i != 0xff; i--) //串行發(fā)送各數(shù)字段碼
  51.                 {
  52.                         serial_Output(seg[Buf[i]]);
  53.                         //delayms(2);
  54.                 }
  55.                 Hide=1;//打開數(shù)碼管電源
  56.                 delayms(500);//延時u8最大255,改為u16
  57.                 val++;
  58.         }
  59. }
復(fù)制代碼


回復(fù)

使用道具 舉報

6#
ID:213173 發(fā)表于 2019-3-1 14:53 | 只看該作者
為什么代碼傳上來回丟掉好些方括號???管理員知道這個問題嗎???
回復(fù)

使用道具 舉報

7#
ID:1 發(fā)表于 2019-3-1 15:11 | 只看該作者
wulin 發(fā)表于 2019-3-1 14:53
為什么代碼傳上來回丟掉好些方括號???管理員知道這個問題嗎???

您好,代碼用這個框起來就不會丟失[ i]和[ b]了,或者改為[ i]和[ b](中間加個空格)

樣例子


  1. 代碼[i]
  2. 代碼[i]
  3. 代碼[i]
  4. 代碼[i]
  5. 代碼[i]
  6. 代碼[i]

復(fù)制代碼




回復(fù)

使用道具 舉報

8#
ID:213173 發(fā)表于 2019-3-1 15:18 | 只看該作者
admin 發(fā)表于 2019-3-1 15:11
您好,代碼用這個框起來就不會丟失[ i]和[ b]了,或者改為[ i]和[ b](中間加個空格)

樣例子

謝謝指教
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表