温度控制器程序.docx
- 文档编号:13997362
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:18
- 大小:39.14KB
温度控制器程序.docx
《温度控制器程序.docx》由会员分享,可在线阅读,更多相关《温度控制器程序.docx(18页珍藏版)》请在冰点文库上搜索。
温度控制器程序
JennywascompiledinJanuary2021
温度控制器程序
//PT100自身温度范围
#defineM_temper_MIN-200//最低温度
#defineM_temper_MAX500//最高温度
//CPU引脚定义
#defineP_LEDP0
sbitLED_S1=P2^0;//LED1位选
sbitLED_S2=P2^1;//LED2位选
sbitLED_S3=P2^2;//LED3位选
sbitLED_S4=P2^3;//LED4位选
sbitKEY_S1=P1^0;//上下限温度设置
sbitKEY_S2=P1^1;//温度加
sbitKEY_S3=P1^2;//温度减
//全局变量寄存器
ucharM_LED1,M_LED2,M_LED3,M_LED4;//4位LED显示寄存器
ucharLED_DISP_TAB[]=//LED编码表
{
0X3f,0X06,0X5b,0X4f,0X66,
0X6d,0X7d,0X07,0X7f,0X6f,//0-9
0X40,0X23,0X1c,0X58//字符:
-nuc
};
ucharSet_count;//温度设置按钮计数
ucharT0_count;//T0定时中断计数
uintT1_count;//T1定时中断计数
charM_temper_up;//温度上限
charM_temper_down;//温度下限
charM_temper_AI;//设置中温度
charM_temper_conver;//当前温度
bitB_set,B_set_AI;//温度设置标志
bitB_set_T0,B_set_T1;//定时器中断标志
//函数声明
voidT1int_init();
/*定时器T1初始化:
设置工作方式
赋初值
开启中断*/
voidT0int_init();
/*定时器T0初始化:
设置工作方式
赋初值
开启中断*/
voidSet_temper();
/*设置上下限温度:
按键次数=1:
显示上限温度并处于操作状态
按键次数=2:
显示下限温度并处于操作状态
按键次数=3:
保存设置值并退出
*/
voidInc_temper();
/*提高设置的温度*/
voidDec_temper();
/*降低设置的温度*/
voidLED_data_BCD(charDisp_dat);
/*数码管显示温度*/
voidPT100_delay(uintcount);
/*PT100延时程序*/
voidPT100_reset(void);
/*PT100复位初始程序:
根据PT100要求对其进行复位初始控制*/
bitPT100_readbit(void);
/*PT100位读子程序:
从PT100取出一位数据*/
ucharPT100_readbyte(void);
/*PT100字节读子程序:
读出的一字节数据并返回数据值*/
voidPT100_writebyte(uchardat);
/*PT100字节写子程序:
将输入参数值写入PT100*/
voidPT100_change(void);//启动PT100温度转换
ucharPT100_Gettemper(void);
/*读取PT100温度数据:
单线方式读取PT100转换的温度数据,
并返回处理后的温度值*/
voidDelay_ms(uintcount);//延时子程序:
延时count(ms)
voidmain(){
ucharM_temper_curr;
SP=0x50;//堆栈起始地址
M_temper_up=100;//初始温度上下限
M_temper_down=0;
Delay_ms(500);
T0int_init();//T0T1初始化
T1int_init();
while
(1)
{
if(B_set_T0)//T0定时读取温度标志
{
EA=0;//关总中断
B_set_T0=0;
if(!
B_set)//上下限设置状态时,取消温度读取
{
PT100_change();//读取温度
M_temper_curr=PT100_Gettemper();
M_temper_conver=(M_temper_curr>126(127-M_temper_curr):
M_temper_curr);
//转换正负温度
LED_data_BCD(M_temper_conver);
//转换LED显示
}
EA=1;
}
if(B_set_T1)//T1定时LED显示扫描标志
{
TR1=0;B_set_T1=0;
++T1_count;
switch(T1_count)//依次显示4位LED
{case1:
LED_S4=1;
P_LED=LED_DISP_TAB[M_LED1];
LED_S1=0;
break;
case2:
LED_S1=1;
P_LED=LED_DISP_TAB[M_LED2];
LED_S2=0;
break;
case3:
LED_S2=1;
P_LED=LED_DISP_TAB[M_LED3];
LED_S3=0;
break;
case4:
LED_S3=1;
P_LED=LED_DISP_TAB[M_LED4];
LED_S4=0;
T1_count=0;
break;
}
TR1=1;//开T1定时器
}
if((M_temper_conver>M_temper_down)&&(M_temper_conver {//温度在上下限范围内 BUZZ=B_BUZZ_OFF; RED_ALARM=B_RED_OFF; GREEN_ALARM=B_GREEN_OFF; } else {BUZZ=B_BUZZ_ON; if(M_temper_conver RED_ALARM=B_RED_ON;//低于下限温度 else GREEN_ALARM=B_GREEN_ON;//高于上限温度 } if(! KEY_S1)//按键检测 { Set_temper();//设置温度 Delay_ms(200); } if(B_set) { if(! KEY_S2) { Inc_temper();//温度加 Delay_ms(200); } if(! KEY_S3) { Dec_temper();//温度减 Delay_ms(200); } } } } voidSet_temper()//设置温度 { ++Set_count; B_set=1;//设置标志 if(Set_count==1)//设置上限 { B_set_AI=0;LED_data_BCD(M_temper_up); M_temper_AI=M_temper_up;//将原上限温度取出 } elseif(Set_count==2)//设置下限 { B_set_AI=1; M_temper_up=M_temper_AI;//存入新的上限温度 LED_data_BCD(M_temper_down); M_temper_AI=M_temper_down;//将原下限温度取出 } else {//确认退出 B_set=0; Set_count=0; LED_data_BCD(M_temper_conver); M_temper_down=M_temper_AI;//存入新的下限温度 } } voidInc_temper()//温度加 { if(B_set_AI)//判断当前是设置上限(0)还是下限 (1) { if((M_temper_AI { M_temper_AI++; }//不能加到上线温度和温度范围 } else { if(M_temper_AI { M_temper_AI++; } }LED_data_BCD(M_temper_AI); } voidDec_temper()//温度减 { if(B_set_AI)//判断当前是设置上限(0)还是下限 (1) { if(M_temper_AI>M_temper_MIN) { M_temper_AI--; } } else { if((M_temper_AI>M_temper_MIN)&&(M_temper_AI>M_temper_down)) { M_temper_AI--; } } LED_data_BCD(M_temper_AI); } voidPT100_delay(uintcount)//PT100特定延时 { uinti; while(count) { i=200; while(i>0) i--; count--; } } voidPT100_reset(void)//PT100复位初始 {uinti; DQ=0; i=103; while(i>0)i--; DQ=1; i=4; while(i>0)i--; } bitPT100_readbit(void)//PT100位读子程序 { uinti; bitdat; DQ=1;_nop_(); DQ=0;i++; DQ=1;i++;i++; dat=DQ; i=8;while(i>0)i--; return(dat); } ucharPT100_readbyte(void)//PT100字节读子程序 { uchari,j,dat; dat=0; for(i=1;i<=8;i++) { j=PT100_readbit(); dat=(j<<7)|(dat>>1);//把读取的数据一位一位放进去} return(dat); } voidPT100_writebyte(uchardat)//PT100字节写子程序 { uinti; ucharj; bittestb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb)//write1 { DQ=0; i++;i++; DQ=1; i=8;while(i>0)i--; } else { DQ=0;//write0 i=8;while(i>0)i--; DQ=1; i++;i++; } } } voidPT100_change(void)//启动PT100温度转换 { PT100_reset(); PT100_delay (1); PT100_writebyte(0xcc);PT100_writebyte(0x44); } ucharPT100_Gettemper()//读取PT100温度数据 { uinttemp; ucharM_temper_L=0,M_temper_H=0; PT100_reset(); PT100_delay (1); PT100_writebyte(0xcc); PT100_writebyte(0xbe); M_temper_L=PT100_readbyte(); M_temper_H=PT100_readbyte(); temp=M_temper_H;//温度数据处理 temp<<=8; temp=temp|M_temper_L; if(M_temper_H>0xf0)//正(0)负 (1)温度值 { temp=((0x1000-(temp&0x0fff))/16)+127;//计算温度 } else { temp=temp/16; } M_temper_H=temp; returnM_temper_H; } voidLED_data_BCD(charDisp_dat)//显示数据LED编码处理 { if(Disp_dat<0)//负温度 {M_LED1=0X0a;//调用第10个 M_LED2=(0-Disp_dat)/10; M_LED3=(0-Disp_dat)%10; } else { M_LED1=Disp_dat/100;//正温度 M_LED2=(Disp_dat%100)/10; M_LED3=(Disp_dat%100)%10; } if(B_set)//设置状态时显示字符 { if(B_set_AI) { M_LED4=0x0c; } else { M_LED4=0x0b; } } else { M_LED4=0x0d; } } voidT0int_init()//定时器T0初始化 { TMOD=0X11; TH0=(65536-XTAL/12*T0_TIMER)/256; TL0=(65536-XTAL/12*T0_TIMER)%256;EA=1; ET0=1; TR0=1; } voidT1int_init()//定时器T1初始化 { TMOD=0X11; TH1=(65536-XTAL/12*T1_TIMER)/256; TL1=(65536-XTAL/12*T1_TIMER)%256; EA=1; ET1=1; TR1=1; } voidDelay_ms(uintcount)//延时count(ms) { uinti; while(--count>0) { for(i=0;i<125;i++); } } voidTimer0()interrupt1using1//T0定时器中断服务程序 { if(++T0_count>T0_TIMER_S); {B_set_T0=1; T0_count=0; } TH0=(65536-XTAL/12*T0_TIMER)/256; TL0=(65536-XTAL/12*T0_TIMER)%256; TF0=0; } voidTimer1()interrupt3using1//T0定时器中断服务程序 {B_set_T1=1; TH1=(65536-XTAL/12*T1_TIMER)/256; TL1=(65536-XTAL/12*T1_TIMER)%256; TF1=0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 控制器 程序