找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1136|回复: 4
收起左侧

带//是温度控制,想把带温度控制界面写进去,写不进去 附单片机程序

[复制链接]
ID:985137 发表于 2022-3-21 19:36 | 显示全部楼层 |阅读模式
sbit Lock = P3^7;  //代表锁控的继电器IO   高电平关锁,低电平开锁
sbit LEDRED = P3^3;  //代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
sbit LEDGREEN = P3^4;  //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
uchar genPasswd[4];           //存储生成的四位随机数密码
uchar inpPasswd[4];           //存储取包时输入的四位密码

uchar code welcome[9]="welcome!";  //开机显示的欢迎标语
uchar code set[7]="Passwd";    //显示生成的密码标题
uchar code close[12]="close door!";   //提示关门
uchar code input[13]="input passwd";   //提示请输入密码

/****************定时器设置相关的变量***********************/
unsigned char TL0_temp;         /*暂存TL0的初值*/
unsigned char TH0_temp;         /*暂存TH0的初值*/
#define INT_CLOCK 10    /*INT_CLOCK为定时值,单位为ms ,此处定义为10ms*/
#define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY为晶振频率,单位为Hz*/


/*延时程序*/
void delay(uint z)               
{
        unsigned int i,j;
   for(i=0;i<z;i++)
    for(j=0;j<100;j++);
}


/******************************
显示首页 welcome
******************************/
void display1()
{
   unsigned char i;
   for(i = 0;i < 8;i++)
   {
                   wr_com(0x84+i);
                wr_dat(welcome[ i]);               
   }
}


/************************************
显示密码生成界面
************************************/
void display2()
{
   unsigned char i;

   for(i = 0;i < 6;i++)
   {
                   wr_com(0x85+i);
                wr_dat(set[ i]);
   }
   for(i = 0;i < 4;i++)
   {
                   wr_com(0xc6+i);
                wr_dat(genPasswd[ i]+0x30);
               
   }
}

/************************************
显示请关门界面
************************************/

void display3()
{
   unsigned char i;
   for(i = 0;i < 11;i++)
   {
                   wr_com(0x83+i);
                wr_dat(close[ i]);
   }

}


/************************************
显示密码输入界面
************************************/
void display4()
{
   unsigned char i;
   for(i = 0;i < 12;i++)
   {
                   wr_com(0x82+i);
                wr_dat(input[ i]);
   }
   for(i = 0;i < 4;i++)
   {
                   wr_com(0xc6+i);
                wr_dat(inpPasswd[ i]+0x30);
               
   }

}
        


/***********************************
定时器0初始化
***********************************/
void Timer0_init()
{
        unsigned long T0_temp;                                     /*暂存T0的初始值        */
        T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值计算公式,参考教科书*/
        TL0_temp = T0_temp & 0xff;
        TH0_temp = T0_temp >> 8;
        TL0 = TL0_temp;
        TH0 = TH0_temp;
        TMOD |= 0x01;
        TR0 = 1;                        /*开定时器0中断*/
        ET0 = 1;  
        EA = 1;                    /*开总中断*/                                       

}

void T0_interrupt(void) interrupt 1         
{
        TH0 += TH0_temp;
        TL0 += TL0_temp;

}


void writestring(uchar x,uchar y,uchar *s) //LCD 写字符串
{     
        if (y == 0)  wr_com(0x80 + x);     //表示第一行
        else         wr_com(0xC0 + x);      //表示第二行

        while (*s)                         //判断是否字符串的结尾
        {     
          wr_dat( *s);    //显示当前字符
                s ++;                             //字符串地址加1
        }
}

void writeChar(uchar x,uchar y,uchar s) //LCD 写字符串
{     
        if (y == 0)  wr_com(0x80 + x);     //表示第一行
        else         wr_com(0xC0 + x);      //表示第二行

        {     
          wr_dat( s);    //显示当前字符
        }
}


sbit DQ=P2^3;   //ds18b20与单片机连接口

