智能热得快仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序:
- /*头文件*/
- #include<reg52.h>
- #include <intrins.h>
- /*****************宏定义******************/
- #define uint unsigned int
- #define uchar unsigned char
- /***********位操作端口定义**************/
- sbit set_key=P1^4; //“设置”键 K1
- sbit add_key=P1^5; //“加”键 K2
- sbit cut_key=P1^6; // “减”键 K3
- sbit speak=P3^7; // 蜂鸣器
- sbit JK1=P3^6; // 温度继电器
- sbit JK2=P3^5; // 水位继电器
- sbit DQ1=P3^3;
- sbit qian_wei=P0^7;
- sbit bai_wei=P0^6;
- sbit shi_wei=P0^5;
- sbit ge_wei=P0^4;
- sbit led4=P0^3; //满水位指示灯红色
- sbit led3=P0^2; //3/4水位指示灯
- sbit led2=P0^1; //1/2水位指示灯
- sbit led1=P0^0; //1/4水位指示灯
- sbit SW041=P1^0; //1/4水位
- sbit SW021=P1^1; //1/2水位
- sbit SW043=P1^2; //3/4水位
- sbit SW01=P1^3; //满水位
- uchar bianma[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14,0xf6};
- uchar flog4;
- uint DD1;
- uchar T_data[4]={0,0,0,0};
- uchar Set_data[3]={0,0,0};
- uint HT=300,LT;
- void delay_1ms(uchar i)
- {
- uint x,y;
- for(x=i;x>0;x--)
- for(y=124;y>0;y--);
- }
- void data_pro()
- {
- Set_data[0]=HT/1000;
- Set_data[1]=(HT%1000)/100;
- Set_data[2]=(HT%100)/10;
- }
- /*****延时子程序*****/
- void Delay_DS18B20(int num)
- {
- while(num--) ;
- }
- /*****初始化DS18B20*****/
- void Init_DS18B20(void)
- {
- uchar x=0;
- DQ1=1; //DQ复位
- Delay_DS18B20(2); //稍做延时
- DQ1=0; //单片机将DQ拉低
- Delay_DS18B20(80); //精确延时,大于480us
- DQ1=1; //拉高总线
- Delay_DS18B20(14);
- x=DQ1; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
- Delay_DS18B20(20);
- }
- /*****读一个字节*****/
- uchar ReadOneChar(void)
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--) //串行接收数据
- {
- DQ1=0; // 给脉冲信号
- dat>>=1;
- DQ1=1; // 给脉冲信号
- if(DQ1)
- dat|=0x80;
- Delay_DS18B20(8);
- }
- return(dat);
- }
- /*****写一个字节*****/
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ1=0;
- DQ1=dat&0x01; //写入最低位
- Delay_DS18B20(10);
- DQ1=1;
- dat>>=1; //右移一位
- }
- }
- /*****读取温度*****/
- uint ReadTemperature(void)
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
- float tt=0;
- Init_DS18B20(); //初始化DS18B20
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0x44); //启动温度转换
- Delay_DS18B20(20);
- Init_DS18B20(); //初始化DS18B20
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
- a=ReadOneChar(); //读低8位
- b=ReadOneChar(); //读高8位
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10+0.5; //放大10倍输出并四舍五入
- return(t);
- }
- void pos_data()
- {
- DD1=ReadTemperature();
- T_data[0]=DD1/1000;
- T_data[1]=(DD1%1000)/100;
- T_data[2]=(DD1%100)/10;
- T_data[3]=DD1%10;
- }
- void display_set() //温度报警值设置
- {
- qian_wei=0;
- bai_wei=1;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[10];
- delay_1ms(5);
- qian_wei=1;
- bai_wei=0;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[Set_data[0]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=0;
- ge_wei=1;
- P2=bianma[Set_data[1]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=1;
- ge_wei=0;
- P2=bianma[Set_data[2]];
- delay_1ms(5);
- P2=0xff;
- }
- void display() //测量值显示
- {
- qian_wei=0;
- bai_wei=1;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[0];
- delay_1ms(5);
- qian_wei=1;
- bai_wei=0;
- shi_wei=1;
- ge_wei=1;
- P2=bianma[T_data[1]];
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=0;
- ge_wei=1;
- P2=bianma[T_data[2]]&0xfb;
- delay_1ms(5);
- P2=0xff;
- qian_wei=1;
- bai_wei=1;
- shi_wei=1;
- ge_wei=0;
- P2=bianma[T_data[3]];
- delay_1ms(5);
- P2=0xff;
- }
- /********** 报警处理函数******************/
- void baojing()
- {
- LT=HT-50; //测量温度低于设定温度10度以下时 重新加热
- if(HT<DD1) //如果温度超过上限 停止加热
- {
- JK1=1;
- }
- if(DD1<LT) //如果温度低于下限 开始加热
- {
- JK1=0;
- }
- if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1)) //0水位 指示 启动水泵加水
- {
- led1=1;
- led2=1;
- led3=1;
- led4=1;
- JK2=0;
- }
-
- if((SW01==0)&&(SW043==1)&&(SW021==1)&&(SW041==1)) //1/4水位指示
- {
- led1=0;
- led2=1;
- led3=1;
- led4=1;
- }
- if((SW01==0)&&(SW043==0)&&(SW021==1)&&(SW041==1)) //1/2水位指示
- {
- led1=0;
- led2=0;
- led3=1;
- led4=1;
- }
- if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==1)) //3/4水位指示
- {
- led1=0;
- led2=0;
- led3=0;
- led4=1;
- }
- if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==0)) //如果水满了 指示灯指示 停止加水
- {
- led1=0;
- led2=0;
- led3=0;
- led4=0;
- JK2=1;
- }
- if(((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1))||(HT<DD1)||(DD1<LT)) //缺水或者 温度超过上限 蜂鸣器响
- {
- speak=0;
- }
- else
- {
- speak=1;
- }
- }
- /**********主函数******************/
- void main()
- {
- data_pro();
- while(1)
- {
- if(set_key==0)
- {
- delay_1ms(5);
- if(set_key==0)
- {
- flog4=!flog4;
- while(set_key==0);
- }
- }
- if(flog4==1)
- {
- speak=1;
- if(add_key==0)
- {
- delay_1ms(5);
- if(add_key==0)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
智能热得快.rar
(354.99 KB, 下载次数: 179)
|