首页 接线图文章正文

单片机四位时钟电路设计方案(三) - 单片机四位时钟电路设计方案汇总(四款电路图及程序分享)

接线图 2023年09月27日 21:03 209 admin

  单片机四位时钟电路设计方案(三)

  通过4位数码管来显示时间,系统晶振11.0592MHZ,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6个按钮来对时间及闹钟时间的调节、关闭,p3.2接时间分加1按钮,p3.3接时间时加1按钮,p3.4接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5接闹钟加1按钮,p3.6接闹钟时加1按钮,p3.7接关闭闹钟按钮。

单片机四位时钟电路设计方案(三) - 单片机四位时钟电路设计方案汇总(四款电路图及程序分享)  第1张

  程序源代码:

  org 0000h

  ajmp main ;调至主程序

  org 000bh ;T0中断入口地址

  ljmp inti0

  org 001bh ;T1中断入口地址

  ljmp inti1

  org 0030h

  main:mov tmod,#11h ;设T0、T1为模式1

  mov ie,#8ah ;开T0、T1中断允许

  mov th0,#4ch ;赋T0 50ms初值

  mov tl0,#00h

  mov th1,#4ch ;赋T1 50ms初值

  mov tl1,#00h

  mov sp,#60h ;设置堆栈指针

  mov r0,#20 ; T0 50ms计数20次

  mov 31h,#00 ;时间秒初始化

  mov 32h,#00 ;时间分初始化

  mov 33h,#00 ;时间时初始化

  mov 38h,#00 ;闹钟分初始化

  mov 39h,#00 ;闹钟时初始化

  setb tr0 ;启动T0

  setb tr1 ;启动T1

  loop:lcall display ;调用时间显示子程序

  lcall key ;调用时间调节按键子程序

  lcall keynz ;调用闹钟按键子程序

  ajmp loop

  inti0:push psw ;保护现场

  push acc

  clr ea ;关中断

  mov th0,#4ch ;重赋50ms初值

  mov tl0,#00h

  djnz r0,out ;对50ms计数判断

  mov r0,#20 ;重赋50ms计数值

  inc 31h ;秒加1

  cpl p2.2 ;P2.2取反输出

  mov a,31h

  cjne a,#60,out ;判秒是否加到60,没有加到中断返回

  mov 31h,#00 ;秒加到60,对秒清零

  inc 32h ;分加1

  mov a,32h

  cjne a,#60,out ;判分是否加到60,没有加到就中断返回

  mov 32h,#00 ;分加到60,对分清零

  inc 33h ;时加1

  mov a,33h

  cjne a,#24,out ;判时是否加到24,没有就中断返回

  mov 33h,#00 ;时加到24,对时清零

  out: setb ea ;开中断

  pop acc ;恢复现场

  pop psw

  reti ;中断返回

  inti1:push psw ;保护现场

  push acc

  clr ea ;关中断

  mov th1,#4ch ;赋50ms初值

  mov tl1,#00h

  inc 3ah

  mov a,3ah

  cjne a,#20,out1 ;判断50ms计数是否到20,没到就中断返回

  mov 3ah,#00 ;50ms计数到20,将计数单元清零

  mov a,32h

  cjne a,38h,out1 ;闹钟分与时间分判断

  mov a,33h

  cjne a,39h,out1 ;闹钟时与时间时判断

  clr p1.0 ;相等就清p1.0输出

  out1: setb ea ;开中断

  pop acc ;恢复现场

  pop psw

  reti ;中断返回

  单片机四位时钟电路设计方案(四)

单片机四位时钟电路设计方案(三) - 单片机四位时钟电路设计方案汇总(四款电路图及程序分享)  第2张

  附:源程序

  /***************************************************************************

  标题: 定时器中断 24小时时钟程序

  效果: 数码管显示24小时制时钟(具有调时功能)

  说明: 使用12M晶振 ,key1=P3^7; key2=P3^6; key3=P3^5; key4=P3^4; 数码管位选P1.0~P1.3 ,段选P0,共阳数码管

  ******************************************************************************/

  #include《reg52.h》

  #define uchar unsigned char; #define uint unsigned int;

  uchar position; uchar tt; uchar second; uchar minute; uchar hour;

  uchar code table[]=

  {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9

  sbit smg_q = P1^0; //数码管千位引脚 sbit smg_b = P1^1; sbit smg_s = P1^2; sbit smg_g = P1^3;

  sbit key1=P3^7; //按键定义 sbit key2=P3^6; sbit key3=P3^5; sbit key4=P3^4;

  void keyscan(); //函数声明

  void display(unsigned char hour,unsigned char minute); void delay(unsigned int timer); void init();

  /***********************************************************

  主函数

  ***********************************************************/

  void main() {

  init(); while(1) {

  if(tt==20) { tt=0; second++;

  if(second==60) {

  second=0; minute++;

  if(minute==60) {

  minute=0; hour++;

  if(hour==24) hour=0; } } }

  keyscan();

  display(hour,minute); delay(1); } }

  /***********************************************************

  调时

  ***********************************************************/ void keyscan() {

  if(key1==0) //小时加1 {

  TR0=0; hour++;

  if(hour==24) hour=0; delay(200) ; TR0=1; }

  if(key2==0) // 小时减 {

  TR0=0; hour--;

  if(hour《0) hour=23; delay(200) ; TR0=1; }

  if(key3==0) // 分钟加 {

  TR0=0; minute++;

  if(minute==60) minute=0; delay(200) ; TR0=1; }

  if(key4==0) // 分钟减 {

  TR0=0;

  minute--;

  if(minute《0)

  minute=59; delay(200) ; TR0=1; } }

  /***********************************************************

  初始化

  ***********************************************************/ void init() {

  tt=0;

  position=0; second=0; minute=0; hour=0; smg_q=1; smg_b=1; smg_s=1; smg_g=1; key1=1; key2=1;

  TMOD=0X01;

  TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; }

  /***********************************************************

  定时器TO中断

  ***********************************************************/ void t0() interrupt 1 {

  TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; }

  /***********************************************************

  显示

  ***********************************************************/

  void display(unsigned char hour,unsigned char minute) {

  P0=0XFF; switch(position) {

  case 0: smg_g=1; smg_q=0;

  P0=table[hour/10]; break;

  case 1:

  smg_q=1; smg_b=0;

  P0=table[hour%10];

  if(tt》=10)

  P0&=0x7f; //小数点以半秒的时间闪烁 break;

  case 2:

  smg_b=1; smg_s=0; P0=table[minute/10]; break;

  case 3: smg_s=1; smg_g=0;

  P0=table[minute%10]; break; }

  position++; if(position》3) position=0; }

  /***********************************************************

  延时

  ***********************************************************

  / void delay(unsigned int time) {

  unsigned int x,y; for(x=time;x》0;x--) for(y=110;y》0;y--);

版权与免责声明

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

标签: 单片机 数字时钟

发表评论

接线图网Copyright Your WebSite.Some Rights Reserved. 备案号:桂ICP备2022002688号-2 接线图网版权所有 联系作者QQ:360888349