详细代码讨论加我QQ:1271370903

1.设计概述:

  1. 由单片机 AT89C51芯片和动态数码显示管为核心,辅以必要的电路,构成一个数字时钟。
  2. 时钟显示方式为:时-分-秒。时钟计时周期为24小时,显满刻度为“23时59分59秒”。
  3. 具有调整功能。设置有三个按键,分别对时、分、秒进行调整校对。
  4. 外加可当闹钟使用,闹钟数可设三个,提示音由蜂鸣器电路发出。

**2.设计思想:**数字时钟主要由 AT89C51、显示模块、控制模块和计时运算模块四大部分组成。其中,控制模块和计时运算模块主要对时、分、秒的数值显示和调整进行操作,并且秒计算到60时,自动清零并向分进1﹔分计算到60时,自动清零并向时进1﹔时计算到24时,自动清零。这样,就形成了循环计时,显示模块主要用来显示当前计数值。AT89C51是整个设计的核心,主要用来产生定时中断,传输数据和控制各部件工作。
3.硬件框架图:

4.组成
(1)单片机最小系统的组成详解(电源、晶振、复位电路)
(2)数码管显示器
(3)闹钟铃声电路
(4)按键电路
5.5. 电路总体仿真图

6.仿真开始

7.主程序流程图

8.相关代码

sbit key1=P1^0;             //设置
sbit key2=P1^1;                //加
sbit key3=P1^2;                //减
sbit key4=P1^3;                //止闹音
sbit beep=P3^4;                //闹音蜂鸣器
//************************数码管显示的数值**************************
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)/256TL0=0x0b0;         //(65536-50000)%256EA=1;              //开总中断ET0=1;             //打开定时器TR0=1;             //启动定时器beep=1;
}
//********************显示子函数,用于显示时间数值*****************
void display()
{  uchar i,j;if(cnt!=10||wss==0){ table1[0]=miao%10;        //分离秒的个位与十位table1[1]=miao/10;}elsetable1[0]=table1[1]=11;if(cnt!=11||wss==0){ table1[3]=fen%10;         //分离分的个位与十位table1[4]=fen/10;}elsetable1[3]=table1[4]=11;if(cnt!=12||wss==0){ table1[6]=shi%10;         //分离时的个位与十位table1[7]=shi/10;}elsetable1[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;}elsetable2[0]=table2[1]=11;if(cnt!=2||wss==0){ table2[3]=fen1%10;table2[4]=fen1/10;}elsetable2[3]=table2[4]=11;if(cnt!=3||wss==0){ table2[6]=shi1%10;table2[7]=shi1/10;}elsetable2[6]=table2[7]=11;}elsetable2[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;}elsetable3[0]=table3[1]=11;if(cnt!=5||wss==0){ table3[3]=fen2%10;table3[4]=fen2/10;}elsetable3[3]=table3[4]=11;if(cnt!=6||wss==0){ table3[6]=shi2%10;table3[7]=shi2/10;}elsetable3[6]=table3[7]=11;}elsetable3[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;}elsetable4[0]=table4[1]=11;if(cnt!=8||wss==0){ table4[3]=fen3%10;         //分离分的个位与十位table4[4]=fen3/10;}elsetable4[3]=table4[4]=11;if(cnt!=9||wss==0){ table4[6]=shi3%10;         //分离时的个位与十位table4[7]=shi3/10;}elsetable4[6]=table4[7]=11;}elsetable4[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++;          //秒加1if(miao4>59)    //判断秒是否到60s{ miao4=0;      //到了,则清零fen4++;       //分加1if(fen4>59)  //以下含义同上{ fen4=0;shi4++;if(shi4>23)shi4=0;                                                        } }} else{ miao++;          //秒加1if(miao>59)    //判断秒是否到60s{ miao=0;      //到了,则清零fen++;       //分加1if(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();                               //  闹1if(cnt==4||cnt==5||cnt==6)display2();                               //  闹1if(cnt==7||cnt==8||cnt==9)display3();                               //  闹1if(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++;      //是,则秒加1if(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,是,则秒置59miao1=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++;}
}
//***************************闹铃子函数***************************//
void clock()
{  //判断秒的数值是否相等if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3==0)//是,在判断分是否相等                                   if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0)//是,再判断时是否相等       if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0){ flag2=0;                       //是,则标志位,flag2清零while(!(flag2==1200)&&(cnt==0)) //判断flag2是否到1200且不                          {//             为调时状态if(key4==0)                    //没有,则继续驱动蜂鸣器响{while(!key4)flag2=1200;} if(flag1>1)        //等时方波驱动蜂鸣器{ beep=~beep;flag1=0;}shijian();         //调用时间子函数display();         //调用显示子函数  }beep=1;                  //关闭蜂鸣器}
}
//**************************主函数********************************//
void main()
{  init();                         //调用初始化子函数while(1){  clock();                   //闹钟子函数         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(); shijian();        //调用时间子函数key_scan();        //调用键盘扫描子函数}
}

单片机数字时钟/闹钟相关推荐

  1. 单片机at89c51数字钟c语言,(定稿)毕业论文基于AT89C51单片机数字时钟的设计(完整版)...

    <[毕业论文]基于AT89C51单片机数字时钟的设计.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)毕业论文基于AT89C51单片机数字时钟的设计(完整版)>相关文档 ...

  2. c语言51单片机数字时钟设计,51单片机数字时钟功能需求及设计实现(带闹钟)...

    1设计要求 l.1 功能需求 (1) 实现数字时钟准确实时的计时,lj显示功能: (2)实现闹钟功能,即系统时问到达闹钟时问时闹铃响: (3) 实现时问和闹钟时问的调时功能: (4)刚启动系统的时候在 ...

  3. 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc

    电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...

  4. 基于51单片机的时钟闹钟温度计LCD1602显示proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示时间/当前温度 2.按键可进行闹钟设置和温度上下限设置 3.到达闹钟时间或温度超过阈值范围,蜂鸣器报警 4.到达闹钟 ...

  5. 数字时钟单片机程序c语言,单片机数字时钟C语言程序

    单片机程序 /********************************************************/ #include // 包含51单片机寄存器定义的头文件 unsign ...

  6. 51单片机数字时钟套件 DIY散件

    详情:https://www.icxbk.com/try/group-detail?pid=1743

  7. 课设系列:51单片机制作智能时钟闹钟

    操作演示视频 51单片机制作智能时钟闹钟 文章目录 操作演示视频 课设的基本要求 一.硬件框图 二.功能描述 2.1.基本功能 2.2.设计要求 2.3(1)时钟显示功能 (2)闹钟显示界面 2.4按 ...

  8. 【单片机毕业设计】【mcuclub-306】万年历电子时钟 | 数字时钟 | 多功能时钟 | 智能闹钟

    设计简介: 项目名:基于单片机的万年历电子时钟的设计.基于单片机的多功能时钟的设计.基于单片机的数字时钟的设计 单片机:STC89C52 功能简介: 1.通过DS1302实时获取时间,并掉电保存时间 ...

  9. 【单片机毕业设计】【mcuclub-312】数字时钟 | 万年历电子时钟 | 多功能时钟 | 智能闹钟 | 语音电子时钟

    设计简介: 项目名:基于单片机的数字时钟的设计-普通版.基于单片机的智能闹钟的设计.基于单片机的语音电子时钟的设计 单片机:STC89C52 功能简介: 1.通过DS18B20测量环境温度 2.通过D ...

  10. 数字钟实验报告stm32_单片机-电子时钟实验报告

    一. 实验任务及要求 在焊接的电路板中, 4 个 LED 数码管,设计带有闹铃功能的数字时钟,要求: 1 .在 4 位数码管上显示当前时间.显示格式"时时分分": " 2 ...

