|
待选题目如下: 1、数字钟 要求:24小时制时间显示,可随时进行时间校对调整,整点报时及闹钟功能。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- //****************************宏定义********************************
- typedef unsigned char uchar;
- typedef unsigned int uint;
- //****************************位声明********************************
- sbit key1=P1^0;
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit beep=P3^0;
- //************************数码管显示的数值**************************
- uchar code table[]= {
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
- 0x7d,0x07,0x7f,0x6f,0x40,0x00
- };
- //****************************函数声明******************************
- void jia();
- void jian();
- //********************数组定义,数组内含有8个数值******************
- uchar table1[8],table2[8],table3[8],table4[8];
- //**************************时间显示初始值**************************
- uchar shi=12,fen=0,miao=0;
- //**************************定义全局变量****************************
- uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;
- uchar shi4,fen4,miao4;
- uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;
- // 1秒 等时 位闪 次数 校时 闹1 闹2 闹3
- uint flag2;
- // 蜂鸣
- //*********************延时函数,用于动态扫描数码管*****************
- void delay(uchar i)
- {
- uchar x,y;
- for(x=i;x>0;x--)
- for(y=120;y>0;y--);
- }
- //*******************************初始化函数*************************
- void init()
- {
- TMOD=0x01; //工作方式1
- TH0=0x3c; //定时时间为:50ms (65536-50000)/256
- TL0=0x0b0; //(65536-50000)%256
- EA=1; //开总中断
- ET0=1; //打开定时器
- TR0=1; //启动定时器
- beep=0;
- }
- //********************显示子函数,用于显示时间数值*****************
- void display()
- {
- uchar i,j;
- if(cnt!=10||wss==0)
- {
- table1[0]=miao%10; //分离秒的个位与十位
- table1[1]=miao/10;
- }
- else
- table1[0]=table1[1]=11;
- if(cnt!=11||wss==0)
- {
- table1[3]=fen%10; //分离分的个位与十位
- table1[4]=fen/10;
- }
- else
- table1[3]=table1[4]=11;
- if(cnt!=12||wss==0)
- {
- table1[6]=shi%10; //分离时的个位与十位
- table1[7]=shi/10;
- }
- else
- table1[6]=table1[7]=11;
- table1[2]=table1[5]=10;
- j=0xfb;
- for(i=0;i<=7;i++) //从秒到时的扫描
- {
- P2=j;
- P0=table[table1[i]]; //显示数值
- delay(10);
- j=_cror_(j,1); //循环右移
- }
- }
- //*******************显示子函数,用于显示定时1时间*****************
- void display1()
- {
- uchar i,j;
- if(alm1==0)
- {
- if(cnt!=1||wss==0)
- {
- table2[0]=miao1%10; //以下含义同上
- table2[1]=miao1/10;
- }
- else
- table2[0]=table2[1]=11;
- if(cnt!=2||wss==0)
- {
- table2[3]=fen1%10;
- table2[4]=fen1/10;
- }
- else
- table2[3]=table2[4]=11;
- if(cnt!=3||wss==0)
- {
- table2[6]=shi1%10;
- table2[7]=shi1/10;
- }
- else
- table2[6]=table2[7]=11;
- }
- else
- table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;
- table2[2]=table2[5]=10;
- j=0xfb;
- for(i=0;i<=7;i++)
- {
- P2=j;
- P0=table[table2[i]];
- delay(10);
- j=_cror_(j,1);
- }
- }
- //********************显示子函数,用于显示定时2时间******************
- void display2()
- {
- uchar i,j;
- if(alm2==0)
- {
- if(cnt!=4||wss==0)
- {
- table3[0]=miao2%10; //以下含义同上
- table3[1]=miao2/10;
- }
- else
- table3[0]=table3[1]=11;
- if(cnt!=5||wss==0)
- {
- table3[3]=fen2%10;
- table3[4]=fen2/10;
- }
- else
- table3[3]=table3[4]=11;
- if(cnt!=6||wss==0)
- {
- table3[6]=shi2%10;
- table3[7]=shi2/10;
- }
- else
- table3[6]=table3[7]=11;
- }
- else
- table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;
- table3[2]=table3[5]=10;
- j=0xfb;
- for(i=0;i<=7;i++)
- {
- P2=j;
- P0=table[table3[i]];
- delay(10);
- j=_cror_(j,1);
- }
- }
- //***************显示子函数,用于显示定时3时间数值****************//
- void display3()
- {
- uchar i,j;
- if(alm3==0)
- {
- if(cnt!=7||wss==0)
- {
- table4[0]=miao3%10; //分离秒的个位与十位
- table4[1]=miao3/10;
- }
- else
- table4[0]=table4[1]=11;
- if(cnt!=8||wss==0)
- {
- table4[3]=fen3%10; //分离分的个位与十位
- table4[4]=fen3/10;
- }
- else
- table4[3]=table4[4]=11;
- if(cnt!=9||wss==0)
- {
- table4[6]=shi3%10; //分离时的个位与十位
- table4[7]=shi3/10;
- }
- else
- table4[6]=table4[7]=11;
- }
- else
- table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;
- table4[2]=table4[5]=10;
- j=0xfb; //从秒到时的扫描
- for(i=0;i<=7;i++)
- {
- P2=j;
- P0=table[table4[i]]; //显示数值
- delay(10);
- j=_cror_(j,1); //循环右移
- }
- }
- //***********************时间子函数 *****************************//
- void shijian()
- {
- if(flag>=20) //判断是否到一秒
- {
- wss=~wss;
- flag=0; //到了,则标志位清零
- if(cnt1!=0)
- {
- miao4++; //秒加1
- if(miao4>59) //判断秒是否到60s
- {
- miao4=0; //到了,则清零
- fen4++; //分加1
- if(fen4>59) //以下含义同上
- {
- fen4=0;
- shi4++;
- if(shi4>23)
- shi4=0;
- }
- }
- }
- else
- {
- miao++; //秒加1
- if(miao>59) //判断秒是否到60s
- {
- miao=0; //到了,则清零
- fen++; //分加1
- if(fen>59) //以下含义同上
- {
- fen=0;
- shi++;
- if(shi>23)
- shi=0;
- }
- }
- }
- }
- }
- //**************************键盘扫描子函数************************//
- void key_scan()
- {
- if(key1==0)
- {
- while(!key1) //防止掉显
- {
- if(cnt==1||cnt==2||cnt==3)
- display1();
- if(cnt==4||cnt==5||cnt==6)
- display2();
- if(cnt==7||cnt==8||cnt==9)
- display3();
- if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
- display();
- }
- cnt++; //记下按键key1按下的次数
- if(cnt==10&&cnt1==0)
- {
- miao4=miao;
- fen4=fen;
- shi4=shi;
- cnt1++;
- }
- if(cnt==13)
- {
- cnt=0;
- if(cnt1==1)
- {
- miao=miao4;
- fen=fen4;
- shi=shi4;
- }
- cnt1=0;
- }
- }
- if(key2==0) //判断key2是否按下
- {
- while(!key2) //防止掉显
- {
- if(cnt==1||cnt==2||cnt==3)
- display1();
- if(cnt==4||cnt==5||cnt==6)
- display2();
- if(cnt==7||cnt==8||cnt==9)
- display3();
- if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
- display();
- }
- jia();
- }
- if(key3==0) //判断key3是否按下
- {
- while(!key3) //防止掉显
- {
- if(cnt==1||cnt==2||cnt==3)
- display1();
- if(cnt==4||cnt==5||cnt==6)
- display2();
- if(cnt==7||cnt==8||cnt==9)
- display3();
- if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
- display();
- }
- jian(); //调用减1子函数
- }
- if(key4==0) //判断key4是否按下
- {
- while(!key4) //防止掉
- {
- if(cnt==1||cnt==2||cnt==3)
- {
- alm1=~alm1;
- display1();
- }
- if(cnt==4||cnt==5||cnt==6)
- {
- alm2=~alm2;
- display2();
- }
- if(cnt==7||cnt==8||cnt==9)
- {
- alm3=~alm3;
- display3();
- }
- if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
- display();
- }
- }
- }
- //****************************加1子函数***************************
- void jia()
- {
- if(cnt==1) //判断key1按下的次数是否为1
- {
- miao1++; //是,则秒加1
- if(miao1>59) //判断秒是否大于60,是,则秒清零
- miao1=0;
- }
- if(cnt==2) //以下含意同上
- {
- fen1++;
- if(fen1>59)
- fen1=0;
- }
- if(cnt==3)
- {
- shi1++;
- if(shi1>23)
- shi1=0;
- }
- if(cnt==4)
- {
- miao2++;
- if(miao2>59)
- miao2=0;
- }
- if(cnt==5)
- {
- fen2++;
- if(fen2>59)
- fen2=0;
- }
- if(cnt==6)
- {
- shi2++;
- if(shi2>23)
- shi2=0;
- }
- if(cnt==7)
- {
- miao3++;
- if(miao3>59)
- miao3=0;
- }
- if(cnt==8)
- {
- fen3++;
- if(fen3>59)
- fen3=0;
- }
- if(cnt==9)
- {
- shi3++;
- if(shi3>23)
- shi3=0;
- }
- if(cnt==10)
- {
- miao++;
- if(miao>59)
- miao=0;
- cnt1++;
- }
- if(cnt==11)
- {
- fen++;
- if(fen>59)
- fen=0;
- cnt1++;
- }
- if(cnt==12)
- {
- shi++;
- if(shi>23)
- shi=0;
- cnt1++;
- }
- }
- //***************************减1子函数**************************//
- void jian()
- {
- if(cnt==1) //判断key1按下的次数是否为1,是则秒减1
- {
- miao1--;
- if(miao1==255) //判断秒是否减到255,是,则秒置59
- miao1=59;
- }
- if(cnt==2) //以下含意同上
- {
- fen1--;
- if(fen1==255)
- fen1=59;
- }
- if(cnt==3)
- {
- shi1--;
- if(shi1==255)
- shi1=23;
- }
- if(cnt==4)
- {
- miao2--;
- if(miao2==255)
- miao2=59;
- }
- if(cnt==5)
- {
- fen2--;
- if(fen2==255)
- fen2=59;
- }
- if(cnt==6)
- {
- shi2--;
- if(shi2==255)
- shi2=23;
- }
- if(cnt==7)
- {
- miao3--;
- if(miao3==255)
- miao3=59;
- }
- if(cnt==8)
- {
- fen3--;
- if(fen3==255)
- fen3=59;
- }
- if(cnt==9)
- {
- shi3--;
- if(shi3==255)
- shi3=23;
- }
- if(cnt==10)
- {
- miao--;
- if(miao==255)
- miao=59;
- cnt1++;
- }
- if(cnt==11)
- {
- fen--;
- if(fen==255)
- fen=59;
- cnt1++;
- }
- if(cnt==12)
- {
- shi--;
- if(shi==255)
- shi=23;
- cnt1++;
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
可调数字钟闹钟整点报时功能.zip
(61.65 KB, 下载次数: 840)
|
评分
-
查看全部评分
|