一是锁存器的使用
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);
}