sbit SetKey = P2^0; //设置按键
sbit UpKey  = P2^1; //加按键
sbit DnKey  = P2^2; //减按键

uchar data disdata[5];
uint tvalue,CurrentT=0;   //温度值
uchar tflag;              //温度正负标志


//bit SPL_tflag=0;
//unsigned char AlarmTempLow=0,AlarmTempTop=30,Set=0;

/************************************
温度控制界面
************************************/
void display5()
{
  writestring(0,0," Low=0   Top=30 ");          //显示“ Low=0  Top=30 ”
  writestring(0,1,"Current T=      ");          //显示“Current T= ”
                                                                                                                                            
}

void delay_18B20(unsigned int i)//延时1微秒
{
   while(i--);
}

void ds1820rst(void)/*ds1820复位*/
{
        unsigned char x=0;
        DQ = 1;          //DQ复位
        delay_18B20(4); //延时
        DQ = 0;          //DQ拉低
        delay_18B20(100); //精确延时大于480us
        DQ = 1;          //拉高
        delay_18B20(40);
}

uchar ds1820rd(void)/*读数据*/
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {   
                DQ = 0; //给脉冲信号
                dat>>=1;
                DQ = 1; //给脉冲信号
                if(DQ)
                dat|=0x80;
                delay_18B20(10);
                DQ=1;
        }
   return(dat);
}

void ds1820wr(uchar wdata)/*写数据*/
{
        unsigned char i=0;
   for (i=8; i>0; i--)    //写一个字节数据到DS18B20
   {
        DQ = 0;
        DQ = wdata&0x01;  //写一位数据
        delay_18B20(10);  //延时
        DQ = 1;           //拉高数据线
        wdata>>=1;        //准备下一位
   }
}

unsigned int Read_Temperature(void)/*读取温度值并转换*/
{
        uchar a,b;
        ds1820rst();   
        ds1820wr(0xcc);//*跳过读序列号*/
        ds1820wr(0x44);//*启动温度转换*/
        ds1820rst();   
        ds1820wr(0xcc);//*跳过读序列号*/
        ds1820wr(0xbe);//*读取温度*/
        a=ds1820rd();  //读取低位数据
        b=ds1820rd();  //读取高位数据
        tvalue=b;   
        tvalue<<=8;
        tvalue=tvalue|a;   //取得16位数据
        if(tvalue<0x0fff)   tflag=0; //判断是否正温度
        else   {tvalue=~tvalue+1;tflag=1;}    //负温度,数据取反,温度标志位为1
        tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
        CurrentT=tvalue;//保存当前温度
        return(tvalue);//返回温度值
}

void Display_Temperature()                //显示温度
{
   uchar flagdat;
   disdata[0]=tvalue/1000+0x30;//百位数
   disdata[1]=tvalue%1000/100+0x30;//十位数
   disdata[2]=tvalue%100/10+0x30;//个位数
   disdata[3]=tvalue%10+0x30;//小数位

   if(tflag==0)   flagdat=0x20;//正温度不显示符号
   else   flagdat=0x2d;//负温度显示负号:-
        if(tflag==1)
        {
                writeChar(10,1,flagdat);//显示符号位
                writeChar(11,1,disdata[0]);//显示百位
                writeChar(12,1,disdata[1]);//显示十位
                writeChar(13,1,disdata[2]);//显示个位
                writeChar(14,1,0X2E);//显示小数点
                writeChar(15,1,disdata[3]);//显示小数位
        }
        else
        {
                writeChar(10,1,disdata[0]);//显示百位
                writeChar(11,1,disdata[1]);//显示十位
                writeChar(12,1,disdata[2]);//显示个位
                writeChar(13,1,0X2e);//显示小数点
                writeChar(14,1,disdata[3]);//显示小数位
                writeChar(15,1,' ');//显示小数位
        }               
}

