找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2426|回复: 1
收起左侧

单片机+ADC0832电炉丝控制程序+Proteus仿真

[复制链接]
ID:479983 发表于 2020-5-11 10:56 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>    //Keil library
  4. #include <stdio.h>         //Keil library
  5. #include "lcd.h"
  6. //#include "DHT111.h"
  7. //#include "DS18B20.h"
  8. #include "ADC0832.h"

  9. #define uchar unsigned char

  10. sbit pwm_out =P1^5;
  11. sbit k1 =P2^3;
  12. sbit k2 =P2^4;

  13. sbit key1 =P3^4;
  14. sbit key2 =P3^5;
  15. sbit key3 =P3^6;
  16. sbit key4 =P3^7;
  17. ////延时函数
  18. void delay(int z)                //z为毫秒数
  19. {
  20.         int x,y;
  21.         for(x=z;x>0;x--)
  22.                 for(y=125;y>0;y--);
  23. }

  24. void delay_us(unsigned int z)                //z为毫秒数
  25. {
  26.         TH1=0X00;
  27.         TL1=0X00;
  28.         TR1=1;
  29.         while((256*TH1+TL1)<z);
  30.   TR1=0;
  31. }

  32. unsigned int tim0_cnt=0;// init=1000,
  33. float zhankong=0.5;

  34. void timer0()interrupt 3{
  35.         
  36. //          tim0_cnt++;
  37. //        if(tim0_cnt>=100) tim0_cnt=0;
  38. //        
  39. //        if(tim0_cnt%2==0)
  40. //        {
  41. //                 pwm_out=0;
  42. //                init=20000;//(int)(zhankong*50000);
  43. //          TH0 = (65536 - init) / 256;
  44. //                TL0 = (65536 - init) % 256;
  45. //        }
  46. //        else
  47. //        {
  48. //                 pwm_out=1;
  49. //                init=30000;//(int)(50000-zhankong*50000);
  50. //          TH0 = (65536 - init) / 256;
  51. //                TL0 = (65536 - init) % 256;
  52. //  }
  53. }

  54. /***********************************************************************************************************************************************************/
  55. //主函数

  56. char set[]="set:",now[]="now:";

  57. void main()
  58. {
  59.         unsigned int cnt=0;
  60.         //value humi_val,temp_val;                //定义两个共同体,一个用于湿度,一个用于温度
  61.         float voltage=0,set_voltage=20.0;
  62. ////        float dew_point;                            //用于记录露点值
  63. //        unsigned char error;                    //用于检验是否出现错误
  64. //        unsigned char checksum;                        //CRC                        
  65. //        uchar TEMP1[5];                                         //用于记录温度
  66. //        uchar HUMI1[5];                                         //用于记录湿度
  67.         unsigned char set_temp=20,i;
  68.                 LcdInit();               
  69.         for(i=0;i<4;i++)
  70.         {
  71.         LcdWriteCom(0x80+i);
  72.         LcdWriteData(set[i]);        
  73.         }        
  74.                 for(i=0;i<4;i++)
  75.         {
  76.         LcdWriteCom(0x80+0x40+i);
  77.         LcdWriteData(now[i]);        
  78.         }        
  79.         //LCD_Initial();                                           //初始化液晶                  
  80. //           GotoXY(0,0);                                           //选择温度显示位置
  81. //           Print("NOW:      C");                           //5格空格
  82. //         GotoXY(0,1);                                           //选择湿度显示位置
  83. //           Print("SET:      C");                           //5格空格
  84.         
  85.         //s_connectionreset();                           //启动连接复位
  86.          // Init_DS18B20();
  87.            TMOD=0x10;
  88. //          TH0 = (65536 - 50000) / 256;
  89. //                TL0 = (65536 - 50000) % 256;
  90.                 TL1=0X00;
  91.                 TH1=0X00;
  92. //        ET0=1;
  93.           EA=0;
  94.         TR0=0;
  95.         TR1=0;
  96.         
  97.         while(1)
  98.         {
  99.                 cnt++;
  100.                 if(key1==0) { delay(200); if(key1==0) if(set_voltage<99)set_voltage++;}
  101.                 if(key2==0) { delay(200); if(key2==0) if(set_voltage>0)set_voltage--;}
  102.                 if(key3==0) { delay(200); if(key3==0) if(set_voltage<99)set_voltage=set_voltage+0.1;}
  103.                 if(key4==0) { delay(200); if(key4==0) if(set_voltage>1)set_voltage=set_voltage-0.1;}
  104.                
  105.                 voltage =(float)read0832();
  106.                 voltage = 5.0 * voltage/256;
  107.                 voltage=20*voltage;
  108.                
  109.                 if(voltage<=set_voltage){k1=1;k2=0;}
  110.           else if(voltage>set_voltage){k1=0;k2=1;}  //
  111.                                        
  112.                                 //set_voltage=humi_val.f/10;
  113.                         //        if(set_voltage>4.1)set_voltage=4.1;
  114.                                 
  115.                    if(cnt>=10){cnt=0; LCD_display(set_voltage, voltage);}
  116.                                 //temp=(int)(voltage*100);  
  117.                         delay(10);                             //等待足够长的时间,以进行下一次转换      
  118.                 }
  119.             
  120.         }
复制代码

所有资料51hei提供下载:
电炉丝控制.zip (163.08 KB, 下载次数: 57)
回复

使用道具 举报

ID:751513 发表于 2020-5-14 11:02 | 显示全部楼层
很有用的资料
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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