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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機+74HC164芯片控制數碼管有很明顯跳動的疑問

[復制鏈接]
跳轉到指定樓層
樓主
本人用單片機驅動74HC164芯片串入并出驅動數碼管,結果發現數碼管顯示一直有很明顯跳動


我認為是我的serial_Output函數有問題,于是加了個_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};                                                          //數位分解所用權值表
  7. u16 val = 42950;                                                                                                  //所演示的起始值
  8. u8 Buf[5];                                                                                                                  //分解以后的存放緩沖
  9. sbit DAT = P3^4;                                                                                                  //串行數據線
  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. {                                                                                                                                   //分解整數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字節數據
  28. {
  29.         u8 i;

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

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

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


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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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




  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};//數位分解所用權值表
  7. u16 val = 42950;  //所演示的起始值                                                                                                                 //分解以后的存放緩沖
  8. u8 Buf[5];
  9. sbit DAT = P3^4; //串行數據線
  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[])   //分解顯示數據val
  19. {                                                                                                                                   //分解整數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字節數據
  33. {
  34.         u8 i;
  35.         for(i=0;i<8;i++)
  36.         {
  37.                 d <<= 1;
  38.                 DAT = CY; //移出一位,高位優先
  39.                 CLK = 0;
  40.                 CLK = 1; //上升沿移入數據
  41.         }
  42. }

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


回復

使用道具 舉報

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

使用道具 舉報

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

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

樣例子


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

復制代碼




回復

使用道具 舉報

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

樣例子

謝謝指教
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产福利一区二区 | 亚洲一级二级三级 | 久久久久久成人 | 一区二区免费在线观看 | 成人h动漫精品一区二区器材 | 99久久久久国产精品免费 | 亚洲高清一区二区三区 | 伊人网影院 | 欧美日韩中文字幕在线 | 午夜精品久久 | 国产成人精品视频在线观看 | 日本欧美大片 | 亚洲成年在线 | 欧美激情综合网 | 91正在播放 | 国产精品久久久久久久久久久久久 | 91高清在线视频 | 日韩a在线| 久久国产亚洲 | 亚洲网站在线观看 | 盗摄精品av一区二区三区 | 精品乱码一区二区 | 在线视频 中文字幕 | 成人免费区一区二区三区 | 黑人巨大精品欧美一区二区一视频 | 免费在线黄色av | 亚洲欧美国产毛片在线 | 亚洲一区二区三区在线免费 | 久久精品国产99国产精品亚洲 | 国产在线看片 | www.蜜桃av | 日本三级黄视频 | 亚洲女人的天堂 | 午夜影视免费片在线观看 | 亚洲精品在线免费看 | 亚洲激情一区二区三区 | 久久久久亚洲 | 精品乱码久久久久 | 久久av一区二区 | 午夜影院中文字幕 | 欧美一级免费观看 |