//void SetFun(void) //进入设置参数子函数
//{
//        if(SetKey==0)  //设置按键
//        {
//                delay(20);   //延时防抖
//                if(SetKey==0)  //设置按键
//                {
//                        if(Set<2)        Set++;   //设置按键次数累计
//                        else Set=0;
//                }
//                switch(Set) //根据设置按键次数,指向对应设置位置
//                {
//                        case 0:  writestring(0,0," ");writestring(8,0," ");break;//清除设置符号
//                        case 1:  writestring(0,0,">");writestring(8,0," ");break;//指向设置下限
//                        case 2:  writestring(0,0," ");writestring(8,0,">");break;//指向设置上限
//                }
//                while(SetKey==0);//等待按键松开
//        }
//      
//        if((UpKey==0)&&(Set!=0))//加按键按下
//        {
//                delay(20);//延时防抖
//                if(UpKey==0)//加按键按下
//                {
//                        switch(Set)//根据设置按键次数,设置上下限
//                        {
//                          case 1:
//                                                  if(!SPL_tflag)
//                                                  {        
//                                                        if(AlarmTempLow<99) AlarmTempLow++;
//                                                        else AlarmTempLow=99;                        
//                          }      
//                                                  else
//                                                  {
//                                                          if(AlarmTempLow>1) AlarmTempLow--;
//                                                          else
//                                                        {
//                                                            AlarmTempLow=0;
//                                                          SPL_tflag=0;
//                                                        }
//                                                  }
//                                                  break; //设置下限
//                                                case 2:        
//                                                if(AlarmTempTop<99) AlarmTempTop++;
//                                                else AlarmTempTop=99;
//                                                break;//设置上限
//                        }
//                        while(UpKey==0);       //等待按键松开
//                }
//        }
//      
//        if((DnKey==0)&&(Set!=0))//减按键
//        {
//                delay(20);
//                if(DnKey==0)//减按键
//                {
//                        switch(Set)//根据设置按键次数,设置上下限
//                        {
//                           case 1:
//                                                   if(!SPL_tflag)
//                                                    {        
//                                                           if(AlarmTempLow>0) AlarmTempLow--;                                
//                                   else                                                               
//                                                        {
//                                                            AlarmTempLow=1;
//                                                          SPL_tflag=1;
//                                                        }
//                                                  }
//                                                  else
//                                                  {      
//                                                         if(AlarmTempLow<99) AlarmTempLow++;
//                                                         else AlarmTempLow=99;
//                                                   }                                                                        
//                                                                break;//设置下限
//                                                                case 2:        
//                                                                if(AlarmTempTop>0) AlarmTempTop--;
//                                                                else AlarmTempTop=0; break;//设置上限
//                          }                     
//                       
//                }
//        }
//}


