蓝桥杯单片机学习过程记录(十三)第五届温度采集控制

蓝桥杯单片机学习过程记录(十三)第五届温度采集控制

一是锁存器的使用
P2=(P2&0X1F)
二是使用了官方提供的底层驱动程序,
有两点改动:一是onewire.c中的Delay函数要改成12个循环,因为52跟15的振荡不一样
二是onewire.h中的头文件把.c中的函数加进去,要不然报错,官方提供中没有。
三是把.c文件加到main里。

主函数

//第五届温度采集及控制
#include 
#include 
#include "onewire.h"
unsigned char num;
unsigned char max_1,max_2,min_1,min_2,temp_set,num_set;
unsigned char flag_jiemian,flag_led,flag_false;
unsigned char t;
unsigned char wendu,wendu_min,wendu_max;
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
void allinit();
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void Delay500us();
void delayms(int ms);
void time0_init();
void key_scan();
unsigned char ds18_get(void);
void main(){
 //初始化参数
 allinit();
 wendu_min=20;
 wendu_max=30;
 //定时器初始化
 time0_init();
 EA=1;ET0=1;
 yi=10;er=11;san=10;si=11;wu=11;liu=11;qi=11;ba=11;
 while(1){
  //温度获取
  wendu=ds18_get();
  //进入界面功能判断
  //温度显示页面
  if(flag_jiemian==0){
   //进行温度判断
   //小于温度设定最低
   if(wendu<wendu_min){
    //0模式,继电器关闭,小灯0.8闪
    er=0;
    flag_led=0;
    P2=(P2&0x1f)|0XA0;P0=0X00;
    P2=P2&0x1f;
   }
   //大于温度设定最高
   else if(wendu>wendu_max){
    //2模式,小灯0.2闪,继电器开
    er=2;    
    P2=(P2&0x1f)|0XA0;P0=0X10;
    P2=P2&0x1f;
    flag_led=2;
   }
   //中间值
   else{
    //1模式,小灯0.4闪,继电器关闭
    er=1;
    P2=(P2&0x1f)|0XA0;P0=0X00;
    P2=P2&0x1f;
    flag_led=1;
   }
   yi=10;san=10;si=11;wu=11;liu=11;qi=wendu/10;ba=wendu%10;
   key_scan();
   display_12(yi,er);
   display_34(san,si);
   display_56(wu,liu);
   display_78(qi,ba);
   P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
  }
  //温度设定界面
  else if(flag_jiemian==1){
   while(1){
    key_scan();
    //依次设定最大最小值
    switch(num_set){
     case 0:break;
     case 1:max_1=temp_set;break;
     case 2:max_2=temp_set;break;
     case 3:min_1=temp_set;break;
     case 4:min_2=temp_set;break;
    }
    yi=10;er=max_1;san=max_2;si=11;wu=11;liu=10;qi=min_1;ba=min_2;
    if(flag_jiemian==0)
     break;
    display_12(yi,er);
    display_34(san,si);
    display_56(wu,liu);
    display_78(qi,ba);
    P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
   }
  }  
 }
}

矩阵按键

