原理图如下
部分程序如下
单片机源程序如下:
#include
#include "DS18B20.h"
#include "DS1302.h"
#include "LCD12864.h"
char a;
sbit KEY1=P3^4;
sbit KEY2=P3^5;
sbit KEY3=P3^6;
bit flag=1; //进入/退出设置标志
uchar choose=0x01; //切换标志
void delay10(void) //延时10ms
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<200;j++);
}
void delay5ms(void) //误差 0us
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
//设置时ds1302寄存器值循环 如秒寄存器59时加一变为00
unsigned char conver(unsigned char a,unsigned char b,unsigned char c)
{
if((a&0x0f)==0x0a) a=a+6;
if(a==b) a=c;
return a;
}
void digplay() {
//时间
ShowNumber16_32(2,0,TIME[2]>>4&0x03); //时 十位
ShowNumber16_32(2,16, TIME[2]&0x0f);//时 个位
ShowNumber16_32(2,48,TIME[1]>>4&0x07);//分 十位
ShowNumber16_32(2,64, TIME[1]&0x0f);//分 个位
ShowNumber16_32(2,96,TIME[0]>>4&0x07);//秒 十位
ShowNumber16_32(2,112, TIME[0]&0x0f);//秒 个位
//日期
ShowNumber(0,0,2);
ShowNumber(0,8,0);
ShowNumber(0,16,TIME[6]>>4&0x0f);
ShowNumber(0,24, TIME[6]&0x0f);//年
ShowNumber(0,40,TIME[4]>>4&0x01);
ShowNumber(0,48, TIME[4]&0x0f);//月
ShowNumber(0,64,TIME[3]>>4&0x03);
ShowNumber(0,72, TIME[3]&0x0f);//日
ShowChina(0,112,(TIME[5]&0x07)-1);//周
}
void wendu() {
//温度
a=Read_Temperature(); //读取DS18B20的温度
if(a<0) //处理温度正负
{
a = (-1)*a; // 取补
ShowNumber(6,88,11); //温度计图标—
}
else
{
ShowNumber(6,88,12);//温度计图标+
}
ShowNumber(6,96,a/10%10); //显示温度中位
ShowNumber(6,104,a%10); //显示温度低位
}
void digplaystart() {//开机显示
uchar i=0;
ShowChina(2,64-16*1.5,19);
ShowChina(2,64-16*0.5,20);
ShowChina(2,64+16*0.5,21);
ShowChina(2,64+16*1.5,22);
for (i=0;i<10;i++) {
ShowNumber(4,32+8*i,16);
delay5ms();
delay5ms();
}
ClearScreen(0);//清屏
}
void main(void)
{
uchar i;
InitLCD(); //初始化LCD12864
digplaystart();
delay5ms();
Ds1302Init();//Ds1302初始化,并且附上设定的默认时间
a=Read_Temperature(); //读取DS18B20的温度
ShowNumber(0,32,11);//-
ShowNumber(0,56,11);//-
ShowChina(0,96,7);//汉字周
ShowNumber16_32(2,32,10);//:
ShowNumber16_32(2,80,10);//:
ShowChina(6,112,8);//℃
while(1)
{
wendu();//温度显示
if(flag==1)
Ds1302ReadTime();
//读取DS1302的时间
else
Ds1302WriteTime();
if(KEY1==0) //按键1--处理设定时间和返回
{
delay10();
if(KEY1==1)
{
delay10();
flag=~flag;
if(flag==0) {
ShowChina(6,48,9);
ShowChina(6,0,16);
ShowChina(6,16,17);
ShowNumber(6,32,10);
}
if(flag==1) {
for( i=0;i<8;i++) {
ShowNumber(6,8*i,15);
}
}
}
}
if(KEY2==0) //按键2--处理选择设定时间的项目
{
delay10();
if(KEY2==1)
{
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』