基于51單片機四路溫度檢測系統DS18B20的仿真和源程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (19.79 KB, 下載次數: 100)
下載附件
2021-3-19 23:47 上傳
51hei.png (18.88 KB, 下載次數: 85)
下載附件
2021-3-19 23:48 上傳
單片機源程序如下:
- #include"stc89c51.h"
- #include"define.h"
- sbit SetKey = P3^0;
- sbit UpKey = P3^1;
- sbit DnKey = P3^2;
- sbit AlarmK = P3^3;
- sbit BEEP = P2^4;
- sbit LED1 = P2^0;
- sbit LED2 = P2^1;
- sbit LED3 = P2^2;
- sbit LED4 = P2^3;
- extern void StartDs18b20(uchar * ROMCODE);
- extern void ReadDs18b20(uchar * ROMCODE);
- extern uchar TZ; //轉換后的溫度值整數部分
- extern uchar TD; //轉換后的溫度值整數部分
- //extern void init_lcd (void);
- //extern void LcdWrData(uchar content);
- //extern void LcdWrCommand(uchar content) ;
- extern uchar FindDevices(uchar CodeROM[][8]);
- data uchar Ds18b20Rom[4][8];
- //************************************************************************************************************************
- extern uchar LastDiscrap ;
- //extern void writeChar(uchar x,uchar y,uchar s); //LCD 寫字符串
- //extern void writestring(uchar x,uchar y,uchar *s) ;//LCD 寫字符串
- //extern void LCD_Initial(void);
- //extern void write_dat(unsigned char dat);
- //extern void command(unsigned int com);
- extern unsigned char tflag;
- unsigned char AlarmTempLow=1,AlarmTempTop=125,Set=0;
- unsigned char fAlarm=0xff;
- unsigned char TP1=0xff,TP2=0xff,TP3=0xff,TP4=0xff;
- unsigned char Alarm1=0,Alarm2=0,Alarm3=0,Alarm4=0;
- unsigned char tf1=0,tf2=0,tf3=0,tf4=0;
- void delayms(uint ms) //延時xx毫秒
- {
- uchar i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
- sbit RS=P2^5;
- sbit RW=P2^6;
- sbit EN=P2^7;
- #define LCD_BUS P0
- void command(unsigned int com) //LCD寫指令
- {
- RS=0; //RS為0
- LCD_BUS=com; //裝載指令
- delayms(5); //延時5ms
- EN=1; //LCD使能
- delayms(5); //延時5ms
- EN=0; //LCD不使能
- }
- void write_dat(unsigned char dat) //LCD寫數據
- {
- RS=1; //RS為1
- LCD_BUS=dat; //裝載數據
- delayms(5); //延時5ms
- EN=1; //LCD使能
- delayms(5); //延時5ms
- EN=0; //LCD不使能
- }
- void writestring(unsigned char x,unsigned char y,unsigned char *s) //LCD 寫字符串
- {
- if (y == 0) command(0x80 + x); //表示第一行
- else command(0xC0 + x); //表示第二行
-
- while (*s) //判斷是否字符串的結尾
- {
- write_dat( *s); //顯示當前字符
- s ++; //字符串地址加1
- }
- }
- void writeChar(unsigned char x,unsigned char y,unsigned char s) //LCD 寫字符串
- {
- if (y == 0) command(0x80 + x); //表示第一行
- else command(0xC0 + x); //表示第二行
-
- {
- write_dat( s); //顯示當前字符
- }
- }
- void LCD_Initial(void) //LCD初始化
- {
- EN=0; //LCD不使能
- RW=0; //RW為0
- command(0x38); //發送初始化指令
- command(0x0c); //發送初始化指令
- command(0x06); //發送初始化指令
- command(0x01); //發送初始化指令
- command(0x80+0x02); //發送LCD初始位置
- }
- void Alarm(void)
- {
- if(TP1!=0xff)
- {
- if((TP1>(AlarmTempTop))||(TP1<(AlarmTempLow))||(tf1==0x2d)) {Alarm1=1;LED1=0;}
- else {Alarm1=0;LED1=1;}
- }
- else {Alarm1=0;LED1=1;}
-
- if(TP2!=0xff)
- {
- if((TP2>(AlarmTempTop))||(TP2<(AlarmTempLow))||(tf2==0x2d)) {Alarm2=1;LED2=0;}
- else {Alarm2=0;LED2=1;}
- }
- else {Alarm2=0;LED2=1;}
-
- if(TP3!=0xff)
- {
- if((TP3>(AlarmTempTop))||(TP3<(AlarmTempLow))||(tf3==0x2d)) {Alarm3=1;LED3=0;}
- else {Alarm3=0;LED3=1;}
- }
- else {Alarm3=0;LED3=1;}
-
- if(TP4!=0xff)
- {
- if((TP4>(AlarmTempTop))||(TP4<(AlarmTempLow))||(tf4==0x2d)) {Alarm4=1;LED4=0;}
- else {Alarm4=0;LED4=1;}
- }
- else {Alarm4=0;LED4=1;}
-
- if(fAlarm!=0)
- {
- if((Alarm1==1)||(Alarm2==1)||(Alarm3==1)||(Alarm4==1)) {BEEP=0;}
- else BEEP=1;
- }
- else BEEP=1;
- }
- void DispAlData(void)
- {
- unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
-
- i1 = AlarmTempLow/100; //獲得溫度值的百位
- i2 = AlarmTempLow%100/10; //獲得溫度值的十位
- i3 = AlarmTempLow%10; //獲得溫度值的個位
-
- i4 = AlarmTempTop/100; //獲得溫度值的百位
- i5 = AlarmTempTop%100/10; //獲得溫度值的十位
- i6 = AlarmTempTop%10; //獲得溫度值的個位
- writestring(5,1," ");
- writestring(13,1," ");
- if(i1!=0) writeChar(5,1,i1+'0');
- if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
- if(i1!=0) writeChar(6,1,i2+'0');
- if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');
- else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');
- if((i1!=0)) writeChar(7,1,i3+'0');
-
- if(i4!=0) writeChar(13,1,i4+'0');
- if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');
- if(i4!=0) writeChar(14,1,i5+'0');
- if((i4==0)&&(i5==0)) writeChar(13,1,i6+'0');
- else if((i4==0)&&(i5!=0)) writeChar(14,1,i6+'0');
- if((i4!=0)) writeChar(15,1,i6+'0');
- }
- void SetFun(void)
- {
- if(SetKey==0)
- {
- delayms(20);
- if(SetKey==0)
- {
- if(Set<2) {Set++;writestring(0,1," Low= Top= ");}
- else {Set=0;}
- }
- DispAlData();
- switch(Set)
- {
- case 0: writestring(0,1,"C D ");break;
- case 1: writestring(0,1,">");writestring(8,1," ");break;
- case 2: writestring(0,1," ");writestring(8,1,">");break;
- }
-
-
- while(SetKey==0);
- }
-
- if((UpKey==0)&&(Set!=0))
- {
- delayms(20);
- if(UpKey==0)
- {
- switch(Set)
- {
- case 1: if(AlarmTempLow<125) AlarmTempLow++;else AlarmTempLow=125; break;
- case 2: if(AlarmTempTop<125) AlarmTempTop++;else AlarmTempTop=125; break;
- }
- DispAlData();
- while(UpKey==0);
- }
- }
-
- if((DnKey==0)&&(Set!=0))
- {
- delayms(20);
- if(DnKey==0)
- {
- switch(Set)
- {
- case 1: if(AlarmTempLow>-20) AlarmTempLow--;else AlarmTempLow=-20; break;
- case 2: if(AlarmTempTop>0) AlarmTempTop--;else AlarmTempTop=0; break;
- }
- DispAlData();
- while(DnKey==0);
- }
- }
-
- if(AlarmK==0)
- {
- delayms(20);
- if(AlarmK==0)
- {
- fAlarm=~fAlarm;
- while(AlarmK==0) ;
- }
- }
- }
- void main(void)
- {
- uint k;
- uchar number;
- BEEP=1;
- LCD_Initial();
- //init_lcd();
- writestring(0,0," Search Sensor ");
- delayms(800);
- number=FindDevices(Ds18b20Rom);
- writestring(0,0,"Search sensors");
- writeChar(7,0,number/10+'0');
- writeChar(8,0,number%10+'0');
-
- for(k=0;k<number;k++)
- {
- StartDs18b20(& Ds18b20Rom[k][0]);
- }
- delayms(800);
- writestring(0,0,"A B ");
- writestring(0,1,"C D ");
- while(1)
- {
- if(Set==0)
- {
- for(k=0;k<number;k++)
- {
- StartDs18b20(& Ds18b20Rom[k][0]);
-
- ReadDs18b20(& Ds18b20Rom[k][0]);
- switch(k)
- {
- case 0:
- TP1=TZ;tf1=tflag;
- writeChar(1,0,tflag);
- writeChar(2,0,TZ/100+'0');
- writeChar(3,0,TZ/10%10+'0');
- writeChar(4,0,TZ%10+'0');
- writeChar(5,0,'.');
- writeChar(6,0,TD+'0');
- break;
- case 1:
- TP2=TZ;tf2=tflag;
- writeChar(10,0,tflag);
- writeChar(11,0,TZ/100+'0');
- writeChar(12,0,TZ/10%10+'0');
- writeChar(13,0,TZ%10+'0');
- writeChar(14,0,'.');
- writeChar(15,0,TD+'0');
- break;
- case 2:
- TP3=TZ;tf3=tflag;
- writeChar(1,1,tflag);
- writeChar(2,1,TZ/100+'0');
- writeChar(3,1,TZ/10%10+'0');
- writeChar(4,1,TZ%10+'0');
- writeChar(5,1,'.');
- writeChar(6,1,TD+'0');
- break;
- case 3:
- TP4=TZ;tf4=tflag;
- writeChar(10,1,tflag);
- writeChar(11,1,TZ/100+'0');
- writeChar(12,1,TZ/10%10+'0');
- writeChar(13,1,TZ%10+'0');
- writeChar(14,1,'.');
- writeChar(15,1,TD+'0');
- break;
- }
- }
- }
- SetFun();
- Alarm();
- }
- }
復制代碼
所有程序仿真51hei提供下載:
仿真.zip
(242.92 KB, 下載次數: 171)
2021-3-19 12:11 上傳
點擊文件名下載附件
仿真及源程序 下載積分: 黑幣 -5
|