蓝桥杯单片机学习过程记录(十四)第六届温度记录
应用的内容:
定时器
数码管
时钟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;
}