已经添加附件,大家各取所需.51单片机控制的温控仪设计资料
温控仪电路原理图:
pcb工程文件:
温控仪单片机源程序如下:
- #include<reg52.h>
- #include"eeprom.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit wei1 = P1^3; //数码管位选
- sbit wei2 = P1^2;
- sbit wei3 = P1^1;
- sbit wei4 = P1^0;
- sbit DQ = P3^2; //温度
- sbit k1=P3^7; //功能按键
- sbit k2=P3^6; // 增加键
- sbit k3=P3^5; //减少键
- uchar TL,TH,TN,TD;
- sbit beep=P1^6;
- uchar count,num,m,s1num=0; //温度值
- uchar htemp=33,ltemp=15; //温度上下线初始化
- float f_temp;
- int key_delay=0;
- const int key_count=200;
- bit yyp=1,halarm=0,lalarm=0;
- uchar code TAB[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
- uchar code TAB1[]={0xbf,0x89,0xc7,0xC6}; //三个依次是 - H L 后面两个是温度符号大写的C
- /****毫秒级延时函数*****/
- void delay(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay1(uchar i)
- {
- uchar j=100;
- for(i;i>0;i--)
- for(j;j>0;j--)
- {;}
- }
- void di()
- {
- beep=0;
- delay(100);
- beep=1;
- }
- /***********ds18b20延迟子函数(晶振12MHz )*******/
- ///////////////////////////////////////////////////
- void delay_18B20(unsigned int i)
- {
- while(i--);
- }
- ///////////////////////////////////////////////////
- /**********ds18b20初始化函数**********************/
- ////////////////////////////////////////////////////
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ复位
- delay_18B20(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay_18B20(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- delay_18B20(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay_18B20(20);
- }
- ////////////////////////////////////////////
- /***********ds18b20读一个字节**************/
- ///////////////////////////////////////////
- unsigned char ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 给脉冲信号
- dat>>=1;
- DQ = 1; // 给脉冲信号
- if(DQ)
- dat|=0x80;
- delay_18B20(4);
- }
- return(dat);
- }
- //////////////////////////////////////////////////
- /*************ds18b20写一个字节****************/
- //////////////////////////////////////////////////
- void WriteOneChar(uchar dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- delay_18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /**************读取ds18b20当前温度************/
- //////////////////////////////////////////////
- void ReadTemp()
- {
-
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- delay(1);
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- TL=ReadOneChar(); //先读的是温度值低位
- TH=ReadOneChar(); //接着读的是温度值高位
- TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
- //这样得出的是温度的整数部分,小数部分被丢弃了
-
- TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
- //这样得到的是温度小数部分的第一位数字(保留1位小数)
- }
- ////////////////////////////////////////////////
- void get_wendu(uchar m)
- {
- uchar ws,wg;
- ws=m/10;
- wg=m%10;
- wei1=0; //读取温度的十位和个位
- P0=TAB[ws];
- delay(2);
- wei1=1;
- P0=0xff;
- wei2=0;
- P0=TAB[wg]& 0x7f;
- delay(2);
- wei2=1;
- P0=0xff;
-
- }
- void get_wendu2(uchar m)
- {
- wei3=0;
- P0=TAB[m];
- delay(2);
- wei3=1;
- P0=0xff;
-
- wei4=0;
- P0=TAB1[3];
- delay(2);
- wei4=1;
- P0=0xff;
-
-
- }
- /////////调最高温度调用的函数//////
- void hdisplay(uchar dat)
- {
- uchar fs,fg;
- wei1=0; //读取最高温度符号“H-”
- P0=TAB1[1];
- delay(5);
- wei1=1;
- P0=0xff;
-
- wei2=0;
- P0=TAB1[0];
- delay(5);
- wei2=1;
- P0=0xff;
-
- fs=dat/10;
- fg=dat%10;
- wei3=0;
- P0=TAB[fs];
- delay(5);
- wei3=1;
- P0=0xff;
- wei4=0;
- P0=TAB[fg];
- delay(5);
- wei4=1;
- P0=0xff;
- }
- /////////调最低温度调用的函数//////
- void ldisplay(uchar dat)
- {
- uchar fs,fg;
- wei1=0; //读取最低温度符号“L=”
- P0=TAB1[2];
- delay(2);
- wei1=1;
- P0=0xff;
-
- wei2=0;
- P0=TAB1[0];
- delay(2);
- wei2=1;
- P0=0xff;
-
- fs=dat/10;
- fg=dat%10;
- wei3=0;
- P0=TAB[fs];
- delay(2);
- wei3=1;
- P0=0xff;
- wei4=0;
- P0=TAB[fg];
- delay(2);
- wei4=1;
- P0=0xff;
- }
- /****按键扫描******/
- void keyscan()
- {
- if(k1==0)
- {
- delay(10);
- if(k1==0)
- {
- yyp=0;
- s1num++;
- while(!k1); //等待按键释放
- di();
- htemp=byte_read(0x2200);
- ltemp=byte_read(0x2000);
- switch(s1num)
- {
- case 1:break;
- case 2:break;
- case 3:if(s1num==3)s1num=0;yyp=1;
- break;
- }
-
-
- }
- }
- if(s1num!=0)
- {
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- do
- {
- delay1(10);
- }
- while((!k2)&(key_delay++<key_count)); ///等待按键释放
- di();
- switch(s1num)
- {
- case 1: htemp++;
- if(htemp==99)htemp=0;
- hdisplay(htemp);
- SectorErase(0x2200);//擦除扇区
- byte_write(0x2200,htemp);//重新写入数据
- break;
- case 2: ltemp++;
- if(ltemp==99)ltemp=0;
- ldisplay(ltemp);
- SectorErase(0x2000);//擦除扇区
- byte_write(0x2000,ltemp);//重新写入数据
- break;
- }
- }
- }
- if(k3==0)
- {
- delay(10);
- if(k3==0)
- {
- do
- {
- delay1(10);
- }
- while((!k3)&(key_delay++<key_count)); //等待按键释放
- di();
- switch(s1num)
- {
- case 1: htemp--;
- if(htemp==0)htemp=99;
- hdisplay(htemp);
- SectorErase(0x2200);//擦除扇区
- byte_write(0x2200,htemp);//重新写入数据
- break;
- case 2: ltemp--;
- if(ltemp==0)ltemp=99;
- ldisplay(ltemp);
- SectorErase(0x2000);//擦除扇区
- byte_write(0x2000,ltemp);//重新写入数据
- break;
- }
- }
- }
- }
- }
- ///////////////////////////////////////////////////////////
- void baojing()
- {
- if((TN>=htemp)||(TN<=ltemp)) //温度高于设置最大温度
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
温控资料.zip
(12.91 MB, 下载次数: 41)
|