{
relay=1; //断开继电器
EX1=0; ET1=0; triac=1; //关闭可控硅
buzz=0; //蜂鸣报警
}
}
/*--------------------------------------
测温函数 void temptest(void)
无参数,无返回值,
影响全局变量:ctemp,tempov
测量并查表计算温度,判断是否超温
--------------------------------------*/
void temptest(void)
{
signed char temp,tempmin,tempmax;
unsigned int t0rig;
unsigned int code temptab[]={0x6262,0x61eb,0x6171,0x60f7,0x6047,0x5ff7,0x5f6e,0x5eef,0x5e53,0x5dbe,0x5d4b,0x5ca5,0x5c17,\
0x5b6b,0x5ada,0x5a5c,0x599b,0x58ff,0x5869,0x57b0,0x570d,0x5663,0x55c6,0x550e,0x5444,0x5396,\
0x52dd,0x5240,0x5189,0x50b0,0x5005,0x4f20,0x4e69,0x4db1,0x4cef,0x4c42,0x4b64,0x4aaa,0x49e1,\
0x48fc,0x4847,0x476c,0x46b1,0x4604,0x4503,0x4449,0x4356,0x4299,0x41c0,0x40ce,0x3ff0,0x3f2b,\
0x3e33,0x3d86,0x3ca6,0x3bd2,0x3b26,0x3a39,0x3973,0x38a6,0x37ef,0x373f,0x3687,0x35c3,0x3507,\
0x3487,0x33bc,0x32ed,0x324f,0x319e,0x3106,0x3053,0x2fa6,0x2f2a,0x2e88,0x2e00,0x2d63,0x2cd6,\
0x2c65,0x2bae,0x2b28,0x2a97,0x2a07,0x298e,0x2914,0x287a,0x280d,0x278a,0x2703,0x2687,0x2626,\
0x25e5,0x256d,0x24ee,0x2489,0x2414,0x23bc,0x2356,0x22d9,0x2278,0x2203}; //温度频率表
px0count=2; //测频中断函数参数
t0tst=1; //置测频程序开始标志
EX0=1; //打开测频外中断
testok=0; //清除测频程序完成标志
while (!testok) display(); //等待测试完成
t0rig=(unsigned int)TH0<<8|TL0; //字节合成字
tempmin=0; //以下是二分查表法计算温度值
tempmax=100; //tempmin和tempmax为温度表的范围
while (1)
{
temp=(tempmax+tempmin)/2; //假定当前温度为最大值与最小值之中点值
if (t0rig==temptab[temp]) break; //若实际值等于假定值结束查找
else if (t0rig>temptab[temp]) tempmax=temp;//若实际值大于假定值,减小查找范围的最大值
else tempmin=temp; //若实际值小于假定值,增大查找范围的最小值
if (tempmax-tempmin<=1) //若查找范围已缩小到1度之间,
{ //判断实际值更接近哪个端点
if (temptab[tempmax]+temptab[tempmin]>2*t0rig) temp=tempmax;//接近最大值取最大值
else temp=tempmin; //接近最小值取最小值
break; //结束查找
}
}
ctemp=temp; //刷新当前温度寄存器
if (temp>65) tempov=1; //如果温度超过65度置位超温标志
else if (temp<45) tempov=0; //当温度回落到45度以下时清除超温标志
}
/*------------------------------------------
测温频率测试函数 void tempFrequency(void)
使用外部X0中断,寄存器组1
测出温度——频率转换电路的频率
------------------------------------------*/
void tempfrequency(void) interrupt 0 using 1
{
if (--px0count) return; //找齐起点或计数
if (t0tst) //如果是起点
{
t0tst=0; //清除测频开始标志
px0count=100; //取100个方波为一次测频
TH0=0;
TL0=0; //清除计时器T0
TR0=1; //开始计时
}
else //如果是终点
{
TR0=0; //停止计时
上一页 [1] [2] [3] [4] 下一页
本文关键字:单片机 程序 热水器 51单片机,单片机-工控设备 - 51单片机