蓝桥杯单片机学习过程记录(十四)第六届温度记录

蓝桥杯单片机学习过程记录(十四)第六届温度记录


应用的内容:
定时器
数码管
时钟ds1302
温度传感器ds18b20
独立按键

结果实现的问题:
时钟和定时器两个时间走的不同,定时器5ms下200次不是1s,差别挺大,没找到什么原因。
官方的底层驱动下,ds1302的时钟获取,要修改一些东西
记录如下:

//添加
read{
	dat_1=temp/16;
	dat_2=temp%16;
	temp=dat_1*10+dat_2;
}
//添加
write{
	dat=(dat/10)<<4 | dat%10;
}

主函数:

//第六届温度记录
#include<STC15F2K60S2.H>
#include<intrins.h>
#include<iic.h>
#include<ds1302.h>
#include<onewire.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
unsigned char tt,count,num,num_1;
unsigned char set_t;
unsigned char flag_yemian,flag_get_t,flag_led;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char shijian[7];
unsigned char wendu_list[10];
unsigned char wendu_temp;
unsigned char init_t[]={50,59,23,0,0,0,0};
void allinit();
void delayms(int ms);
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void key_scan();
void ds1302_init();
void ds_1302_get();
void time0_init(void);
unsigned char ds18b20_get();
void main(){
 //初始化
 allinit();
 ds1302_init();
 time0_init();
 yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;
 while(1){
  //时钟获取
  ds_1302_get();
  //温度获取
  wendu_temp=ds18b20_get();
  //按键
  key_scan();
  //参数设置界面
  if(flag_yemian==0){
   //采集间隔设置
   if(flag_get_t==0)
    set_t=1;
   else if(flag_get_t==1)
    set_t=5;
   else if(flag_get_t==2)
    set_t=30;
   else if(flag_get_t==3)
    set_t=60;
   yi=11;er=11;san=11;si=11;wu=11;liu=10;
   qi=set_t/10;ba=set_t%10;
  }
  //时钟显示页面
  else if(flag_yemian==1){
   yi=shijian[2]/10;er=shijian[2]%10;
   si=shijian[1]/10;wu=shijian[1]%10;
   qi=shijian[0]/10;ba=shijian[0]%10;
  } 
  //温度显示页面
  else if(flag_yemian==2){
   yi=10;er=num/10;san=num%10;
   si=11;wu=11;liu=10;
   qi=wendu_list[num]/10;ba=wendu_list[num]%10;
  }
  //数码管显示
  display_12(yi,er);
  display_34(san,si);
  display_56(wu,liu);
  display_78(qi,ba);
 }
}

定时器及按键:

//定时器初始化
void time0_init(void){
 AUXR|=0X80;
 TMOD&=0XF0;
 TL0=0X00;
 TH0=0X28;
 TF0=0;
 TR0=1;
 EA=1;ET0=1;
}
//定时器
void time0(void) interrupt 1{
 tt++;
 //界面1下控制间隔符和采集温度
 if(flag_yemian==1){
  if(tt%200==0){
   san=san+1;liu=liu+1;
   if(san!=11){
    san=10;liu=10;
   }
   num_1++;
   if(num_1==set_t){
    num_1=0;
    //保存温度
    wendu_list[count]=wendu_temp;
    count=count+1;
    if(count==10){
     count=0;
     tt=0;
     flag_yemian=2;
     num=0;
     flag_led=0;
    }
   }
  }
 }
 //界面2下控制小灯闪
 else if((flag_yemian==2)&&(flag_led==0)){
  if(tt==100){
   P2=0X80;P0=0XFF;
   P2=P2&0X1F;
  }
  if(tt==200){
   P2=0X80;P0=0XFE;
   P2=P2&0X1F;
   tt=0;
  }
 }
}
//独立按键
void key_scan(){
 //2界面下进入0界面
 if(s7==0){
  delayms(5);
  if(s7==0){
   if(flag_yemian==2)
    flag_yemian=0;
  }
  while(!s7);
 }
 //索引查询温度
 else if(s6==0){
  delayms(5);
  if(s6==0){
   num++;
   flag_led=1;
   P2=0X80;P0=0XFF;
   P2=P2&0X1F;
   if(num==10){
    num=0;
   }
  }
  while(!s6);
 }
 //0界面下进入1界面
 else if(s5==0){
  delayms(5);
  if(s5==0){
   if(flag_yemian==0){
    flag_yemian=1;
    tt=0;
    num_1=0;
    count=0;
   }
  }
  while(!s5);
 }
 //设置间隔时间
 else if(s4==0){
  delayms(5);
  if(s4==0){
   flag_get_t=flag_get_t+1;
   if(flag_get_t==4)
    flag_get_t=0;
  }
  while(!s4);
 }
}

温度时钟及数码管等

//获取温度
unsigned char ds18b20_get(){
 unsigned char temp,high,low;
 init_ds18b20();
 Write_DS18B20(0xcc);
 Write_DS18B20(0x44);
 delayms(1);
 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 ds1302_init(){
 unsigned char i,add;
 add=0x80;
 Write_Ds1302_Byte(0x8e,0x00);
 for(i=0;i<7;i++){
  Write_Ds1302_Byte(add,init_t[i]);
  add=add+2;
 }
 Write_Ds1302_Byte(0x8e,0x80);
}
//时钟读取
void ds_1302_get(){
 unsigned char i,add;
 add=0x81;
 Write_Ds1302_Byte(0x8e,0x00);
 for(i=0;i<7;i++){
  shijian[i]=Read_Ds1302_Byte(add);
  add=add+2;
 }
 Write_Ds1302_Byte(add,0x80);
}
//初始化
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); 
 P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}
发布了31 篇原创文章 · 获赞 32 · 访问量 4353

猜你喜欢

转载自blog.csdn.net/weixin_44747240/article/details/104378535