標(biāo)題: ATMEGA16L實(shí)現(xiàn)時(shí)間和溫度的循環(huán)顯示程序分享 [打印本頁]

作者: 20170805    時(shí)間: 2017-8-5 18:14
標(biāo)題: ATMEGA16L實(shí)現(xiàn)時(shí)間和溫度的循環(huán)顯示程序分享
  1. //ICC-AVR application builder : 2/13 20:52:33
  2. /*******************************************************************************
  3. * 版權(quán):     
  4. *
  5. * 單片機(jī):   ATMAGE16L
  6. * 晶振:     外部8MHz
  7. * 編譯器:   ICC 7.22
  8. *
  9. * 文件名:   main.c
  10. * 作者:     木子工作室
  11. * 版本:     1.0
  12. * 完成日期:
  13. * 功能描述: 在12M晶振下,實(shí)現(xiàn)時(shí)間和溫度的循環(huán)顯示
  14. *******************************************************************************/
  15. //#include<avr/io.h>
  16. #include <iom16v.h>
  17. #include <macros.h>

  18. #define LED0 PORTD
  19. #define LED1 PORTB

  20. #define BEEL_OFF PORTC |= BIT(0);
  21. #define BEEL_ON PORTC &= ~BIT(0);

  22. unsigned char i=0,f=0,n=0,xx=0,fangduan=0,ADC_LL=0,ADC_HH=0;
  23. unsigned int x = 0,t=0,t1=0,s0=0,s1=0,m0=0,m1=0,h0=0,h1=0,s=0,h=8,m=15,mid=0,a=0,g=240,b=180,c,d,e,o=1,p,q,r,T,ADC_H=0;
  24. unsigned char tab[16] = {0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X77,0X7c,0X39,0X5e,0X79,0X71};//正常字模
  25. unsigned char tab1[10] = {0Xbf,0X86,0Xdb,0Xcf,0Xe6,0Xed,0Xfd,0X87,0Xff,0Xef};//帶下小數(shù)點(diǎn)字模
  26. unsigned char tab2[2] = {0X61,0X40};//度C,"-"號


  27. unsigned int CBM[130] = {19,33,38,44,56,59,61,63,65,67,69,71,73,76,78,81,83,86,89,92,94,98,101,104,108,111,115,119,123,127,131,135,140,145,149,154,160,165,171,176,182,188,194,200,207,214,220,228,235,243,250,258,267,275,284,293,302,311,321,331,341,351,361,372,382,393,405,416,428,439,451,463,475,487,500,512,525,537,550,562,576,588,601,613,626,638,645,651,657,663,675,688,699,711,723,734,746,757,768,779,789,799,809,818,828,837,846,855,863,871,878,886,893,900,907,913,919,925,931,936,941,946,951,952,959,963,967,970,980,990};
  28. unsigned int CBT[130] = {1190,995,950,900,820,800,790,780,770,760,750,740,730,720,710,700,690,680,670,660,650,640,630,620,610,600,590,580,570,560,550,540,530,519,511,501,490,481,470,460,450,440,430,420,410,400,391,380,371,360,351,341,330,320,310,300,290,281,270,260,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,2005,2010,2015,2020,2030,2040,2050,2060,2070,2080,2090,2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,2450,2460};

  29. /*******************************************************************************
  30. * 函數(shù)名稱: WDCB()
  31. * 入口參數(shù):
  32. * 出口參數(shù):
  33. * 功能描述:  溫度查表
  34. *******************************************************************************/
  35. int WDCB() //用int 類型的函數(shù)是想讓return命令生效!使一旦查到結(jié)果就跳出FOR,節(jié)省CPU資源。
  36. {
  37.   for(c=0;c<129;c++)
  38.      {
  39.           if(CBM[c]==ADC_H)
  40.             {
  41.                  d=c;
  42.                  T=CBT[d];
  43.                  if(T>2000)
  44.                    {
  45.                     f=1;
  46.                     T=(T-2000)/10;
  47.                          }
  48.                  return ;//使一旦查到結(jié)果就跳出FOR,節(jié)省CPU資源。
  49.                  }
  50.           if(c<=84 & ADC_H>CBM[c] & ADC_H<CBM[c+1])
  51.             {
  52.                  T=CBT[c]-((ADC_H-CBM[c])*((CBT[c]-CBT[c+1])*10/(CBM[c+1]-CBM[c])))/10; //按照CBM[]和CBT[]的區(qū)間比例關(guān)系折算實(shí)際溫度,可大幅降低數(shù)組容量又不失精確。
  53.                  f=0;  //判斷正負(fù)溫度
  54.                  return ;//用int 類型的函數(shù)是想讓return命令生效!使一旦查到結(jié)果就跳出FOR,節(jié)省CPU資源。
  55.                  }
  56.           if(c>=85 & ADC_H>CBM[c] & ADC_H<CBM[c+1])
  57.             {
  58.                  T=((CBT[c]+((ADC_H-CBM[c])*((CBT[c+1]-CBT[c])*10/(CBM[c+1]-CBM[c])))/10)-2000)/10; //按照CBM[]和CBT[]的區(qū)間比例關(guān)系折算實(shí)際溫度,可大幅降低數(shù)組容量又不失精確。
  59.                  f=1;  //判斷正負(fù)溫度
  60.                  return ;//使一旦查到結(jié)果就跳出FOR,節(jié)省CPU資源。return后面加不加T,好像對返回T值沒啥影響。
  61.                  }         
  62.           }

  63. }


  64. /*******************************************************************************
  65. * 函數(shù)名稱: Disp_Time()
  66. * 入口參數(shù):
  67. * 出口參數(shù):
  68. * 功能描述:  顯示時(shí)間
  69. *******************************************************************************/
  70. void Disp_Time(void)
  71.         {        
  72.         //BEEL_ON;   
  73.            for(i=0;i<4;i++)
  74.              {

  75.                    PORTD = 0X1F;
  76.                    if(xx==1)
  77.                      {q=a%30;} //設(shè)置閃爍周期
  78.                    if(xx==2)
  79.                      {r=a%30;}//設(shè)置閃爍周期
  80.                    if(i==0)
  81.              {
  82.                      LED1 = tab[m0];
  83.                          if(q<15 | o==0)//q設(shè)置亮屏?xí)r長,o是按鍵之后一小段時(shí)間內(nèi),并上o的條件是讓校時(shí)操作別閃煉太快。
  84.                        {PORTD&= ~BIT(3);}
  85.                          else
  86.                            {PORTD|= BIT(3);}  //黑屏
  87.                           }
  88.                    if(i==1)
  89.              {
  90.                      LED1 = tab[m1];
  91.                          PORTD|= BIT(4);//B端口4位置1, ":"號
  92.                          if(q<15 | o==0)//q設(shè)置亮屏?xí)r長,o是按鍵之后一小段時(shí)間內(nèi),并上o的條件是讓校時(shí)操作別閃煉太快。
  93.                        {PORTD&= ~BIT(2);}
  94.                          else
  95.                            {PORTD|= BIT(2);}
  96.                           }
  97.                    if(i==2)
  98.              {
  99.                      LED1 = tab[h0];
  100.                          if(r<15 | o==0)//q設(shè)置亮屏?xí)r長,o是按鍵之后一小段時(shí)間內(nèi),并上o的條件是讓校時(shí)操作別閃煉太快。
  101.                        {PORTD&= ~BIT(1);}
  102.                          else
  103.                            {PORTD|= BIT(1);}
  104.                           }
  105.                    if(i==3)
  106.              {
  107.                      LED1 = tab[h1];
  108.                          if(r<15 | o==0)//q設(shè)置亮屏?xí)r長,o是按鍵之后一小段時(shí)間內(nèi),并上o的條件是讓校時(shí)操作別閃煉太快。
  109.                        {PORTD&= ~BIT(0);}
  110.                          else
  111.                            {PORTD|= BIT(0);}
  112.                          }
  113.                    delay_ms(60);
  114.                    PORTB = 0X00;
  115.                   }//FOR尾
  116.         }

  117.         
  118.         
  119. /*******************************************************************************
  120. * 函數(shù)名稱: Disp_Wd()
  121. * 入口參數(shù):
  122. * 出口參數(shù):
  123. * 功能描述:  顯示溫度
  124. *******************************************************************************/
  125. void Disp_Wd(void)
  126.         {
  127.         
  128.         //BEEL_OFF;
  129.           if(f==0)        //顯示正溫度
  130.           {
  131.            for(i=0;i<4;i++)
  132.              {
  133.                   
  134.                    //PORTB = 0X00;
  135.                    if(i==0)
  136.              {
  137.                      LED1 = tab2[0];
  138.                      PORTD&= ~BIT(3);
  139.                           }
  140.                    if(i==1)
  141.              {
  142.                      LED1 = tab[m0];
  143.                      PORTD&= ~BIT(2);
  144.                           }
  145.                    if(i==2)
  146.              {
  147.                      LED1 = tab1[m1];
  148.                      PORTD&= ~BIT(1);
  149.                           }
  150.                    if(i==3)
  151.              {
  152.                      LED1 = tab[h0];
  153.                      PORTD&= ~BIT(0);
  154.                           }        
  155.                    PORTD|= BIT(5);//B端口5位置1, "上點(diǎn)"號
  156.                    delay_ms(60);
  157.                    PORTD = 0X0F;
  158.                }
  159.                  }
  160.          else  //顯示負(fù)溫度
  161.          {
  162.           for(i=0;i<4;i++)
  163.              {
  164.                    //PORTB = 0X0F;
  165.                    //PORTB = 0X00;
  166.                    if(i==0)
  167.              {
  168.                      LED1 = tab2[0];
  169.                      PORTD&= ~BIT(3);
  170.                           }
  171.                    if(i==1)
  172.              {
  173.                      LED1 = tab[m0];
  174.                      PORTD&= ~BIT(2);
  175.                           }
  176.                    if(i==2)
  177.              {
  178.                      LED1 = tab[m1];
  179.                      PORTD&= ~BIT(1);
  180.                           }
  181.                    if(i==3)
  182.              {
  183.                      LED1 = tab2[1];
  184.                      PORTD&= ~BIT(0);
  185.                           }        
  186.                    PORTD|= BIT(5);//B端口5位置1, "上點(diǎn)"號
  187.                    delay_ms(60);
  188.                    PORTD = 0X0F;
  189.                }
  190.           }
  191.         }


復(fù)制代碼





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