温度控制器程序教学内容.docx

上传人:b****8 文档编号:30429873 上传时间:2023-08-14 格式:DOCX 页数:17 大小:17.35KB
下载 相关 举报
温度控制器程序教学内容.docx_第1页
第1页 / 共17页
温度控制器程序教学内容.docx_第2页
第2页 / 共17页
温度控制器程序教学内容.docx_第3页
第3页 / 共17页
温度控制器程序教学内容.docx_第4页
第4页 / 共17页
温度控制器程序教学内容.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

温度控制器程序教学内容.docx

《温度控制器程序教学内容.docx》由会员分享,可在线阅读,更多相关《温度控制器程序教学内容.docx(17页珍藏版)》请在冰豆网上搜索。

温度控制器程序教学内容.docx

温度控制器程序教学内容

 

温度控制器程序

//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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1