最新文章

  1. Linux中yum和apt-get
  2. Matplotlib 中文用户指南 4.6 编写数学表达式
  3. Chrome 调试技巧
  4. 直男的回答能多出乎意料?
  5. 英语四级真题作文 计算机,2019年6月大学英语四级作文范文50例:电脑
  6. deepin20自带c语言,deepin 20.1终于找到你-国产操作系统deepin之初体验
  7. linux input输入子系统分析《一》:初识input输入子系统
  8. 轻量级Modal模态框插件cta.js
  9. Flutter实战一Flutter聊天应用(四)
  10. 为了学习数据库索引,我们花了5000美元
  11. 比较器与滞回比较器的原理及应用
  12. 2020年对口升学计算机应用模拟题,2020年江西省对口计算机试卷
  13. 抖音/快手/火山热门技术---抖音微商引流之抖音实战引流技巧
  14. 微信摇一摇——iBeacon基站(一):USB蓝牙模式
  15. cpci检索为什么那么慢_cpci检索论文含金量高吗?
  16. oracle的系统字符集,Oracle操作系统和支持-字符集
  17. 性能测试指标及常用监控工具
  18. 阿里接口调用——智能植物识别(含花卉与杂草)
  19. 解决:Error: geom_point requires the following missing aesthetics: y Run `rlang::last_error()`
  20. python执行javascript网页_Python 爬虫如何优雅地执行 javascript 函数

热门文章

  1. SkipList 一种使用概率替代平衡树的数据结构
  2. 关于pr(Premiere)的记录
  3. 利用base64展示图片
  4. CRM 安装不规范,亲人两行泪
  5. win10电脑怎么将html网页做成壁纸,手把手教你win10动态桌面怎么设置
  6. 家用台式电脑计算机上的硬磁盘,台式电脑如何连接硬盘
  7. 微信商户平台关闭自动提现
  8. 哔哩哔哩电脑版怎么下载视频?
  9. 轻量级云服务器部署K3S(公网部署)
  10. 不是技术牛人,如何拿到国内IT巨头的Offer(未整理版本)