单片机编写多功能电子时钟
此电子时钟可实现可调时万年历.闹铃.温度传感和温度自动报警系统。
主要使用51单片机.lcd1602.DS18B20.DS1602等集成芯片。
源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^0;
sbit rw=P3^1;//1602读写控制
sbit e=P3^2;
sbit clk=P2^4;
sbit io=P2^5;//18b20i/o口
sbit rst=P2^6;
sbit BF=P0^7;
sbit key_system=P1^0;//模式选择
sbit key_jia=P1^1;
sbit key_jian=P1^2;
sbit key_clock=P1^3;
sbit dq=P2^7; //1302数据的传输
sbit beep=P2^1;//蜂鸣器
bit presence;
uchar key_num,num1,num2,num0,num3;
uchar a,b,c,d,month,day,second,mini,hour,week,flag;
uchar year;
float f_temp;
uint tempds;
uchar code table[10]={"0123456789"};
uchar code table1[]=" : : ";
uchar code table3[]={"Mon Tue Wen Thu Fri Sat Sun"};
uchar code table_date[]="Set Date";
uchar code table_time[]="Set Time";
uchar code table_clock[]="Set Clock";
uchar code zifu_table[]="Good Luck";
uchar code tempdis_table[]="Set Temperature";
uchar code table2[]=
{0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11,
0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f,
0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
uchar table4[ ] ={" . C"};
uchar temp_table[]={0x00,0x00};
uchar clock_table[]={0x00,0x00,0x00};
uchar table_temperature[]={0x00,0x00,0x00,0x00};
uchar date,clock_second,clock_mini,clock_hour;
uchar s,ss,g,gg;//设定报警温度
void delayus(uint z)
{
while(--z>0);}
void delay(uint z)
{uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
bit busytest(void)// LCD1602的初始化及有关函数的定义
{bit result;
rs=0;
rw=1;
e=1;
delayus(5);
result=BF;
e=0;
return result;}
void write_com(uint com)//1602写命令函数
{while(busytest()==1);
rs=0;
rw=0;
e=0;
delayus(2);
P0=com;
delayus(5);
e=1;
delayus(5);
e=0;}
void write_data(uint dat)//1602写数据函数
{while(busytest()==1);
rs=1;
rw=0;
e=0;
P0=dat;
delayus(5);
e=1;
delayus(5);
e=0;}
void lcd_init()//1602的初始化
{delay(15);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x06);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x01);
delay(5);}
void dsinputbyte(uchar d)//1302写入一个字节函数
{uchar i;
clk=0;
rst=1;
for(i=0;i<8;i++)
{io=d&0x01;
delayus(2);
clk=1;
delayus(2);
clk=0;
d>>=1;
}}
uchar dsoutputbyte(void)//1302输出一个字节函数
{uchar i,datr;
clk=0;
delayus(2);
for(i=0;i<8;i++)
{datr>>=1;
if(io==1)
datr|=0x80;
clk=1;
delayus(2);
clk=0;
delayus(2);}
return datr;}
void write_1302(uchar add,uchar dat)//1302的写函数
{rst=0;
clk=0;
rst=1;
dsinputbyte(add);
dsinputbyte(dat);
clk=0;
rst=0;}
uc