void key_scan(){
 unsigned char temp;
 //第一列s7s6s5s4
 P44=0;P42=1;P3=0XFF;temp=P3;
 temp=(temp&0x0f);
 if(temp!=0x0f){
  delayms(5);
  temp=P3;temp=(temp&0x0f);
  if(temp!=0x0f){
   temp=P3;
   switch(temp){
    case 0xfe:  temp_set=0;num_set++;break;
    case 0xfd:  temp_set=3;num_set++;break;
    case 0xfb:  temp_set=6;num_set++;break;
    case 0xf7:  temp_set=9;num_set++;break;
   }
   while(temp!=0x0f){
    temp=P3;
    temp=(temp&0x0f);
   }
  }
 }
 //第2列s11s10s9s8
 P44=1;P42=0;P3=0XFF;temp=P3;
 temp=(temp&0x0f);
 if(temp!=0x0f){
  delayms(5);
  temp=P3;temp=(temp&0x0f);
  if(temp!=0x0f){
   temp=P3;
   switch(temp){
    case 0xfe:temp_set=1;num_set++; break;
    case 0xfd:temp_set=4;num_set++; break;
    case 0xfb:temp_set=7;num_set++; break;
    case 0xf7:  
     if(flag_jiemian==0) {
      flag_jiemian=1;
     }
     else if(flag_jiemian==1) {
      wendu_min=min_1*10+min_2;
      wendu_max=max_1*10+max_2;
      if(wendu_max<wendu_min){
       P2=(P2&0x1f)|0x80;P0=0XFD;
       P2=P2&0x1f;
       flag_false=1;
      }
      else{
       flag_false=0;
       num_set=0;
       flag_jiemian=0;
      }
     }
     break;
   }
   while(temp!=0x0f){
    temp=P3;
    temp=(temp&0x0f);
   }
  }
 }
 //第三列s15-12
 P44=1;P42=1;P3=0XDF;temp=P3;
 temp=(temp&0x0f);
 if(temp!=0x0f){
  delayms(5);
  temp=P3;temp=(temp&0x0f);
  if(temp!=0x0f){
   temp=P3;
   switch(temp){
    case 0xde: temp_set=2;num_set++;  break;
    case 0xdd: temp_set=5;num_set++; break;
    case 0xdb: temp_set=8;num_set++; break;
    case 0xd7: max_1=0;max_2=0;min_1=0;min_2=0;num_set=0; break;
   }
   while(temp!=0x0f){
    temp=P3;
    temp=(temp&0x0f);
   }
  }
 }
}
//定时器初始化
void time0_init(){
 AUXR|=0X80;
 TMOD&=0XF0;
 TL0=0X00;
 TH0=0X28;
 TF0=0;TR0=1;
}
void time0(void) interrupt 1{
 t++;
  if(flag_jiemian==0){
   if(flag_led==0){
    if(t%200==0){
     if(num==1){
      P2=(P2&0x1f)|0x80;P0=0XFE;
      P2=P2&0x1f;
      num=0;
     }
     else if(num==0){
      P2=(P2&0x1f)|0x80;P0=0XFF;
      P2=P2&0x1f;
      num=1;
     }
    } 
   }
   else if(flag_led==1){
    if(t>80){
     t=0;
     if(num==1){
      P2=(P2&0x1f)|0x80;P0=0XFE;
      P2=P2&0x1f;
      num=0;
     }
     else if(num==0){
      P2=(P2&0x1f)|0x80;P0=0XFF;
      P2=P2&0x1f;
      num=1;
     }
    }
   }
   else if(flag_led==2){
    if(t%40==0){
     if(num==1){
      P2=(P2&0x1f)|0x80;P0=0XFE;
      P2=P2&0x1f;
      num=0;
     }
     else if(num==0){
      P2=(P2&0x1f)|0x80;P0=0XFF;
      P2=P2&0x1f;
      num=1;
     }
    }
   }
  }
}

温度及其他

//温度读取
unsigned char ds18_get(void){
 unsigned char low,high,temp;
 init_ds18b20();
 Write_DS18B20(0XCC);
 Write_DS18B20(0X44);
 Delay500us();
 init_ds18b20();
 Write_DS18B20(0xcc);
 Write_DS18B20(0xbe);
 low=Read_DS18B20();
 high=Read_DS18B20();
 init_ds18b20();
 temp=high<<4;
 temp=temp|(low>>4);
 return temp;
}
//延时
void Delay500us()  //@11.0592MHz
{
 unsigned char i, j;
 _nop_();
 _nop_();
 i = 6;
 j = 93;
 do
 {
  while (--j);
 } while (--i);
}
void allinit(){
 P2=0XA0;P0=0X00;
 P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
 P2=0X80;P0=0XFF;
}
void delayms(int ms){
 int q,w;
 for(q=0;q<ms;q++)
  for(w=0;w<845;w++);
}
void display_12(yi,er){
 P2=0XC0;P0=0X01;P2=0XE0;P0=seg[yi];
 delayms(1);
 P2=0XC0;P0=0X02;P2=0XE0;P0=seg[er];
 delayms(1);
}
void display_34(san,si){
 P2=0XC0;P0=0X04;P2=0XE0;P0=seg[san];
 delayms(1);
 P2=0XC0;P0=0X08;P2=0XE0;P0=seg[si];
 delayms(1);
}
void display_56(wu,liu){
 P2=0XC0;P0=0X10;P2=0XE0;P0=seg[wu];
 delayms(1);
 P2=0XC0;P0=0X20;P2=0XE0;P0=seg[liu];
 delayms(1);
}
void display_78(qi,ba){
 P2=0XC0;P0=0X40;P2=0XE0;P0=seg[qi];
 delayms(1);
 P2=0XC0;P0=0X80;P2=0XE0;P0=seg[ba];
 delayms(1);
}

你可能感兴趣的:(单片机)