|
|
借用51黑 单片机论坛
单片机DIY制作 http://www.51hei.com/bbs/dpj-225200-1.html【新提醒】stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB -
的程序进行简单修改而成。
实验板使用普中 HC6800-ES V2.0 单片使用 STC89C52RC
/*******************************************************************
借用51黑 单片机论坛
【新提醒】stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB -
单片机DIY制作 http://www.51hei.com/bbs/dpj-225200-1.html
的程序进行简单修改而成。
实验板使用普中 HC6800-ES V2.0 单片使用 STC89C52RC
K1 数值增加;K2 数值减少; K3 数值复位; K4 数值清零;
***********************************************************************/
- /******************************************
- 名称:aip650的驱动
- 时间:2022-11-13
- 版本:
- 作者:cjz
- **************************************************/
- //头文件
- #include <STC89C5xRC.H>
- #include <absacc.h>
- #include <intrins.h>
- //#include <EEPROM.H>
- /*************************************************
- 常量、变量定义区
- ***************************************************/
- //常量定义
- #define true 1
- #define false 0
- #define uchar unsigned char
- #define uint unsigned int
- //数组定义
- uchar Display_Code[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x40,0x00};
- //共阴数码管段码 0, 1, 2, 3, 4 , 5, 6, 7, 8, 9, ., -, 不亮
- uchar Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位码
- uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度调节
- uchar keyvalue;
- uint wendu;//用于存储温度值
- uchar a,cou;//菜单标志,计数,cou1 menu=0,
- /***************************温度小数部分用查表法*****************/
- uchar ditab[16]=
- {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
- uchar display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
- //定义IO口
- sbit SDA=P1^0;
- sbit SCL=P1^1;
- //sbit DQ=P3^7; //ds18b20温度输入口
- //sbit DIN=P1^3; //LED小数点控制
- sbit out1=P2^0; //测试TM1650按键用
- sbit out2=P2^1; //测试TM1650按键用
- sbit out3=P2^2; //测试TM1650按键用
- sbit out4=P2^3; //测试TM1650按键用
- sbit out5=P2^4;
- sbit in1=P3^1; //测试实验板按键用
- sbit in2=P3^2; //测试实验板按键用
- sbit in3=P3^3; //测试实验板按键用
- /**********************************函数定义区************************************/
- //I2C相关
- /*******************************************************************************
- 功能:I2CWait
- 描述:I2C延时
- 参数:
- 返回:
- *******************************************************************************/
- void I2CWait(void)
- {_nop_();_nop_();_nop_();_nop_();
- }
- /*******************************************************************************
- 功能:I2CStart
- 描述:开启I2C总线
- 参数:
- 返回:位变量,1=I2C总线可用,0=不可用
- *******************************************************************************/
- bit I2CStart(void)
- {
- SDA=1;
- SCL=1;
- I2CWait();
- if(!SDA)
- return false;//SDA线为低电平则总线忙,退出
- SDA=0;
- I2CWait();
- while(SDA)
- return false;//SDA线为高电平则总线出错,退出
- SCL=0;
- I2CWait();
- return true;
- }
- /*******************************************************************************
- 功能:I2CStop(void)
- 描述:关闭I2C总线
- 参数:
- 返回:
- *******************************************************************************/
- void I2CStop(void)
- {
- SDA=0;
- SCL=0;
- I2CWait();
- SCL=1;
- I2CWait();
- SDA=1;
- }
- /*******************************************************************************
- 功能:I2CSendAck
- 描述:发送ACK信号
- 参数:
- 返回:
- *******************************************************************************/
- void I2CSendAck(void)
- {
- SDA=0;
- SCL=0;
- I2CWait();
- SCL=1;
- I2CWait();
- SCL=0;
- }
- /*******************************************************************************
- 功能:I2CWaitAck
- 描述:读取ACK信号
- 参数:
- 返回:位变量, 1=有ACK,0=无ACK
- *******************************************************************************/
- bit I2CWaitAck(void)
- {
- uchar errtime=255;
- SCL=0;
- SDA=1;
- I2CWait();
- SCL=1;
- I2CWait();
- while(SDA)
- {
- errtime--;
- if(!errtime)
- SCL=0;
- return false;
- }
- SCL=0;
- return true;
- }
- /*******************************************************************************
- 功能:I2CSendByte
- 描述:向总线发送一个字节
- 参数:待发送字节demand,发送顺序指示order
- order=1,从HI-->LO发送8bit数
- order=0,从LO-->HI发送8bit数
- 返回:
- *******************************************************************************/
- void I2CSendByte(uchar demand,bit order)
- {
- uchar i=8;
- if(order)
- {
- while(i--)
- {
- SCL=0;
- _nop_();
- SDA=(bit)(demand&0x80);
- demand<<=1;
- I2CWait();
- SCL=1;
- I2CWait();
- }
- SCL=0;
- }
- else
- {
- while(i--)
- {
- SCL=0;
- _nop_();
- SDA=(bit)(demand&0x01);
- demand>>=1;
- I2CWait();
- SCL=1;
- I2CWait();
- }
- SCL=0;
- }
- }
- /*******************************************************************************
- 功能:I2CReceiveByte
- 描述:从总线读一个字节
- 参数:
- 返回:
- *******************************************************************************/
- uchar I2CReceiveByte(void)
- {
- uchar i=8;
- uchar ddata=0;
- SDA=1;
- while(i--)
- {
- ddata>>=1;//数据从低位开始读取
- SCL=0;
- I2CWait();
- SCL=1;
- I2CWait();//从低位开始 ddata|=SDA;ddata>>=1
- if(SDA)
- {
- ddata|=0x80;
- }
- }
- SCL=0;
- return ddata;
- }
- /*******************************************************************************
- 功能:从650读键值
- 描述:
- 参数:
- 返回:uchar键值
- *******************************************************************************/
- uchar AipReadKey()
- {
- uchar key;
- I2CStart();
- I2CSendByte(0x4f,1);
- if(I2CWaitAck())
- {
- key=I2CReceiveByte();
- I2CSendAck();
- }
- I2CStop();
- return key;
- }
- /*******************************************************************************
- 功能:向650发送地址,和数据
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Aip650_Set(uchar add,uchar dat)
- {
- //写显存必须从高地址开始写
- I2CStart();
- I2CSendByte(add,1);
- I2CSendAck();
- I2CSendByte(dat,1);
- I2CSendAck();
- I2CStop();
- }
- /*******************************************************************************
- 功能:驱动数码管显示数字
- 描述:位码数组中选择对应的位地址,在段码数组中选择对应数字的段码发送给650
- 参数:
- 返回:
- *******************************************************************************/
- void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
- {
- Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);
- }
- /*******************************************************************************
- 功能:650清屏
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Aip650_CLR()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- Aip650_Set(Dig_Bit_Code[i],0x00);//[/i][i]
- }
- }
- /*******************************************************************************
- 功能:设置显示亮度
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Light_Level_Set(uchar level)
- {
- Aip650_Set(0x48,Light_Level_Code[level-1]);
- }
- //温度用
- /*******************************************************************************
- 功能:delay 延时程序 11us
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void delay(uint t)
- {
- for(;t>0;t--);
- }
- /*******************************************************************************
- 功能:温度处理
- 描述:二进制数的高字节的低半字节和低字节的高半字节组成一个字,这个字节转换为十进制后,
- 就是温度的百、十、个位值,而剩下的低字节的低半字节转化成十进制后,就是温度值的小数部分。
- 参数:
- 返回:
- *******************************************************************************/
- void work_temp(uint tem)
- {
- uchar n=0;
- display[4]=tem&0x0f;
- display[0]=ditab[display[4]];//存入小数部分的显示值
- display[4]=tem>>4;
- display[3]=display[4]/100;//取百位数据暂存
- display[1]=display[4]%100;//取后两位数据暂存
- display[2]=display[1]/10;//取十位数据暂存
- display[1]=display[1]%10;
- /***********符号位显示判断*************************/
- if(!display[3])
- {
- display[3]=0x0c; //最高位为0时不显示
- if(!display[2])
- {
- display[2]=0x0c; //次高位为0时不显示
- }
- if(n)
- {display[3]=0x0b;} //负温度时最高位显示“-”
- }
- }
- /*******************************************************************************
- 功能:显示温度
- 描述:处理温度数值,发送650
- 参数:
- 返回:
- 显示的位置
- *******************************************************************************/
- void xianshiwendu(uint tem1)
- {
- /****************************修改***************************************************/
- work_temp(tem1);
- Aip650_CLR();
- Light_Level_Set(2);
- // Aip650_DisPlay(3,10);//显示小数点
- Aip650_DisPlay(2,display[2]);//十位
- // Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//个位加小数点
- Aip650_DisPlay(3,display[1]);//个位
- Aip650_DisPlay(4,display[0]);//小数
- }
- /*********************************************************************************************
- 函数名:定时/计数器初始化函数
- 调 用:T_C_init();
- /**********************************************************************************************/
- void Timer0_init (void){
- TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
- EA = 1; //中断总开关
- TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
- TL0 = 0xb0; //16位计数寄存器T0低8位
- ET0 = 1; //T/C1中断开关
- TR0 = 0; //T/C1关闭开关
- }
- /*********************************************************************************************
- 函数名:定时/计数器1中断处理函数
- 调 用:[T/C1溢出后中断处理]
- /*****************************/
- void Timer0(void) interrupt 1 using 1{ //切换寄存器组到1
- cou++; // 软计数器加1
- if(cou > 99){// 计数值到(5s)
- cou = 0;// 软计数器清零
- TR0 = 0; //T/C1停止计数
- // menu=0;//返回 主菜单的温度显示界面
- }
- TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
- TL0 = 0xb0; //16位计数寄存器T0低8位
- }
- /*******************************************************************************
- 功能:
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Delay1ms (unsigned int a){ // 1ms延时程序
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629
- }
- }
- /******************************主函数*****************************************
- 功能:
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void main()
- {
- Aip650_CLR();
- Timer0_init();//定时器初始化
- wendu=532; //16进制 二进制的333
- while(1)
- {
- if(in1==0){out1=0;out2=1;out3=0;out4=1;}
- if(in2==0){out1=1;out2=0;out3=1;out4=0;}
- if(in3==0){out1=1;out2=1;out3=1;out4=1;}
- if(wendu>532){out5=0;}else out5=1;
- keyvalue=AipReadKey();
- /**********************显示界面******************************/
- xianshiwendu(wendu);
- /*********************数值调整*******************************/
- if(keyvalue==0xf2){ out2=0;
- Delay1ms(10);
- if(keyvalue==0xf2){
- wendu++; //按下K2键则温度上限加零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- while(keyvalue!=0xf2);
- }
- } else out2=1;
- if(keyvalue==0xe2){ out1=0;
- Delay1ms(10);
- if(keyvalue==0xe2){
- wendu--; //按下K1键则温度上限减零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- while(keyvalue!=0xe2);
- }
- } else out1=1;
- /*************************按下K3键数值清零***************************/
- if(keyvalue==0xea){ out3=0;
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- wendu=0; //按下K3键则菜单加一
- while(keyvalue!=0xea);
- } else out3=1;
- /*************************按下K4键数值复位***************************/
- if(keyvalue==0xfa){ out4=0;
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- wendu=532; //按下K4键则菜单加一
- while(keyvalue!=0xfa);
- } else out4=1;
- }
- }
- // 【新提醒】stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB -
- //单片机DIY制作 http://www.51hei.com/bbs/dpj-225200-1.html
- /******************************************
- 名称:aip650的驱动
- 时间:2022-11-13
- 版本:
- 作者:cjz
- **************************************************/
- //头文件
- #include <STC89C5xRC.H>
- #include <absacc.h>
- #include <intrins.h>
- //#include <EEPROM.H>
- /*************************************************
- 常量、变量定义区
- ***************************************************/
- //常量定义
- #define true 1
- #define false 0
- #define uchar unsigned char
- #define uint unsigned int
- //数组定义
- uchar Display_Code[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x40,0x00};
- //共阴数码管段码 0, 1, 2, 3, 4 , 5, 6, 7, 8, 9, ., -, 不亮
- uchar Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位码
- uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度调节
- uchar keyvalue;
- uint wendu;//用于存储温度值
- uint maxwendu;
- uint minwendu;
- uchar menu=0, cou;//菜单标志,计数,cou1
- uint h;//温度计算使用
- uint temp;//温度返回值
- uchar a,b,c,shuchu;
- /***************************温度小数部分用查表法*****************/
- uchar ditab[16]=
- {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
- uchar temp_data[2]={0x00,0x00};//读出温度暂存
- uchar display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
- //定义IO口
- sbit SDA=P1^0;
- sbit SCL=P1^1;
- sbit DQ=P3^7; //ds18b20温度输入口
- //sbit DIN=P1^3; //LED小数点控制
- sbit out1=P2^0;
- sbit out2=P2^1;
- sbit out3=P2^2;
- sbit out4=P2^3;
- sbit out5=P2^4;
- sbit in1=P3^1; //测试实验板按键用
- sbit in2=P3^2; //测试实验板按键用
- sbit in3=P3^3; //测试实验板按键用
- /**********************************函数定义区************************************/
- //I2C相关
- /*******************************************************************************
- 功能:I2CWait
- 描述:I2C延时
- 参数:
- 返回:
- *******************************************************************************/
- void I2CWait(void)
- {_nop_();_nop_();_nop_();_nop_();
- }
- /*******************************************************************************
- 功能:I2CStart
- 描述:开启I2C总线
- 参数:
- 返回:位变量,1=I2C总线可用,0=不可用
- *******************************************************************************/
- bit I2CStart(void)
- {
- SDA=1;
- SCL=1;
- I2CWait();
- if(!SDA)
- return false;//SDA线为低电平则总线忙,退出
- SDA=0;
- I2CWait();
- while(SDA)
- return false;//SDA线为高电平则总线出错,退出
- SCL=0;
- I2CWait();
- return true;
- }
- /*******************************************************************************
- 功能:I2CStop(void)
- 描述:关闭I2C总线
- 参数:
- 返回:
- *******************************************************************************/
- void I2CStop(void)
- {
- SDA=0;
- SCL=0;
- I2CWait();
- SCL=1;
- I2CWait();
- SDA=1;
- }
- /*******************************************************************************
- 功能:I2CSendAck
- 描述:发送ACK信号
- 参数:
- 返回:
- *******************************************************************************/
- void I2CSendAck(void)
- {
- SDA=0;
- SCL=0;
- I2CWait();
- SCL=1;
- I2CWait();
- SCL=0;
- }
- /*******************************************************************************
- 功能:I2CWaitAck
- 描述:读取ACK信号
- 参数:
- 返回:位变量, 1=有ACK,0=无ACK
- *******************************************************************************/
- bit I2CWaitAck(void)
- {
- uchar errtime=255;
- SCL=0;
- SDA=1;
- I2CWait();
- SCL=1;
- I2CWait();
- while(SDA)
- {
- errtime--;
- if(!errtime)
- SCL=0;
- return false;
- }
- SCL=0;
- return true;
- }
- /*******************************************************************************
- 功能:I2CSendByte
- 描述:向总线发送一个字节
- 参数:待发送字节demand,发送顺序指示order
- order=1,从HI-->LO发送8bit数
- order=0,从LO-->HI发送8bit数
- 返回:
- *******************************************************************************/
- void I2CSendByte(uchar demand,bit order)
- {
- uchar i=8;
- if(order)
- {
- while(i--)
- {
- SCL=0;
- _nop_();
- SDA=(bit)(demand&0x80);
- demand<<=1;
- I2CWait();
- SCL=1;
- I2CWait();
- }
- SCL=0;
- }
- else
- {
- while(i--)
- {
- SCL=0;
- _nop_();
- SDA=(bit)(demand&0x01);
- demand>>=1;
- I2CWait();
- SCL=1;
- I2CWait();
- }
- SCL=0;
- }
- }
- /*******************************************************************************
- 功能:I2CReceiveByte
- 描述:从总线读一个字节
- 参数:
- 返回:
- *******************************************************************************/
- uchar I2CReceiveByte(void)
- {
- uchar i=8;
- uchar ddata=0;
- SDA=1;
- while(i--)
- {
- ddata>>=1;//数据从低位开始读取
- SCL=0;
- I2CWait();
- SCL=1;
- I2CWait();//从低位开始 ddata|=SDA;ddata>>=1
- if(SDA)
- {
- ddata|=0x80;
- }
- }
- SCL=0;
- return ddata;
- }
- /*******************************************************************************
- 功能:从650读键值
- 描述:
- 参数:
- 返回:uchar键值
- *******************************************************************************/
- uchar AipReadKey()
- {
- uchar key;
- I2CStart();
- I2CSendByte(0x4f,1);
- if(I2CWaitAck())
- {
- key=I2CReceiveByte();
- I2CSendAck();
- }
- I2CStop();
- return key;
- }
- /*******************************************************************************
- 功能:向650发送地址,和数据
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Aip650_Set(uchar add,uchar dat)
- {
- //写显存必须从高地址开始写
- I2CStart();
- I2CSendByte(add,1);
- I2CSendAck();
- I2CSendByte(dat,1);
- I2CSendAck();
- I2CStop();
- }
- /*******************************************************************************
- 功能:驱动数码管显示数字
- 描述:位码数组中选择对应的位地址,在段码数组中选择对应数字的段码发送给650
- 参数:
- 返回:
- *******************************************************************************/
- void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
- {
- Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);
- }
- /*******************************************************************************
- 功能:650清屏
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Aip650_CLR()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- Aip650_Set(Dig_Bit_Code[i],0x00);//[/i][i]
- }
- }
- /*******************************************************************************
- 功能:设置显示亮度
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Light_Level_Set(uchar level)
- {
- Aip650_Set(0x48,Light_Level_Code[level-1]);
- }
- //温度用
- /*******************************************************************************
- 功能:delay 延时程序 11us
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void delay(uint t)
- {
- for(;t>0;t--);
- }
- /*******************************************************************************
- 功能:Ds18b20 复位函数
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void ow_reset(void)
- {
- uchar presence=1;
- while(presence)
- {while(presence)
- {
- DQ=1;
- _nop_();_nop_();//从高拉到低
- DQ=0;
- delay(50);//550us
- DQ=1;
- delay(6);//66us
- presence=DQ;//presence=0复位成功,继续下一步
- }
- delay(45);//延时500us
- presence=~DQ;
- }
- DQ=1; //拉高电平
- }
- /*******************************************************************************
- 功能:Ds18b20写命令函数
- 描述:向总线上写1个字节
- 参数:
- 返回:
- *******************************************************************************/
- void write_byte(uchar val)
- {
- uchar i;
- for(i=8;i>0;i--)
- {DQ=1;_nop_();_nop_();//从高拉低
- DQ=0; _nop_();_nop_();_nop_();_nop_();//5us
- DQ=val&0x01;// 最低位移出
- delay(6);//66us
- val=val/2;//右移一位}
- }
- DQ=1;
- delay(1);
- }
- /*******************************************************************************
- 功能:从18b20总线上读1字节
- 描述:
- 参数:
- 返回:value
- *******************************************************************************/
- uchar read_byte(void)
- {
- uchar i;
- uchar value=0;
- for(i=8;i>0;i--)
- {
- DQ=1;_nop_();_nop_();
- value>>=1;
- DQ=0;_nop_();_nop_();_nop_();_nop_();//4us
- DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
- if(DQ)value|=0x80;
- delay(6);
- }
- DQ=1;
- return(value);
- }
- /*******************************************************************************
- 功能:读出温度
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- read_temp()
- {
- ow_reset();
- delay(200);//总线复位
- write_byte(0xcc);//发命令
- write_byte(0x44);//发转换命令
- ow_reset();
- delay(1);
- write_byte(0xcc);//发命令
- write_byte(0xbe);
- temp_data[0]=read_byte();//读温度的低字节
- temp_data[1]=read_byte();//读温度的高字节
- temp=temp_data[1];
- temp<<=8;
- temp=temp|temp_data[0];// 两字节合成一个整型变量
- return temp;
- }
- /*******************************************************************************
- 功能:温度处理
- 描述:二进制数的高字节的低半字节和低字节的高半字节组成一个字,这个字节转换为十进制后,
- 就是温度的百、十、个位值,而剩下的低字节的低半字节转化成十进制后,就是温度值的小数部分。
- 参数:
- 返回:
- *******************************************************************************/
- void work_temp(uint tem)
- {
- uchar n=0;
- if(tem>6348) //温度正负判断
- {tem=65536-tem;n=1;} //负温度求补码,标志位置1
- display[4]=tem&0x0f;
- display[0]=ditab[display[4]];//存入小数部分的显示值
- display[4]=tem>>4;
- display[3]=display[4]/100;//取百位数据暂存
- display[1]=display[4]%100;//取后两位数据暂存
- display[2]=display[1]/10;//取十位数据暂存
- display[1]=display[1]%10;
- /***********符号位显示判断*************************/
- if(!display[3])
- {
- display[3]=0x0c; //最高位为0时不显示
- if(!display[2])
- {
- display[2]=0x0c; //次高位为0时不显示
- }
- if(n)
- {display[3]=0x0b;} //负温度时最高位显示“-”
- }
- }
- /*******************************************************************************
- 功能:显示温度
- 描述:处理温度数值,发送650
- 参数:
- 返回:
- 显示的位置
- *******************************************************************************/
- void xianshiwendu(uint tem1)
- {
- /****************************修改***************************************************/
- work_temp(tem1);
- Aip650_CLR();
- Light_Level_Set(2);
- Aip650_DisPlay(3,10);//显示小数点
- Aip650_DisPlay(2,display[2]);//十位
- // Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//个位加小数点
- Aip650_DisPlay(3,display[1]);//个位
- Aip650_DisPlay(4,display[0]);//小数
- }
- /*********************************************************************************************
- 函数名:定时/计数器初始化函数
- 调 用:T_C_init();
- /**********************************************************************************************/
- void Timer0_init (void){
- TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
- EA = 1; //中断总开关
- TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
- TL0 = 0xb0; //16位计数寄存器T0低8位
- ET0 = 1; //T/C1中断开关
- TR0 = 0; //T/C1关闭开关
- }
- /*********************************************************************************************
- 函数名:定时/计数器1中断处理函数
- 调 用:[T/C1溢出后中断处理]
- /*****************************/
- void Timer0(void) interrupt 1 using 1{ //切换寄存器组到1
- cou++; // 软计数器加1
- if(cou > 99){// 计数值到(5s)
- cou = 0;// 软计数器清零
- TR0 = 0; //T/C1停止计数
- menu=0;//返回 主菜单的温度显示界面
- }
- TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
- TL0 = 0xb0; //16位计数寄存器T0低8位
- }
- /*******************************************************************************
- 功能:
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void Delay1ms (unsigned int a){ // 1ms延时程序
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629
- }
- }
- /******************************主函数*****************************************
- 功能:
- 描述:
- 参数:
- 返回:
- *******************************************************************************/
- void main()
- {
- Aip650_CLR();
- Timer0_init();//定时器初始化
- maxwendu=512; //
- minwendu=432;
- while(1)
- {
- if(in1==0){out1=0;out2=1;out3=0;out4=1;}
- if(in2==0){out1=1;out2=0;out3=1;out4=0;}
- if(in3==0){out1=1;out2=1;out3=1;out4=1;}
- if(a==1){out5=0;}else out5=1;
- keyvalue=AipReadKey();
- /**********************显示温度界面******************************/
- if(menu==0){
- // for(k=15;k>0;k--){
- wendu=read_temp();
- xianshiwendu(wendu);
- }
- /*********************进入调温度上限界面*******************************/
- if(menu==1){
- if(minwendu>maxwendu) //如果下限温度高于上限温度,显示00
- { Aip650_CLR();
- Light_Level_Set(2);
- Aip650_DisPlay(1,0);
- Aip650_DisPlay(2,0);
- }
- else
- {
- xianshiwendu(maxwendu);}
- if(keyvalue==0xf2){ out2=0;
- Delay1ms(10);
- if(keyvalue==0xf2){
- maxwendu++; //按下K2键则温度上限加零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- while(keyvalue!=0xf2);
- }
- } else out2=1;
- if(keyvalue==0xe2){ out1=0;
- Delay1ms(10);
- if(keyvalue==0xe2){
- maxwendu--; //按下K1键则温度上限减零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- while(keyvalue!=0xe2);
- }
- } else out1=1;
- }
- /*********************进入调温度下限界面*******************************/
- if(menu==2){
- if(minwendu>maxwendu) //如果下限温度高于上限温度,显示00
- { Aip650_CLR();
- Light_Level_Set(2);
- Aip650_DisPlay(1,0);
- Aip650_DisPlay(2,0);
- }
- else
- {
- xianshiwendu(minwendu);}
- if(keyvalue==0xf2){ out1=0;
- Delay1ms(10);
- if(keyvalue==0xf2){
- minwendu++; //按下K2键则温度下限加零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- while(keyvalue!=0xf2);
- }
- } else out1=1;
- if(keyvalue==0xe2){
- Delay1ms(10);
- if(keyvalue==0xe2){ out2=0;
- minwendu--; //按下K1键则温度下限减零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- while(keyvalue!=0xe2);
- }
- } else out2=1;
- }
- /*************************按下K3键进入下限菜单设置界面***************************/
- if(keyvalue==0xea){ out3=0;
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- menu=2; //按下K3键则菜单加一
- while(keyvalue!=0xea);
- } else out3=1;
- /*************************按下K4键进入上限菜单设置界面***************************/
- if(keyvalue==0xfa){ out4=0;
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- menu=1; //按下K4键则菜单加一
- while(keyvalue!=0xfa);
- } else out4=1;
- /*********************控制温度界面*******************************/
- if(wendu<minwendu) {a=1;}
- //检测温度低于下限温度 P2.4点亮
-
- if(wendu>maxwendu) {a=0;}
- //检测温度高于上限温度 P2.4熄灭
- }
- }
复制代码
|
|