智能熱得快仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (22.74 KB, 下載次數: 43)
下載附件
2018-7-1 04:26 上傳
0.png (10.6 KB, 下載次數: 32)
下載附件
2018-7-1 04:26 上傳
單片機源程序:
- /*頭文件*/
- #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);
- }
- /*****讀一個字節(jié)*****/
- 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);
- }
- /*****寫一個字節(jié)*****/
- 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, 下載次數: 180)
2018-7-1 04:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|