如果有用请点赞,还会继续更新的
题目:
思路:
通过Ds1302来实现 时间的控制,onewrie.c来读取温度,并且显示出来。按键的功能和判断已经很常规了,要注意的就是在延时的时候,数码管显示的函数依旧要工作。
源代码:
main.c
#include"reg52.h"
#include"intrins.h"
#include"onewire.h"
void LCD_display();
int i;
sfr AUXR=0x8e;
int count;
unsigned int temp;
int time_h=23,time_m=59,time_s=50;
int nao_h=0,nao_m=0,nao_s=0;
int key_4,key_5,key_6=0,key_7=0;
char code xianshi[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6};
sbit S4=P3^3;
sbit S5=P3^2;
sbit S6=P3^1;
sbit S7=P3^0;
sbit L1=P0^7;
void Delay4ms()
{
unsigned char i, j;
_nop_();
i = 44;
j = 4;
do
{
while (--j);
} while (--i);
}
void Delay200us()
{
unsigned char i, j;
i = 3;
j = 35;
do
{
while (--j);
} while (--i);
}
void choose138(int n)
{
switch(n)
{
case(0):P2=(P2&0x1f)|0x00;break;
case(4):P2=(P2&0x1f)|0x80;break;
case(5):P2=(P2&0x1f)|0xa0;break;
case(6):P2=(P2&0x1f)|0xc0;break;
case(7):P2=(P2&0x1f)|0xe0;break;
}
}
void clean()
{
choose138(4);
P0=0xff;
choose138(5);
P0=0x00;
}
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x00;
TH0 = 0x28;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
}
void serverTimer0Init() interrupt 1
{
TL0 = 0x00;
TH0 = 0x28;
count++;
if(count==200)
{
count=0;
time_s++;
if(time_s>=60)
{
time_s=0;
time_m++;
if(time_m>=60)
{
time_m=0;
time_h++;
if(time_h>=24)
{
time_h=0;
}
}
}
}
}
int x,tongyi=1;
void Delay195ms()
{
unsigned char i, j;
_nop_();
_nop_();
i = 130;
j = 20;
do
{ LCD_display();
while (--j);
} while (--i);
}
void Delay5ms()
{
unsigned char i, j;
i = 54;
j = 199;
do
{LCD_display();
while (--j);
} while (--i);
}
void naozhong(void)
{
if(time_s==nao_s&&time_h==nao_h&&time_m==nao_m)
{
for(x=0;x<12;x++)
{
LCD_display();
if(S4==0||S5==0||S6==0||S7==0)
break;
else
{
P0=0xff;
choose138(4);
L1=~L1;
Delay195ms();
choose138(4);
P0=0xff;
Delay195ms();
}
}
}
}
void Read_temp()
{
char LSB,HSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
HSB=Read_DS18B20();
temp=HSB<<4;
temp=temp|(LSB>>4);
}
void an_jian(void)
{
if(S7==0)
{
Delay5ms();
if(S7==0)
{
key_7++;
if(key_7==4)
{
key_7=0;
}
}
while(!S7);
}
if(S6==0&&key_7==0)
{
Delay5ms();
if(S6==0)
{
key_6++;
if(key_6==4)
{
key_6=0;
}
}
while(!S6);
}
if(key_7==1&&S5==0)
{
Delay5ms();
if(S5==0)
{
time_h++;
if(time_h==24)
{
time_h=0;
}
}
while(!S5);
}
if(key_7==2&&S5==0)
{
Delay5ms();
if(S5==0)
{
time_m++;
if(time_m==60)
{
time_m=0;
}
}
while(!S5);
}
if(key_7==3&&S5==0)
{
Delay5ms();
if(S5==0)
{
time_m++;
if(time_s==60)
{
time_s=0;
}
}
while(!S5);
}
if(key_7==1&&S4==0)
{
Delay5ms();
if(S4==0)
{
time_h--;
if(time_h==-1)
{
time_h=24;
}
}
while(!S4);
}
if(key_7==2&&S4==0)
{
Delay5ms();
if(S4==0)
{
time_m--;
if(time_m==-1)
{
time_m=60;
}
}
while(!S4);
}
if(key_7==3&&S4==0)
{
Delay5ms();
if(S4==0)
{
time_m--;
if(time_s==-1)
{
time_s=0;
}
}
while(!S4);
}
if(key_6==1&&S5==0)
{
Delay5ms();
if(S5==0)
{
nao_h++;
if(nao_h==24)
{
nao_h=0;
}
}
while(!S5);
}
if(key_6==2&&S5==0)
{
Delay5ms();
if(S5==0)
{
nao_m++;
if(nao_m==60)
{
nao_m=0;
}
}
while(!S5);
}
if(key_6==3&&S5==0)
{
Delay5ms();
if(S5==0)
{
nao_s++;
if(nao_s==60)
{
nao_s=0;
}
}
while(!S5);
}
if(key_6==1&&S4==0)
{
Delay5ms();
if(S4==0)
{
nao_h--;
if(nao_h==-1)
{
nao_h=24;
}
}
while(!S4);
}
if(key_6==2&&S4==0)
{
Delay5ms();
if(S4==0)
{
nao_m--;
if(nao_m==-1)
{
nao_m=59;
}
}
while(!S4);
}
if(key_6==3&&S4==0)
{
Delay5ms();
if(S4==0)
{
nao_s--;
if(nao_s==-1)
{
nao_s=59;
}
}
while(!S4);
}
}
void SMG_display(int wei,int dat)
{
choose138(6);
P0=0x80>>(wei-1);
choose138(7);
P0=xianshi[dat];
}
void LCD_display()
{
if(key_6==0&&key_7==0&&S4==0)
{
Delay4ms();
while(S4==0)
{
SMG_display(1,12);
Delay200us();
SMG_display(2,temp%10);
Delay200us();
SMG_display(3,temp/10);
Delay200us();
SMG_display(4,10);
Delay200us();
SMG_display(5,10);
Delay200us();
SMG_display(6,10);
Delay200us();
SMG_display(7,10);
Delay200us();
SMG_display(8,10);
Delay200us();
}
}
if(key_6==0&&key_7==0)
{
SMG_display(1,time_s%10);
Delay200us();
SMG_display(2,time_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,time_m%10);
Delay200us();
SMG_display(5,time_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,time_h%10);
Delay200us();
SMG_display(8,time_h/10);
Delay200us();
}
if(key_6==0&&key_7==1)
{
i++;
if(i<=70)
{
SMG_display(1,time_s%10);
Delay200us();
SMG_display(2,time_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,time_m%10);
Delay200us();
SMG_display(5,time_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,10);
Delay200us();
SMG_display(8,10);
Delay200us();
}
else if(i>70&&i<140)
{
SMG_display(1,time_s%10);
Delay200us();
SMG_display(2,time_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,time_m%10);
Delay200us();
SMG_display(5,time_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,time_h%10);
Delay200us();
SMG_display(8,time_h/10);
Delay200us();
}
else if(i>=70)
i=0;
}
if(key_6==0&&key_7==2)
{
i++;
if(i<=70)
{
SMG_display(1,time_s%10);
Delay200us();
SMG_display(2,time_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,10);
Delay200us();
SMG_display(5,10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,time_h%10);
Delay200us();
SMG_display(8,time_h/10);
Delay200us();
}
else if(i>70&&i<140)
{
SMG_display(1,time_s%10);
Delay200us();
SMG_display(2,time_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,time_m%10);
Delay200us();
SMG_display(5,time_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,time_h%10);
Delay200us();
SMG_display(8,time_h/10);
Delay200us();
}
else if(i>=70)
i=0;
}
if(key_6==0&&key_7==3)
{
i++;
if(i<=70)
{
SMG_display(1,10);
Delay200us();
SMG_display(2,10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,time_m%10);
Delay200us();
SMG_display(5,time_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,time_h%10);
Delay200us();
SMG_display(8,time_h/10);
Delay200us();
}
else if(i>70&&i<140)
{
SMG_display(1,time_s%10);
Delay200us();
SMG_display(2,time_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,time_m%10);
Delay200us();
SMG_display(5,time_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,time_h%10);
Delay200us();
SMG_display(8,time_h/10);
Delay200us();
}
else if(i>=70)
i=0;
}
if(key_7==0&&key_6==1)
{
i++;
if(i<=70)
{
SMG_display(1,nao_s%10);
Delay200us();
SMG_display(2,nao_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,nao_m%10);
Delay200us();
SMG_display(5,nao_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,10);
Delay200us();
SMG_display(8,10);
Delay200us();
}
else if(i>70&&i<140)
{
SMG_display(1,nao_s%10);
Delay200us();
SMG_display(2,nao_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,nao_m%10);
Delay200us();
SMG_display(5,nao_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,nao_h%10);
Delay200us();
SMG_display(8,nao_h/10);
Delay200us();
}
else if(i>=70)
i=0;
}
if(key_7==0&&key_6==2)
{
i++;
if(i<=70)
{
SMG_display(1,nao_s%10);
Delay200us();
SMG_display(2,nao_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,10);
Delay200us();
SMG_display(5,10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,nao_h%10);
Delay200us();
SMG_display(8,nao_h/10);
Delay200us();
}
else if(i>70&&i<140)
{
SMG_display(1,nao_s%10);
Delay200us();
SMG_display(2,nao_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,nao_m%10);
Delay200us();
SMG_display(5,nao_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,nao_h%10);
Delay200us();
SMG_display(8,nao_h/10);
Delay200us();
}
else if(i>=70)
i=0;
}
if(key_7==0&&key_6==3)
{
i++;
if(i<=70)
{
SMG_display(1,10);
Delay200us();
SMG_display(2,10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,nao_m%10);
Delay200us();
SMG_display(5,nao_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,nao_h%10);
Delay200us();
SMG_display(8,nao_h/10);
Delay200us();
}
else if(i>70&&i<140)
{
SMG_display(1,nao_s%10);
Delay200us();
SMG_display(2,nao_s/10);
Delay200us();
SMG_display(3,11);
Delay200us();
SMG_display(4,nao_m%10);
Delay200us();
SMG_display(5,nao_m/10);
Delay200us();
SMG_display(6,11);
Delay200us();
SMG_display(7,nao_h%10);
Delay200us();
SMG_display(8,nao_h/10);
Delay200us();
}
else if(i>=70)
i=0;
}
}
void main()
{
clean();
Timer0Init();
while(1)
{
LCD_display();
an_jian();
Read_temp();
naozhong();
}
}
onewire.c
#include "reg52.h"
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t)
{
t=t*12;
while(t--);
}
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
unsigned char rd_temperature(void);
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
#endif
**
码字不容易,点个赞再走!!!!
**
|