当前位置:
文档之家› C51单片机多功能数字钟C源程序
C51单片机多功能数字钟C源程序
EA=1;//开总中断
/*设置计数器0提供时钟脉冲*/
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
/*设置计数器1提供音乐所需的频率*/
TH1=0;
TL1=0;
ET1=1;
TR1=0;
/*初始化LCD */
write_com(0x38);
putIntToString(2,value/10);
write_data('.');
putIntToString(1,value%10);
write_data(0xdf);
write_data('C');
}
void warning(int value){
write_com(0x01);//清屏
putStringtoLcd(0x80+0x00,"Happy Each Hour");
{ int h_carry=0;//初始时无进位,同时相当于关掉进位
int m_carry=0;
int s_carry=0;
int mo_carry=0;
int d_carry=0;
if(sc==60)
{ sc=0;
s_carry=1;
}
if(s_carry)
{ if(mc==59)
{ mc=0;
m_carry=1;
while(*p!='\0')
{write_data(*p);
p++;
}
}
void scan_key_function()//校时键扫描
{ if(!key_alarm)//在设置闹钟界面下,校时键无效
if(!key1)
{ delay(10);
if(!key1);
{ TR0=!TR0;
if(key_function)//是校时界面,则退出校时界面,并将当前时钟值设置为实际时钟值
value/=10;
}
while(n++,n<num);
while(n--)
write_data(buf[n]);
}
void putStringtoLcd(char addr,char* p)//将字符串送到LCD指定的地方显示
{
write_com(0x0c);//关光标显示
write_com(addr);
}
}
/*负责时钟计时*/
void time0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>=20)
{ sc++;
num=0;
time_cal();
if(!key_alarm&&!music&&!iswarning)
}
/*主函数*/
int main(){
init();
putIntToLcd();
putTemp(wendu=get_temp());
delay(2000);
while(1)
{ scan_key_function();
sacn_key_alarm();
if(key_function)
{scan_key();showGuangBiao(wei);}
{ y=yc;mo=moc;d=dc;h=hc;m=mc;s=sc;
putIntToLcd();
putTemp(wendu=get_temp());
}
istone=1;
}
}
/*负责产生音频信号*/
void time1() interrupt 3
{ TH1=timeh;
TL1=timel;
beep=~beep;
}
/*led.c
实现对LCD1602操作的各函数*/
#include"led.h"
void delay(uint z)//延时z ms
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_data(uchar date)//写数据
{
lcdrs=1;
/*led.h
负责声明全局变量
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*各数据在LCD中显示的地址*/
#define Year 0x80+0x00
#define Month 0x80+0x05
#define Day 0x80+0x08
tone(sc-52);
istone=0;
}
if(mc==0&&sc==0)
{
iswarning=1;
if(istone==1)
tone(8);
istone=0;
warning(wendu);
}
if(iswarning==1&&sc>5)
{ iswarning=0;
write_com(0x01);
}
int key_alarm=0;//功能键标志
int num=0;//计数变量
int idata wendu;
int iswarning;
int istone;
/*当数据段空间不够时,可用idata修饰全局变量*/
int idata s,m,h,y=2013,mo=1,d=12;//显示在LED上的年月日时分秒变量
else if(key_alarm)
{ scan_key();showGuangBiao(wei);}
if((hc==h_alarm)&&(mc==m_alarm)&&(sc==0))
{ music=1;
song();
}
if(mc==59&&sc>=53&&sc<=59)
{
if(istone==1)
putIntToString(4,y);
write_data('-');
write_com(Month);
putIntToString(2,mo);
write_data('-');
write_com(Day);
putIntToString(2,d);
}
/*方法计算出年月日时分秒*/
void time_cal()
extern uchar timeh,timel;
/*******全局变量声明******/
/*******public方法声明****/
void time_cal();
void write_data(uchar date);
void write_com(uchar com);
void init(void);
void scan_key();
void add(int value);
void mius(int value);
void showGuangBiao(int value);
void song();
void delay_music(uint z);
void sacn_key_alarm();
void putStringtoLcd(char addr,char* p);
P0=date;
lcden=1;
delay(2);
lcden=0;
}
void write_com(uchar com)//写命令
{
lcdrs=0;
P0=com;
lcden=1;
delay(2);
lcden=0;
}
void init()//初始化
{
lcden=0;//LCD初始化使能端无效
TMOD=0x11;//设置计数器0,1均为工作方式1
void tempchange();
uint get_temp();
void putTemp(uint value);
void tone(int value);
/*******public方法声明****/
/*main.c
主功能函数
*/
#include"led.h"
int key_function=0;//功能键标志
int idata sc,mc,hc,yc=2013,moc=1,dc=12;//实际年月日时分秒变量
int idata date[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};//平年与闰年每个月的天数
{ dc=1;
d_carry=1;}
else
dc++;
}
if(d_carry)
{ if(moc==12)
{moc=1;
mo_carry=1;}
else moc++;
}
if(mo_carry)
yc++;
}
void putTemp(uint value){
tempchange();
write_com(Weidu);
void delay(uint z);