找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1|回复: 0
收起左侧

STC89C52RC借用51黑程序点亮4按键TM1650

[复制链接]
ID:673920 发表于 2026-4-18 22:04 | 显示全部楼层 |阅读模式
借用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,0x00);//
        }

}

/*******************************************************************************
功能:设置显示亮度
描述:
参数:
返回:
*******************************************************************************/
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,0x00);//
        }

}

/*******************************************************************************
功能:设置显示亮度
描述:
参数:
返回:
*******************************************************************************/
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熄灭         

}
                }





51hei图片_20260418215354_35_1.jpg
51hei图片_20260418215355_36_1.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表