单片机制作数字钟(含万年历、秒表功能)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字钟、万年历制作(基于单片机)
电路原理图:
程序://********************20131206****数字钟程序
#pragma SMALL
#include
#include
#include
//********************************************************* *********编译预处理
void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数
unsigned char search(); //按键识别函数
void alarm(); //闹钟判断启动函数
void ftion0(); //始终修改函数
void ftion1(); //闹钟修改函数
void ftion3(); //日期修改函数
void cum(); //加1修改函数
void minus(); //减1修改函数
void jinzhi(); //进制修改函数
void riqi(); //日期
void stopwatch(); //秒表函数
//********************************************************* *******函数声明
sbit P2_7=P2^7;
//********************************************************* *******端口定义
unsigned char clockbuf[3]={0,0,0};
unsigned char bellbuf[3]={0,0,0};
unsigned char date[3]={1,1,1}; //日期存放数组
unsigned char stop[3]={0,0,0};
unsigned char msec1,msec2;
unsigned char timdata,rtimdata,dtimdata;
unsigned char count;
unsigned char *dis_p;
unsigned char or; //12进制控制标志
unsigned char ri; //日期显示控制标志位
unsigned char mb; //秒表控制标志位
bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量
//********************************************************* *****全局变量定义
void main()
{
unsigned char a;
or=0; //12进制修改标志清零
ri=0;
mb=0;
P2_7=0;
arm=0;
msec1=0;
msec2=0;
timdata=0;
rtimdata=0;
count=0;
TMOD=0x12;
TL0=0x06;
TH0=0x06;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
dis_p=clockbuf;
while(1)
{
a=keytest();
if(a==0x78) //判断是否有键按下{
display(dis_p);
if(arm==1) alarm();
}
else
{
display(dis_p);
a=keytest();
if(a!=0x78)
{
a=search();
switch(a)
{
case 0x00:ftion0();break;
case 0x01:ftion1();break;
case 0x02:cum();break;
case 0x06:jinzhi();break;
case 0x03:riqi();break;
case 0x04:ftion3();break;
case 0x05:minus();break;
case 0x07:stopwatch();break;
case 0x09:TR1=1;break;
case 0x0a:TR1=0;break;
case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;
default:break;
}
}
}
}
}
//********************************************主函数【完】void display(unsigned char *p)
{
unsigned char buffer[]={0,0,0,0,0,0};
unsigned char k,i,j,m,temp;
unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
buffer[0]=p[0]/10;
buffer[1]=p[0]%10;
buffer[2]=p[1]/10;
buffer[3]=p[1]%10;
buffer[4]=p[2]/10;
buffer[5]=p[2]%10;
if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{
for(k=0;k<3;k++)
{
temp=0x01;
for(i=0;i<6;i++)
{
P0=0x00; //段选端口
j=buffer[i];
P0=led[j];