找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1716|回复: 1
打印 上一主题 下一主题
收起左侧

单片机pwm+adc+显示程序

[复制链接]
跳转到指定楼层
楼主
ID:528775 发表于 2019-11-11 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  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:";       //要显示的内容1放入数组table1 cold,warm
  7. uint8 code table11[]="cold";
  8. uint8 code table12[]="warm";
  9. uint8 code table2[]="now:";                //要显示的内容2放入数组table2
  10. uint8 set_temperature=20,now_temperature=0;                //设定温度默认22度
  11. uint8 set_shi=0,set_ge=0,now_shi=0,now_ge=0;
  12. uint8 cold_flag=1,warm_flag=0;                                //默认制热模式
  13. uint8 duty=0;

  14. void adc_handle()
  15. {
  16.         uint8 i;
  17.         now_temperature=Get_ADC10bitResult(7);//读取p1.7口adc转换的值
  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列开始显示内容1
  27.         set_shi=set_temperature/10+'0';                        //数字转化为字符
  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);                //实际为P0.6口 输出电压3.3*(1-前数/后数)
  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;                //计算现在的误差
  44.                         now_error=error;                                                                        //保存现在的误差
  45.                         duty=251-((now_temperature-set_temperature)*25+(now_error-last_error)*0.8);
  46.                         PWMx_SetPwmWide(PWM7_ID,duty, 0x00FA);                //实际为P0.6口 输出电压3.3*(1-前数/后数)
  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);                //实际为P0.6口 输出电压3.3*(1-前数/后数)
  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;                //计算现在的误差
  64.                                 now_error=error;                                                                        //保存现在的误差
  65.                                 duty=251-((set_temperature-now_temperature)*25+(now_error-last_error)*0.8);
  66.                                 PWMx_SetPwmWide(PWM7_ID,249, 0x00FA);                //实际为P0.6口 输出电压3.3*(1-前数/后数)
  67.                                 PWMx_SetPwmWide(PWM6_ID,duty, 0x00FA);                                 
  68.                         }
  69.         }
  70.         DisplayListChar(0, 1, table2);       //从第二行第9列开始显示内容2
  71.         adc_handle();                                                                                                //adc处理函数
  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);                //实际为P0.6口 输出电压3.3*(1-前数/后数)
  84.         PWMx_SetPwmWide(PWM6_ID,249, 0x00FA);  //输出电压为0
  85.   while(1)
  86.         {
  87.                 scan_key();                                        //按键扫描
  88.                 display();                                        //显示
  89.         }
  90. }
复制代码


15 温度传感器.rar

119.25 KB, 下载次数: 41, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:813457 发表于 2020-8-12 22:07 | 只看该作者
没仿真,都不知都功能能不能实现
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表