STC12C5A16S2 NTC热敏电阻 温度定时控制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} } /* 注释: * 单片机中断函数格式如下: * void 函数名() interrupt 中断号 *{
* 中断程序内容 *} */ void T0_time() interrupt 1 { TF0=0; //清除中断标志 TR0=0; //关中断
if(uiTimeCnt>=0xffffffff) uiTimeCnt=0; //时间计数器清零
{
ucChooseStep++; //ucChooseStep 加一
ucRLYStep = 5;
//重回 case 5 在常温下再测试一次
}
else
{
ucRLYStep = 6;
}
}
break;
default: {
RLY_dr=0; //让 LRY 关 //打开指示 LED,通知操作员程序已经跑完
} break;
排阻和电阻,电容
做好之后的实物图:
整体
显示部分
温度采集部分 手画了一张原理图
计算数码管编码 (LS245 和数码管之间的连线是自己焊的,所以要自己计算编 码) 以下是源程序 (C 语言) 在 keil c51 中新建工程,芯片选择 S51 或 S52 都可以,再将以下代码复制过去 //---------------------------------以下为代码------------------------------------------
switch(LEDnumber)
//显示温度
{
case 0:A0=0;A1=0;A2=0;LEDnumber++;P3=LEDdata[LEDshow[0]];break;
case 1:A0=1;A1=0;A2=0;LEDnumber++;P3=LEDdata[LEDshow[1]];break;
unsigned char code LEDdata[16]={0x88,0xEB,0x4C,0x49,0x2B,0x19,0x18,0xCB,0x08,0x09,0x7F,0xEF,0x9C,0xBC,0x2A,0 xFF}; //0-9 - ' C L H
sbit A0=P1^1; //控制 8 个数码管的选通 P3 口输出显示数字 sbit A1=P1^2; sbit A2=P1^3;
unsigned char LEDshow[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //LED 消影 unsigned char LEDnumber=0; //动态扫描索引
sfr ADC_CONTR = 0xBC; sfr ADC_RES = 0xBD; sfr ADC_LOW2 = 0xBE; sfr P1ASF = 0x9D;
#define ADC_POWER 0x80 #define ADC_FLAG 0x10 #define ADC_START 0x08 #define ADC_SPEEDLL 0x00 #define ADC_SPEEDL 0x20 #define ADC_SPEEDH 0x40 #define ADC_SPEEDHH 0x60
default:break;
}
}
else if(ucRLYStep==0)
//低温等待
{
LEDshow[4] = Rtime/60; //剩余分钟,
LEDshow[5] = Rtime%60/10; //剩余秒数
LEDshow[6] = Rtime%60%10;
switch(LEDnumber)
{
case 4:A0=0;A1=0;A2=1;LEDnumber++;P3=LEDdata[13];break;
case 0: {
case 1:
if(temp>=-45 && temp <= -35) {
ET0=0; //禁止定时中断 uiTimeCnt=0; //时间计数器清零 ET0=1; //开启定时中断 ucChooseStep++; ucRLYStep=2; //切换到下一个步骤
} } break;
if(uiTimeCnt<0xffffffff) //设定这个条件,防止 uiTimeCnt 超范围。 { //uiTimeCnt++; //累加定时中断的次数, uiTimeCnt=uiTimeCnt+2; //由于两分钟慢了一分十秒,故增加校正参数 1.改后一分钟慢四秒。
P3=0xFF; //关数码管显示
显示部分有八个共阳极数码管,上面四个显示温度,下面四个显示倒计时。
材料如下: MCU:STC12C5A60S2 单片机
NTC 热敏电阻:B57550G (8307) ULN2803APG 74LS138 74LS245 继电器 10A 277VAC 7805(带散热片) 数码管 HDSP 515H 三极管 2N4403 12V 电源
#include "intrins.h" #include "stdio.h" #include "AT89X51.H"
#define const_time_level 600000 //设置定时时长 5 分钟 1=500us 11.0592MHZ #define const_test_time_level 520000 //设置上电测试的时长 4 分 20 秒
{
LEDshow[4] = Rtime/60;
//剩余分钟
来自百度文库
LEDshow[5] = Rtime%60/10; //剩余秒数
LEDshow[6] = Rtime%60%10;
switch(LEDnumber)
{
case 4:A0=0;A1=0;A2=1;LEDnumber++;P3=LEDdata[LEDshow[4]];break;
ET0=0; //禁止定时中断 uiTimeCnt=0; //时间计数器清零 ET0=1; //开启定时中断 RLY_dr=1; //让 RLY 开
ucRLYStep=4; //切换到下一个步骤 } break;
case 4:
if(uiTimeCnt>=const_test_time_level) //时间到 {
case 2:A0=0;A1=1;A2=0;LEDnumber++;P3=LEDdata[11];break;
case 3:A0=1;A1=1;A2=0;LEDnumber++;P3=LEDdata[12];break;
default:break;
}
if(ucRLYStep==2||ucRLYStep==3) {
热敏电阻温度检测和控制系统设计
客户需要设计一种基于温度检测和控制 220VAC 的系统,要求如下: 1:检测当前温度在常温(18-30 度),单片机控制 220V 继电器打开给设备供电 4 分钟, 然后关闭继电器断电,等待温度下降到 -40 度 2:检测温度如果达到 -40 度,计时器开始计时五分钟,时间到了之后,打开继电器给设 备供电 4 分钟,然后关闭继电器断电,等待温度上升到 85 度 3:检测温度如果达到 85 度,计时器开始计时五分钟,时间到了之后,打开继电器给设 备供电 4 分钟,然后关闭继电器断电,等待温度下降到 -40 度 4:在高低温下循环 5 次。 5:检测是否回到常温,如果到常温,单片机控制 220V 继电器打开给设备供电 4 分钟, 然后关闭继电器断电,程序完成。
case 2:
if((uiTimeCnt>=const_time_level)&&(temp>=-45 && temp <= -35)) //时间到,同时再次确认低温 温度范围 {
ET0=0; //禁止定时中断 uiTimeCnt=0; //时间计数器清零 ET0=1; //开启定时中断 RLY_dr=1; //让 RLY 开 ucRLYStep=4; //切换到下一个步骤 } break;
initial_peripheral(); while(1) { RLY_Control(); } }
void RLY_Control() // RLY_Control 应用程序 { switch(ucRLYStep) {
case 5: {
if(temp>=18 && temp <= 30) {
ET0=0; //禁止定时中断 uiTimeCnt=0; //时间计数器清零 ET0=1; //开启定时中断 RLY_dr=1; //让 RLY 开 ucRLYStep=4; //切换到下一个步骤 } } break;
//P2_0=1; //printf("case 0 %f \n",temp);
{
if(temp>=80 && temp <= 90) {
} } break;
ET0=0; //禁止定时中断 uiTimeCnt=0; //时间计数器清零 ET0=1; //开启定时中断 ucChooseStep++; ucRLYStep=3; //切换到下一个步骤 //printf("case 1 %f \n",temp);
//设置 ADC
void initial_myself();
//初始化 MCU
void InitADC();
//初始化 ADC
void initial_peripheral(); //初始化外围
void delay_long(unsigned int uiDelaylong);
void RLY_Control();
Rtime= (const_time_level-uiTimeCnt)/2000; }
//将计数参数转换为时间,单位:秒
else if ( ucRLYStep==4) {
Rtime= (const_test_time_level-uiTimeCnt)/2000; }
else {
}
Rtime=0;
if(ucRLYStep==2||ucRLYStep==3||ucRLYStep==4)
case 3: /* 注释: * uiTimeCnt 累加定时中断的次数,每一次定时中断它都会在中断函数里自加一。 * 只有当它的次数大于或等于设定上限 const_time_level 时, * 才会去改变 RLY 的状态。 */
if((uiTimeCnt>=const_time_level)&&(temp>=80 && temp <= 90)) //时间到,同时再次确认高温温 度范围 { /* 注释: * ET0=0;uiTimeCnt=0;ET0=1;----在清零 uiTimeCnt 之前,先禁止定时中断 */
case 5:A0=1;A1=0;A2=1;LEDnumber++;P3=LEDdata[10];break;
case 6:A0=0;A1=1;A2=1;LEDnumber++;P3=LEDdata[4];break;
case 5:A0=1;A1=0;A2=1;LEDnumber++;P3=LEDdata[10];break;
case 6:A0=0;A1=1;A2=1;LEDnumber++;P3=LEDdata[LEDshow[5]];break;
case 7:A0=1;A1=1;A2=1;LEDnumber=0;P3=LEDdata[LEDshow[6]];break;
void T0_time(); //定时中断函数
sbit RLY_dr=P2^7;
unsigned char ucRLYStep=5; //步骤变量
unsigned char ucChooseStep=0; //选择低温分支或者高温分支
unsigned long uiTimeCnt=0; //统计定时中断次数的延时计数器
ET0=0; //禁止定时中断
uiTimeCnt=0; //时间计数器清零
ET0=1; //开启定时中断
RLY_dr=0; //让 RLY 关
if(ucChooseStep<10)
{
ucRLYStep = ucChooseStep%2; //返回到上一个步骤
}
else if (ucChooseStep==10)
unsigned long Rtime=0; //计算剩余时间
float temp=0; //测量当前温度
unsigned char ch = 6;
//ADC 转换通道
unsigned int ADCnumber = 1; //记录 ADC 的转换次数
void main() { initial_myself(); InitADC(); delay_long(100);