/*主函数*/
uchar global_state = 0;
uchar count_num = 0;  //输入的数字个数
void main()
{  
   uchar i;
   uchar passwd;

           uchar key_value = 0;
        uchar temp_key_value = 0xff;
        Lock = 1;  //刚上电 锁是需要保持闭合
        Timer0_init();        //定时器初始化
         lcd_init();        //LCD1602初始化

        while(1)        //进入不断循环
        {
                   temp_key_value = Calkey_scan();          //读取矩阵按键的键值
                if(temp_key_value != 0xff)
                {
                        key_value = temp_key_value;
                }
                switch(global_state)
                {
                        case 0:         //初始化状态
                                display1();         //显示欢迎语句        -- "welcome"
                                   
                                  writestring(0,1,"Current T=      ");          //显示“Current T= ”                           
                                  {         
                   Read_Temperature();                  //读取温度值
                   Display_Temperature();                //显示温度值                                                                  
                                  }
                                if(SetKey==0)
                                {  
                                  display5();
                      {         
                    Read_Temperature();                  //读取温度值
                    Display_Temperature();                //显示温度值                                
                                  }
                                  while(1);                                                                                 
                                }
                                       
                                                           
                                if(key_value == 13)  //存包按键被按下
                                {
                                    key_value = 0xff;  //将按键值清除
                                        Lock = 0;    //开锁
                                        clear();                 //清屏,准备下一屏的显示
                                        display3();    //显示关门提示语        -- "close door!"
                                    delay(1900);    //等待关门 大约3秒
                                        Lock = 1;   //关门
                                        clear();                 //清屏,准备下一屏的显示
                                        global_state = 1;   //切换运行状态
                                        passwd = TL0;  //采用定时器寄存器的值作为密码
                                        genPasswd[0] = passwd/100;                  //存储密码
                                        genPasswd[1] = passwd%100/10;
                                        genPasswd[2] = passwd%10;
                                        genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
                                }
                                if(key_value == 14)  //取包按键被按下
                                {
                                    key_value = 0xff;  //将按键值清除
                                        clear();    //清屏,准备下一屏的显示
                                        global_state = 2;  //切换运行状态
                                        count_num = 0;   //清除数字按键变量
                                        for(i = 0;i < 4;i++)  //清空输入的密码数组
                                        inpPasswd[ i] = ' '-0x30;
                                }
                        break;
                        case 1:                //密码生成状态
                                   display2();         //显示密码生成界面
                                delay(1900);    //等待大约3秒
                                global_state = 0;  //返回到初始界面
                                clear();        //清屏,准备下一屏的显示
                                
                        break;
                        case 2:          //输入密码状态
                           display4();           //显示输入密码界面
                           if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
                           {
                              
                                if(count_num <= 3)         //如果按键次数小于4次
                                        {
                                        inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
                                                   count_num++;
                                    }
                                         key_value = 0xff;  //将按键值清除
                           }
                           if(key_value == 15) //清除按键被按下
                           {
                                key_value = 0xff;  //将按键值清除
                                           for(i = 0;i < 4;i++)
                                        inpPasswd[ i] = ' '-0x30;  //清除刚刚输入的密码
                                        count_num=0;
                           }
                           if(key_value == 16) //确认按键被按下
                           {
                                key_value = 0xff;  //将按键值清除
                                           for(i = 0;i < 4;i++)
                                        {
                                                if(inpPasswd[ i] != genPasswd[ i])
                                                   break;
                                        }
                                        if(i == 4)          //密码输入正确
                                        {
                                                LEDRED = 1;         //红灯熄灭
                                                LEDGREEN = 0;  //绿灯亮
                                                Lock = 1;  //开锁
                                                delay(1900);    //等待大约3秒
                                                Lock = 0;  //关锁
                                                LEDGREEN = 1;  //绿灯熄灭
                                        }
                                        else   //密码输入错误
                                        {
                                                LEDRED = 0;         //红灯亮
                                                LEDGREEN = 1;  //绿灯熄灭
                                                Lock = 0;  //关锁
                                                delay(1900);    //等待大约3秒
                                                LEDRED = 1;  //红灯熄灭
                                        }
                                        clear();           //清屏,准备下一屏的显示
                                        global_state = 0;  //返回到初始界面

                           }
                        break;        
                }
        }
}
回复

使用道具 举报

ID:161164 发表于 2022-3-21 22:21 | 显示全部楼层
本来密码柜的代码写的不太好
但单独运行还能用
当要加新功能时就互相冲突
要学会模组化编程
按键归按键
显示归显示
回复

使用道具 举报

ID:985137 发表于 2022-3-21 23:21 来自手机 | 显示全部楼层
lkc8210 发表于 2022-3-21 22:21
本来密码柜的代码写的不太好
但单独运行还能用
当要加新功能时就互相冲突

太难了,后面还有超声波,GSM模块
回复

使用道具 举报

ID:584814 发表于 2022-3-22 11:24 | 显示全部楼层
很好奇密码柜用超声波做啥
回复

使用道具 举报

ID:985137 发表于 2022-3-22 13:09 | 显示全部楼层
man1234567 发表于 2022-3-22 11:24
很好奇密码柜用超声波做啥

最后要做一个智能取餐柜,超声波用来检测物体
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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