基于51单片机的智能鱼缸温度控制器protues仿真
生活随笔
收集整理的這篇文章主要介紹了
基于51单片机的智能鱼缸温度控制器protues仿真
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
硬件設計
(末尾附文件)
代碼設計
#include <reg51.h> #define uint unsigned int #define uchar unsigned char //宏定義 #define LCD1602 P0 sbit SET=P3^1; //定義調整鍵 sbit DEC=P3^2; //定義減少鍵 sbit ADD=P3^3; //定義增加鍵 sbit BUZZ=P3^6; //定義蜂鳴器 sbit ALAM=P1^2; //定義燈光報警 sbit ALAM1=P1^4; sbit DQ=P3^7; //定義DS18B20總線I/O sbit RS = P2^7; sbit EN = P2^6; bit shanshuo_st; //閃爍間隔標志 bit beep_st; //蜂鳴器間隔標志 uchar x=0; //計數器uchar code tab1[]={"Now Tem: . C "}; uchar code tab2[]={"TH: C TL: C"}; uint c; uchar Mode=0; //狀態標志 signed char TH=40; //上限報警溫度,默認值為40 signed char TL=10; //下限報警溫度,默認值為10 //============================================================================================ //====================================DS18B20================================================= //============================================================================================ /*****延時子程序*****/ void Delay_DS18B20(int num) {while(num--) ; } void delay(uint xms)//延時函數,有參函數 {uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--); } /*****初始化DS18B20*****/ void Init_DS18B20(void) {unsigned char x=0;DQ = 1; //DQ復位Delay_DS18B20(8); //稍做延時DQ = 0; //單片機將DQ拉低Delay_DS18B20(80); //精確延時,大于480usDQ = 1; //拉高總線Delay_DS18B20(14);x = DQ; //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗Delay_DS18B20(20); } /*****讀一個字節*****/ unsigned char ReadOneChar(void) {unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 給脈沖信號dat>>=1;DQ = 1; // 給脈沖信號if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat); } /*****寫一個字節*****/ void WriteOneChar(unsigned char dat) {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;} } /*****讀取溫度*****/ unsigned int ReadTemperature(void) {unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳過讀序號列號的操作WriteOneChar(0x44); //啟動溫度轉換Init_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倍輸出并四舍五入t= tt*10+0.5; return(t); }/*****讀取溫度*****/ void check_wendu(void) {c=ReadTemperature()-5; //獲取溫度值并減去DS18B20的溫漂誤差if(c>1200)c=1200; }/********液晶寫入指令函數與寫入數據函數,以后可調用**************/void write_1602com(uchar com)//****液晶寫入指令函數**** {RS=0;//數據/指令選擇置為指令 // rw=0; //讀寫選擇置為寫LCD1602=com;//送入數據delay(1);EN=1;//拉高使能端,為制造有效的下降沿做準備delay(1);EN=0;//en由高變低,產生下降沿,液晶執行命令 }void write_1602dat(uchar dat)//***液晶寫入數據函數**** {RS=1;//數據/指令選擇置為數據 // rw=0; //讀寫選擇置為寫LCD1602=dat;//送入數據delay(1);EN=1; //en置高電平,為制造下降沿做準備delay(1);EN=0; //en由高變低,產生下降沿,液晶執行命令 }void lcd_init()//***液晶初始化函數**** {uchar a;write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據write_1602com(0x0c);//開顯示不顯示光標write_1602com(0x06);//整屏不移動,光標自動右移write_1602com(0x01);//清顯示write_1602com(0x80);//日歷顯示固定符號從第一行第1個位置之后開始顯示for(a=0;a<16;a++){write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分delay(3);}write_1602com(0x80+0x40);//時間顯示固定符號寫入位置,從第2個位置后開始顯示for(a=0;a<16;a++){write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號delay(3);}}void display() {if(Mode==0){write_1602com(0x80+8);write_1602dat(c/1000+0x30);write_1602dat((c%1000)/100+0x30);write_1602dat(((c%1000)%100)/10+0x30);write_1602com(0x80+12);write_1602dat(((c%1000)%100)%10+0x30);write_1602com(0x80+13);write_1602dat(0xdf);write_1602com(0x80+0x40+3);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30);write_1602dat(0xdf);write_1602com(0x80+0x40+12);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602dat(0xdf); } } //=====================================================================================/*****初始化定時器0*****/ void InitTimer(void) {TMOD=0x1;TH0=0x3c;TL0=0xb0; //50ms(晶振12M)EA=1; //全局中斷開關TR0=1;ET0=1; //開啟定時器0 }void KEY() {//功能鍵if(SET==0){BUZZ=0;delay(10);if(SET==0){Mode++;if(Mode==3)Mode=0;BUZZ=1;}while(SET==0){if(Mode==0){// write_1602com(0x80+0x40+6);write_1602com(0x0c);} else if(Mode==1){write_1602com(0x80+0x40+4);write_1602com(0x0f);} else{write_1602com(0x80+0x40+13);write_1602com(0x0f);} }}//增加if(ADD==0&&Mode==1){BUZZ=0;delay(10);if(ADD==0) {TH++;if(TH>=99) TH=99;write_1602com(0x80+0x40+3);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30);write_1602com(0x80+0x40+4); BUZZ=1;}while(ADD==0);}//減少if(DEC==0&&Mode==1){BUZZ=0;delay(10);if(DEC==0){TH--;if(TH==TL) TH=TL+1;write_1602com(0x80+0x40+3);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30);write_1602com(0x80+0x40+4); BUZZ=1;}while(DEC==0);}if(ADD==0&&Mode==2){BUZZ=0;delay(10);if(ADD==0) {TL++;if(TL==TH) TL=TH-1;write_1602com(0x80+0x40+12);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x80+0x40+13); BUZZ=1;}while(ADD==0);}//減少if(DEC==0&&Mode==2){BUZZ=0;delay(10);if(DEC==0){TL--;if(TL<=0) TL=0;write_1602com(0x80+0x40+12);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x80+0x40+13); BUZZ=1;}while(DEC==0); } }鏈接:https://pan.baidu.com/s/1JacnmfgVZpl1V-MLRH64Yg
提取碼:6gan
總結
以上是生活随笔為你收集整理的基于51单片机的智能鱼缸温度控制器protues仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Vue所制作的发牌游戏(附全部代码)
- 下一篇: 软件服务工程课程总结