標(biāo)題: 關(guān)于單片機+74HC164芯片控制數(shù)碼管有很明顯跳動的疑問 [打印本頁]

作者: xunuo    時間: 2019-2-28 22:12
標(biāo)題: 關(guān)于單片機+74HC164芯片控制數(shù)碼管有很明顯跳動的疑問
本人用單片機驅(qū)動74HC164芯片串入并出驅(qū)動數(shù)碼管,結(jié)果發(fā)現(xiàn)數(shù)碼管顯示一直有很明顯跳動


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

單片機源碼:
  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_();                                                                                                  //加延時修補
  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ù)制代碼



作者: BlackCloud    時間: 2019-3-1 01:18
delayms(500)時間太長了,縮短到10ms左右再試試,多次刷新利用余輝
作者: Ahchi    時間: 2019-3-1 03:58
把164換成595吧,164每次移位都會輸出,前面7次輸出的值都不是你想要的
作者: pcf2000    時間: 2019-3-1 10:08
視頻每秒24幀,也就是說每秒刷新了24幅圖片人眼才不會感覺到畫面閃爍。動態(tài)刷新數(shù)碼管一樣,也需在1秒內(nèi)刷新24遍,才會感覺不到閃爍,自己算:1/24秒內(nèi)要刷新完你的數(shù)碼管,每一個數(shù)碼管的時間多少。。。
作者: wulin    時間: 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ù)制代碼



作者: wulin    時間: 2019-3-1 14:53
為什么代碼傳上來回丟掉好些方括號???管理員知道這個問題嗎???
作者: admin    時間: 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ù)制代碼





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

樣例子

謝謝指教




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1