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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

iar for avr 編程 通過 仿真數碼管顯示不全 請求指導

[復制鏈接]
跳轉到指定樓層
樓主
   學習《AVR單片機與傳感器模塊設計》(IAR) 教材,ATMega16 的A/D轉換編程實踐
                       編程通過   但是仿真 顯示不全




  1. #include <iom16.h>
  2. unsigned char const SEG7[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //用數組來預存數碼管顯示字符0~9的花樣數據
  3. unsigned char const ACT[4] = {0x01,0x02,0x04,0x08}; //定義動態掃描位的變量以及接收到數據標志 0xfe,0xfd,0xfb,0xf7
  4. unsigned int dis_val;    //定義顯示變量
  5. unsigned char i;        //定義動態掃描位的變量
  6. //===========================端口初始化=======================================
  7. void port_init(void)
  8. {
  9. PORTA = 0x00;
  10. DDRA = 0x00;       //PORTA初始化為懸浮輸入
  11. PORTB = 0xff;
  12. DDRB = 0xff;
  13. PORTC = 0xff;
  14. DDRC = 0xff;
  15. }
  16. //===========================ADC初始化========================================
  17. void adc_init(void)
  18. {
  19. ADCSRA = 0xEE;   //使能ADC、開始轉換、自動觸發、使能中斷、8預分頻
  20. ADMUX = 0x40;      //使用AVCC做基準電壓源、數據格式為右對齊、選擇通道0
  21. }
  22. //============================定時器0初始化===================================
  23. void timer0_init(void)
  24. {
  25. TCNT0 = 0x83;      //定時1ms的初始值
  26. TCCR0 = 0x03;      //64預分頻
  27. TIMSK = 0x01;       //使能定時器0溢出中斷
  28. }
  29. //=============================設備初始化=====================================
  30. void init_devices(void)
  31. {
  32. port_init();       //調用端口初始化
  33. timer0_init();     //調用定時器0初始化
  34. adc_init();        //調用ADC初始化
  35. SREG = 0x80;       //打開全局中斷
  36. }
  37. //===============================A/D轉換======================================
  38. unsigned int ADC_Convert(void)
  39. {
  40. unsigned int temp1,temp2;
  41. temp1 = (unsigned int)ADCL;         //先讀取低8位數據
  42. temp2 = (unsigned int)ADCH;         //再讀取高8位數據
  43. temp2 = (temp2<<8)+temp1;          //高8位左移兩位與低8位合并成10位數據
  44. return(temp2);                                //返回合并后的值
  45. }
  46. //==============================數據轉換======================================
  47. unsigned int conv(unsigned int i)
  48. {
  49. long x;
  50. unsigned int y;
  51. x = (4840*(long)i)/1023;      //把變量轉化成需要顯示的形式
  52. y = (unsigned int)x;             //把無符號長整型變量強制轉換成無符號整型變量
  53. return y;                              //返回轉換后的值
  54. }
  55. //==============================主函數========================================
  56. void main(void)
  57. {
  58. init_devices();  //調用設備初始化
  59. while(1)
  60. {
  61.     ;             //空循環
  62. }
  63. }
  64. //=======================中斷函數(定時器0溢出中斷)============================
  65. #pragma vector = TIMER0_OVF_vect
  66. __interrupt void TIMER0_OVF_Server(void)
  67. {
  68. TCNT0 = 0x83;    //重載初值
  69. if(++i>3)        //掃描位數為4位
  70.   i = 0;
  71. switch(i)
  72. {
  73.   case 0:PORTB = SEG7[dis_val%10];          //送個位待顯示的數據
  74.         PORTC = ACT[0];                //打開個位顯示(點亮)
  75.    break;
  76.   case 1:PORTB = SEG7[(dis_val/10)%10];     //送十位待顯示的數據
  77.         PORTC = ACT[1];                //打開十位顯示(點亮)
  78.    break;
  79.   case 2:PORTB = SEG7[(dis_val/100)%10];    //送百位待顯示的數據
  80.         PORTC = ACT[2];                //打開百位顯示(點亮)
  81.    break;
  82.   case 3:PORTB = SEG7[dis_val/1000]&0x7F;   //送千位待顯示的數據并點亮小數點
  83.         PORTC = ACT[3];                //打開千位顯示(點亮)
  84.    break;
  85. }
  86. }
  87. //=======================中斷函數(A/D轉換結束中斷)============================
  88. #pragma vector = ADC_vect
  89. __interrupt void ADC_Server(void)
  90. {
  91.   dis_val = conv(ADC_Convert());        //獲取A/D轉換數據并送顯
  92. }

復制代碼



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

使用道具 舉報

沙發
ID:213173 發表于 2021-3-1 21:32 | 只看該作者
從圖片現象看是顯示函數沒有消隱導致亂碼,實際電路不會出現亂碼但會有鬼影。添加消隱代碼。
  1. //=======================中斷函數(定時器0溢出中斷)============================
  2. #pragma vector = TIMER0_OVF_vect
  3. __interrupt void TIMER0_OVF_Server(void)
  4. {
  5.         TCNT0 = 0x83;    //重載初值
  6.         if(++i>3)        //掃描位數為4位
  7.         i = 0;
  8.         PORTC = 0x00;//消隱
  9.         switch(i)
  10.         {
  11.                 case 0:PORTB = SEG7[dis_val%10];          //送個位待顯示的數據
  12.                 PORTC = ACT[0];                //打開個位顯示(點亮)
  13.                 break;
  14.                 case 1:PORTB = SEG7[(dis_val/10)%10];     //送十位待顯示的數據
  15.                 PORTC = ACT[1];                //打開十位顯示(點亮)
  16.                 break;
  17.                 case 2:PORTB = SEG7[(dis_val/100)%10];    //送百位待顯示的數據
  18.                 PORTC = ACT[2];                //打開百位顯示(點亮)
  19.                 break;
  20.                 case 3:PORTB = SEG7[dis_val/1000]&0x7F;   //送千位待顯示的數據并點亮小數點
  21.                 PORTC = ACT[3];                //打開千位顯示(點亮)
  22.                 break;
  23.         }
  24. }
復制代碼
回復

使用道具 舉報

板凳
ID:44037 發表于 2021-3-2 13:01 | 只看該作者
謝謝指導!  正常顯示了  
      請問 顯示有誤差,怎樣提高精度   x = (4840*(long)i)/1023;   4840 有的程序不是這個值!
      非常感謝。!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视屏 | 三级黄色片在线观看 | av天天操| 久久网国产 | 黄色一级片视频 | 国产日韩一区二区三免费高清 | 亚洲视频二区 | 欧美一级二级视频 | 特黄特色大片免费视频观看 | www.一区二区三区 | 久久久免费 | 99精品电影| 亚洲激精日韩激精欧美精品 | 日韩在线视频精品 | 91亚洲国产成人久久精品网站 | 福利视频日韩 | 久久99视频精品 | 国产精品一区在线播放 | 国产精品日本一区二区在线播放 | 久久精品91久久久久久再现 | 欧美极品在线观看 | www.9191.com | 成人欧美一区二区三区黑人孕妇 | 国产视频1区2区 | 成人免费视频网址 | 成人国产精品入口免费视频 | 国产不卡视频 | 人人叉| av网站在线看 | 国产在线小视频 | 国产激情在线 | 91xxx在线观看 | 日日操夜夜操天天操 | 日韩欧美中文 | 91高清在线观看 | 涩涩视频在线播放 | avmans最新导航地址 | 中文一级片 | 日韩在线观看一区 | 成人在线播放网站 | 一级大片|