標(biāo)題: 單片機(jī)pwm+adc+顯示程序 [打印本頁]

作者: wangfushou    時間: 2019-11-11 11:24
標(biāo)題: 單片機(jī)pwm+adc+顯示程序
  1. #include "lcd1602.h"
  2. #include "key.h"
  3. #include "pwm.h"
  4. #include "adc.h"
  5. #include "gpio.h"


  6. uint8 code table1[]="set:";       //要顯示的內(nèi)容1放入數(shù)組table1 cold,warm
  7. uint8 code table11[]="cold";
  8. uint8 code table12[]="warm";
  9. uint8 code table2[]="now:";                //要顯示的內(nèi)容2放入數(shù)組table2
  10. uint8 set_temperature=20,now_temperature=0;                //設(shè)定溫度默認(rèn)22度
  11. uint8 set_shi=0,set_ge=0,now_shi=0,now_ge=0;
  12. uint8 cold_flag=1,warm_flag=0;                                //默認(rèn)制熱模式
  13. uint8 duty=0;

  14. void adc_handle()
  15. {
  16.         uint8 i;
  17.         now_temperature=Get_ADC10bitResult(7);//讀取p1.7口adc轉(zhuǎn)換的值
  18.         for(i=1;i<50;i++)
  19.         {
  20.                 if(now_temperature>=i*15&&now_temperature<=(i+1)*15)
  21.                         now_temperature=30-i;
  22.         }
  23. }

  24. void display()
  25. {
  26.         DisplayListChar(0, 0, table1);       //從第一行第1列開始顯示內(nèi)容1
  27.         set_shi=set_temperature/10+'0';                        //數(shù)字轉(zhuǎn)化為字符
  28.         set_ge=set_temperature%10+'0';
  29.         DisplayOneChar(4,0,set_shi);                                //顯示一個字符
  30.         DisplayOneChar(5,0,set_ge);
  31.         if(cold_flag==1)                                                                                //顯示“cold”
  32.         {
  33.                 DisplayListChar(9, 0, table11);
  34.                 if(set_temperature>=now_temperature)
  35.                         {
  36.                         PWMx_SetPwmWide(PWM7_ID,249, 0x00FA);                //實(shí)際為P0.6口 輸出電壓3.3*(1-前數(shù)/后數(shù))
  37.                         PWMx_SetPwmWide(PWM6_ID,249, 0x00FA);  //輸出電壓為0        
  38.                         }        
  39.                 if(set_temperature<now_temperature)
  40.                         {
  41.                         signed int error=0,last_error=0,now_error=0;
  42.                         last_error=now_error;                                                                //保存上一次的誤差
  43.                         error=now_temperature-set_temperature;                //計(jì)算現(xiàn)在的誤差
  44.                         now_error=error;                                                                        //保存現(xiàn)在的誤差
  45.                         duty=251-((now_temperature-set_temperature)*25+(now_error-last_error)*0.8);
  46.                         PWMx_SetPwmWide(PWM7_ID,duty, 0x00FA);                //實(shí)際為P0.6口 輸出電壓3.3*(1-前數(shù)/后數(shù))
  47.                         PWMx_SetPwmWide(PWM6_ID,249, 0x00FA);  //輸出電壓為0
  48.                         }
  49.         }

  50.         
  51.         if(warm_flag==1)
  52.         {
  53.                 DisplayListChar(9, 0, table12);
  54.                 if(set_temperature<=now_temperature)
  55.                         {
  56.                         PWMx_SetPwmWide(PWM7_ID,249, 0x00FA);                //實(shí)際為P0.6口 輸出電壓3.3*(1-前數(shù)/后數(shù))
  57.                         PWMx_SetPwmWide(PWM6_ID,249, 0x00FA);
  58.                         }
  59.                 if(set_temperature>now_temperature)
  60.                         {
  61.                                 signed int error=0,last_error=0,now_error=0;
  62.                                 last_error=now_error;                                                                //保存上一次的誤差
  63.                                 error=set_temperature-now_temperature;                //計(jì)算現(xiàn)在的誤差
  64.                                 now_error=error;                                                                        //保存現(xiàn)在的誤差
  65.                                 duty=251-((set_temperature-now_temperature)*25+(now_error-last_error)*0.8);
  66.                                 PWMx_SetPwmWide(PWM7_ID,249, 0x00FA);                //實(shí)際為P0.6口 輸出電壓3.3*(1-前數(shù)/后數(shù))
  67.                                 PWMx_SetPwmWide(PWM6_ID,duty, 0x00FA);                                 
  68.                         }
  69.         }
  70.         DisplayListChar(0, 1, table2);       //從第二行第9列開始顯示內(nèi)容2
  71.         adc_handle();                                                                                                //adc處理函數(shù)
  72.         now_shi=now_temperature/10+'0';
  73.         now_ge=now_temperature%10+'0';
  74.         DisplayOneChar(4,1,now_shi);
  75.         DisplayOneChar(5,1,now_ge);
  76. }

  77. int main()        
  78. {     
  79.   lcd_init();                 //液晶初始化
  80.         key_init();                                                                        //按鍵初始化
  81.         PWM_config();                                                                //pwm配置
  82.         ADC_config();              //ADC初始化
  83.         PWMx_SetPwmWide(PWM7_ID,249, 0x00FA);                //實(shí)際為P0.6口 輸出電壓3.3*(1-前數(shù)/后數(shù))
  84.         PWMx_SetPwmWide(PWM6_ID,249, 0x00FA);  //輸出電壓為0
  85.   while(1)
  86.         {
  87.                 scan_key();                                        //按鍵掃描
  88.                 display();                                        //顯示
  89.         }
  90. }
復(fù)制代碼


15 溫度傳感器.rar

119.25 KB, 下載次數(shù): 41, 下載積分: 黑幣 -5


作者: zyx@    時間: 2020-8-12 22:07
沒仿真,都不知都功能能不能實(shí)現(xiàn)




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