一升水在1kw电炉下加热,要求水温在一定范围内可由人工设定,并能在环境温度降低时自动调节,以保证设定的温度基本不变。设计一个可以驱动1kW加热负载的水温控制器,具体要求如下
(1)能够测量温度,温度用数字显示。
(2)测量温度范围0~100℃,测量精度为0.5℃。
(3)能够设置水温控制温度,设定范围40~90℃,且连续可调。
(4)水温控制精度≤ 2℃。
(5)当超过设定的温度20℃时,产生声、光报警。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include<wendu.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit key4=P3^6;
- sbit led1=P3^7;
- sbit led=P3^3;
- sbit shenwen=P3^4;
- sbit baojing=P3^5;
-
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xbf,0xc7,0x89};
- uchar code tab3[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x3f,0xff};
- uchar yi,er,san,si,san1;
- uint shangxian=90,xiaxian=40,flag=0,teding=20,ling=0,bai=100;
- void delay(int ma);
- void display1(uchar yi,uchar er,uchar san,uchar si);
- void display2(uchar yi,uchar er,uchar san1,uchar si);
- void keyscan();
- void main()
- {
- float wendu=0;
- int wenduzhen=0;
- yi=11;er=11;san=11;si=11;
- shenwen=1;//关闭继电器
-
- while(1)
- {
- keyscan();
- if(flag==0)//温度测试界面
- {
- wendu=temget();
-
- if(wendu<xiaxian)//烧水
- {
- shenwen=0;
- }
- else if(wendu>=xiaxian)
- {
- shenwen=1;//烧水功能关闭
- }
-
- if(((wendu>=teding)&&(key4==0)))//报警开启
- {
- baojing=0;
-
- }
- else if((wendu<teding))//报警关闭
- {
- baojing=1;
-
- }
- if(((wendu>=teding)))//报警开启
- {
-
- led1=1;
- }
- else if((wendu<teding))//报警关闭
- {
-
- led1=0;
- }
- wenduzhen=wendu*10;
- yi=wenduzhen/1000;
- er=wenduzhen%1000/100;
- san=wenduzhen%100/10;
- si=wenduzhen%10;
-
- display1(yi,er,san,si);
- }
-
- else if(flag==1)//温度下限设置界面
- {
- yi=13;er=12;
- san1=xiaxian%100/10;
- si=xiaxian%10;
-
- display2(yi,er,san1,si);
- }
- else if(flag==2)//温度上限设置界面
- {
- yi=14;er=12;
- san1=shangxian%100/10;
- si=shangxian%10;
-
- display2(yi,er,san1,si);
- }
-
- if((wendu>shangxian)||(wendu<xiaxian))//温度超过上限低于下限led亮
- {
- led=0;
- }
- else if((wendu>=xiaxian)&&(wendu<=shangxian))
- {
- led=1;
- }
-
- }
- }
- void keyscan()
- {
- if(key1==0)//设置界面
- {
- delay(5);
- if(key1==0)
- {
- flag++;
- if(flag>2)flag=0;
- }
- while(!key1);
- }
- if(key2==0)//加数值
- {
- delay(5);
- if(key2==0)
- {
- if(flag==1)
- {
- xiaxian++;
- if(xiaxian>=89)xiaxian=89;
- }
- else if(flag==2)
- {
- shangxian++;
- if(shangxian>=90)shangxian=90;
- }
- }
- while(!key2);
- }
- if(key3==0)//减数值
- {
- delay(5);
- if(key3==0)
- {
- if(flag==1)
- {
- xiaxian--;
- if(xiaxian<0)xiaxian=0;
- }
- else if(flag==2)
- {
- shangxian--;
- if(shangxian<1)xiaxian=1;
- }
- }
- while(!key3);
- }
-
-
- }
- void display1(uchar yi,uchar er,uchar san,uchar si)
- {
- P2=0X01;
- P0=tab[yi];
- delay(1);
-
- P2=0X02;
- P0=tab[er];
- delay(1);
- P2=0X04;
- P0=tab3[san];
- delay(1);
-
- P2=0X08;
- P0=tab[si];
- delay(1);
- }
- void display2(uchar yi,uchar er,uchar san1,uchar si)
- {
- P2=0X01;
- P0=tab[yi];
- delay(1);
-
- P2=0X02;
- P0=tab[er];
- delay(1);
- P2=0X04;
- P0=tab[san1];
- delay(1);
-
- P2=0X08;
- P0=tab[si];
- delay(1);
- }
- void delay(int ms)
- {
- int i,a;
- for(i=ms;i>0;i--)
- for(a=125;a>0;a--);
- }
复制代码
所有资料51hei提供下载:
仿真图.zip
(86.27 KB, 下载次数: 140)
参考资料.7z
(1.44 MB, 下载次数: 142)
|