找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2123|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

iar for avr 編程 通過 仿真數(shù)碼管顯示不全 請(qǐng)求指導(dǎo)

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




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

復(fù)制代碼



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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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