51单片机-温度控制器设计详解+电路+代码
CtrlElec=(CtrlList[i].AlarmTemp> if(sj[k]> 注:继电器原理图来自百度百科-> 1^0引脚之间的关系电路图如下: 当P1^0输出1[即5V]时,控制电路两端没有电流通过,因为没有电压差的缘故,所以继电器还是把开关B G 通路,但是当P1^0输出0的时候,左边的电 压为5V,右边的电压位0V,于是电流就从左向右流过,这个时候继电器会把开关K G 变为通路 同理,主控芯片的工作指示灯也是这个原理,你可以去看看上面的EEPROM读取数据代码和主控芯片及外围器件电路结合起来一起看看,相信你也 会把这个原理给弄明白 八路温度控制器实物图如下[八路只使用了其中一路,程序也实地运行过,由于室内温度调节问题,继电器没有反应,因为给EEPROM设置30度报警 温度,而且还有零下报警代码没有写和报警温度小数位判断没有写]: 实物图和电路原理图基本一致,这个大家不用担心 代码和大家分享,可以再这个基础上再加以改进,也欢迎你们在使用代码的时候找到BUG然后修改.. 代码及其电路图下载:http://www.51hei.com/f/DS18B20+EEPROM.rar 下面是main.c 文件: #define EEPROM_StartAddr 0x4E typedef struct EEPROM_DataList//EEPROM数据结构 uint get_temp(); void CtrlPort(int PortCode,int Ctrl); sbit Beep=P3^4; // 测试用,可略 sbit CtrlPort1=P1^0; CTRL_TOTAL ListTotal; LED=1; if (BitData!=EEPROM_StartFlag){while(1);} // 卡住它,不要让它重新运行 while(1) void CtrlPort(int PortCode,int Ctrl)//控制P1.0-P1-7
#include
#define uchar unsigned char
#define uint unsigned int
#define EEPROM_StartFlag 0xB0
/*
#define EEPROM_EndFlag 0xC0
#define EEPROM_EndAddr 0x4E+2+24 //8个数据总数x3个数据位
//EEPROM_EndAddr=0x4E+2+8x03 每个数据占3字节(两个主要数据和一个NULL),0x49系获得数据项目总数
*/
typedef int CTRL_TOTAL;//列表总项目
{
int AlarmTemp;//报警温度
int CtrlPort; //控制端口
} CTRL_DATALIST;
void tmpchange(void);
void delayb(uint count);
void init();
void write_add(uchar address,uchar date);
uchar read_add(uchar address);
sbit LED=P2^7;
sbit CtrlPort2=P1^1;
sbit CtrlPort3=P1^2;
sbit CtrlPort4=P1^3;
sbit CtrlPort5=P1^4;
sbit CtrlPort6=P1^5;
sbit CtrlPort7=P1^6;
sbit CtrlPort8=P1^7;
CTRL_DATALIST CtrlList[8];
void delayb(uint count) ;
void main()
{
int BitData; // EEPROM位数据缓存
int i;// 计数循环变量
int TempData;// 当前温度值
int CtrlListPort;// 将要控制的引脚
int CtrlElec;// 将要控制的引脚输出电平
init();
BitData=read_add(EEPROM_StartAddr);
// 关于EEPROM获取数据信息可以从同文件夹中图片有指导
ListTotal=read_add(EEPROM_StartAddr+1);
for(i=0;i
CtrlList[i].AlarmTemp=read_add((EEPROM_StartAddr+2)+i*3);
CtrlList[i].CtrlPort =read_add((EEPROM_StartAddr+2)+i*3+1);
}
tmpchange();
for(i=0;i<=7;i++) CtrlPort(i,1);//输出高电位
LED=0;//工作指示灯开启
{
TempData=get_temp();
BitData=(TempData%1000/100)*10;//十位温度。
BitData=(TempData%1000%100/10)+BitData;//个位温度。
for(i=0;i
CtrlElec=(CtrlList[i].AlarmTemp>=BitData)?0:1;
CtrlListPort=CtrlList[i].CtrlPort;
CtrlPort(CtrlListPort,CtrlElec); //符合条件输出底电,不符合输出高电
delayb(100);
}
delayb(200);
}
}
{
switch(PortCode)
{
case 1: CtrlPort1=Ctrl;
case 2: CtrlPort2=Ctrl;
case 3: CtrlPort3=Ctrl;
case 4: CtrlPort4=Ctrl;
case 5: CtrlPort5=Ctrl;
case 6: CtrlPort6=Ctrl;
case 7: CtrlPort7=Ctrl;
case 8: CtrlPort8=Ctrl;
}
}
51单片机温度控制器代 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)