中国温控器网

查看: 2915|回复: 0

电脑可调温度控制器源程序 -凯发app官方网站

[复制链接]
发表于 2013-1-17 13:38:45 | 显示全部楼层 |
电脑可调温度控制器源程序

温度控制器v1.5
显示为三个共阳极led
温度传感器用单总线ds18b20
cpu为2051,四个按键,分别为up,down,set
温度调节上限为125度,下限为-55度
只能用于单只18b20

本软件仅供学习与参考,引用时请注明凯发真人的版权

http:// /> 明浩 2004/1/2

-------------------------------*/

#include
#include
#define key_up p3_0 //上调温度
#define key_down p3_1 //下调温度
#define key_set p1_7 //设定键(温度设定,长按开电源)
#define relayoutport p3_5 //继电器输出
#define ledport p1 //led控制口
#define ledonec p3_2 //led ds1控制(百位)
#define ledtwoc p3_3 //led ds2控制(十位)
#define ledthreec p3_4 //led ds3控制(个位)
#define tmport p3_7 //ds1820 dataport

unsigned char code leddis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //0-9的led笔划,0xff为空,0xf7为负号

static unsigned char bdata statereg; //可位寻址的状态寄存器
sbit ds1820on = statereg^0; //ds1820是否存在
sbit settf = statereg^1; //是否是在温度设置状态
sbit keysetdown = statereg^2; //是否已按过set键标识
sbit powtf = statereg^3; //电源电源标识
sbit keytf = statereg^4; //键盘是否允许

//sbit keysetdowning = statereg^5; //set是否正在按下
static unsigned char bdata tlv _at_ 0x0029; //温度变量高低位
static unsigned char bdata thv _at_ 0x0028;
static signed char tmv; //转换后的温度值
static unsigned char keyv,tempkeyv; //键值
static signed char tmromv _at_ 0x0027; //高温限制
static signed char tmsetv _at_ 0x0026; //温度设定值
static unsigned char ksdnum; //set键连按时的采集次数
static unsigned char intnum,intnum2,intnum3; //中断发生次数,intnum用于set长按检测,intnum2用于设定状态时led闪烁
static signed char led_one,led_two,led_three; //led的显示位 led_one为十位,led_two为个位
static unsigned char sign; //负号标识

void main(void)
{
void initds1820(void); //定义函数
void romds1820(void);
void tmvds1820(void);
void tmrds1820(void);
void tmwds1820(void);
void tmreds1820(void);
void tmerds1820(void);
void readds1820(void);
void writeds1820(void);
void delay_510(void);
void delay_110(void);
void delay_10ms(void);
void delay_4s(void);
void v2tov(void);

statereg = 0; //初始化变量
settf = 1;
powtf = 1; //关电源
thv = 0;
tlv = 0;
tmv = 0;
keyv = 0;
tempkeyv = 0;
ksdnum = 0;
intnum = 0;
intnum2 = 0;
intnum3 = 0;
led_one = 0;
led_two = 0;

initds1820(); //初始化
romds1820(); //跳过rom
tmerds1820(); //e2pram中温度上限值调入ram
initds1820(); //初始化
romds1820(); //跳过rom
tmrds1820(); //读出温度指令
readds1820(); //读出温度值和上限值
tmsetv = tmromv; //拷贝保存在ds18b20rom里的上限值到tmsetv

ea = 1; //允许cpu中断
et0 = 1; //定时器0中断打开
tmod = 0x1; //设定时器0为模式1,16位模式
th0=0xb1;
tl0=0xdf; //设定时值为20000us(20ms)
tr0 = 1; //开始定时
while(1);
}

//定时器0中断外理中键扫描和显示
void keyanddis_time0(void) interrupt 1 using 2
{
th0=0xb1;
tl0=0xdf; //设定时值为20000us(20ms)

ledport = 0xff;
if (!key_up)
keyv = 1;
if (!key_down)
keyv = 2;
if (!key_set)
keyv = 3;
//keysetdowning = 0; //清除
if (keyv != 0) //有键按下
{
delay_10ms(); //延时防抖 按下10ms再测
if (!key_up)
tempkeyv = 1;
if (!key_down)
tempkeyv = 2;
if (!key_set)
tempkeyv = 3;
if (keyv == tempkeyv) //两次值相等为确定接下了键
{
if (keyv == 3) //按下set键,如在set状态就退出,否则进入
{
//keysetdowning = 1; //表明set正在按下
powtf = 0; //电源标识开
if (!keytf)
if (settf)
{
settf = 0; //标识位标识退出设定
initds1820(); //初始化
romds1820(); //跳过rom
tmwds1820(); //写温度上限指令
writeds1820(); //写温度上限到ds18b20rom
writeds1820(); //写温度上限到ds18b20rom
writeds1820(); //写温度上限到ds18b20rom
initds1820(); //初始化
romds1820(); //跳过rom
tmreds1820(); //温度上限值copy回e2pram
}
else
settf = 1;
if (!keysetdown) //没有第一次按下set时,keysetdown标识置1
keysetdown = 1;
else
ksdnum = ksdnum + 1; //前一秒内有按过set则开始计数
}
if (settf) //在set状态下
{
if ((keyv == 1) && (!keytf))
tmsetv = tmsetv + 1; //上调温度
if ((keyv == 2) && (!keytf))
tmsetv = tmsetv - 1; //下调温度
if (tmsetv <= -55) //限制温度上下限
tmsetv = -55;
if (tmsetv >= 125)
tmsetv = 125;
}
if ((!keytf) && (intnum3 == 0)) keytf = 1; //当键盘处于可用时,锁定
}

if (keysetdown) //在2秒内按下了set则计中断发生次数用于长按set时计时用
intnum = intnum + 1;
if (intnum > 55) //中断发生了55次时(大约1.2秒)75为1.5秒左右
{
intnum = 0;
keysetdown = 0;
if (ksdnum == 55) //如一直长按了set1.2秒左右
{
relayoutport = 1; //关闭继电器输出
powtf = 1; //电源标识关
ledonec = 0;
ledtwoc = 0;
ledthreec = 0;
ledport = 0xbf; //显示"--"
delay_4s(); //延时
ledonec = 1;
ledtwoc = 1; //关显示
ledthreec = 1;
delay_4s();
intnum = 0;
intnum2 = 0;
intnum3 = 0;
}
ksdnum = 0;
}
}
keyv = 0;
tempkeyv = 0; //清空变量准备下次键扫描

if (!powtf)
{
initds1820(); //初始化
romds1820(); //跳过rom
tmvds1820(); //温度转换指令

delay_510();
delay_510(); //延时等待转换完成

initds1820(); //初始化
romds1820(); //跳过rom
tmrds1820(); //读出温度指令
readds1820(); //读出温度值

v2tov(); //转换显示值
if (tmv > tmsetv) //根据采集到的温度值控制继电器
{
relayoutport = 0;
}
else
{
relayoutport = 1;
}



该贴已经同步到
, , ,

相关帖子

||archiver|中国温控器网 ( ) 

gmt+8, 2019-8-8 17:50 , processed in 0.157250 second(s), 25 queries .

powered by x3.2

© 2001-2013

返回列表