时钟温度计

来源:互联网 发布:nodejs linux 运维 编辑:程序博客网 时间:2024/04/30 10:52
最近利用DS1302与DS18B20做了一个能显示当前时间、日期、温度的东西。有三个按键,正常运行时显示当前的时间,利用按键2、3可以切换到日期与温度。按下按键1进入设置时间状态,在设置时间状态利用按键2、3可调整时间与日期。调整好后不进行任何操作6秒退出设置状态。
实物图:
显示当前时间:(11时:24分:47秒)


显示当前日期:(09年:01月:15日)

显示当前温度:(17.2度)


源程序:
#include <reg51.h>
#include<intrins.h>
sbit dq = P0^0;//定义P0.0为DS18B20的数据线
sbit t_rst=P0^2;//DS1302数据线
sbit t_clk=P0^4;
sbit t_io=P0^3;
sbit P2_0=P2^0;//按键
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P3_0=P3^0;//显示
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
void delay(unsigned char i);//定义延时函数
bit init_18b20();//定义DS18B20初始化复位函数
void w_18b20(unsigned char dat);//定义写DS18B20函数
unsigned char r_18b20();//定义读DS18B20函数
void GetTem(void);//定义获得温度函数
void Temdisp(void);//温度显示函数
void in_1302(unsigned char tdat);//定义写一个字节到DS1302函数
unsigned char out_1302(void);//定义从DS1302读一个字节函数
void w_1302(unsigned char ucAddr, unsigned char ucDa);//定义写DS1302函数
void set1302(void);//设置时间
void get1302(void);//读取时间
void timedisp(void);//时间显示函数
void datedisp(void);//日期显示函数
void setbom(void);
unsigned char TemL;//温度低位
unsigned char TemH;//温度高位
unsigned char Tem1;//转换后温度个位
unsigned char Tem2;//转换后温度十位
unsigned char Led[4];
unsigned char dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//不带点的0~9
unsigned char dis1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带点的0~9
bit TempS;//温度符号位
unsigned int ms;
unsigned char time[7]={0x00,0x24,0x11,0x15,0x01,0x04,0x09};

main()
{
set1302();
while(1)
{
  if(!P2_1){get1302();