基于51单片机做的可调时钟,适合新手操作,有详细代码注释

您所在的位置:网站首页 动态倒计时时钟怎么调 基于51单片机做的可调时钟,适合新手操作,有详细代码注释

基于51单片机做的可调时钟,适合新手操作,有详细代码注释

2024-05-30 03:22| 来源: 网络整理| 查看: 265

基于51单片机做的可调时钟,适合新手操作,有详细代码注释

1. 最左边两个数码管是显示“时”,中间两个和右边两个分别是“分”“秒” 2. 左边的按钮是调时的,右边的按钮是调分的,每按一下就会加一 3.每次启动单片机就是从00:00:00开始的

现在显示的时间是7:09:15 在这里插入图片描述 细节描述: 1.时钟的计时功能是用了51单片机的定时器模式2:8位自动装载模式,其定时时间为(以定时器0为例): T=(256-T0初值)X机器周期=(256-T0初值)X振荡周期X12

2. 调时调分功能分别是用了外部中断1和外部中断0

代码块

#include "reg52.h" typedef unsigned char uchar; typedef unsigned int uint; void delay(uint z); //延时 void write_address(uchar address); //选择数码管 void write_data(uint n); //选择显示的内容 void flicker(); //主要显示函数 uint date[7]={0,0,0,0,0,0,0}; //为了便于编程,忽略掉date[0],只使用date[1]~date[6] uint n=0; //计数,计定时器中断的次数 uint second1=0,minute1=0,hour1=0; //用于flicker函数 uchar TIMECODE[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x00}; //字形码表 uchar WEICODE[7]={~0,~0x01,~0x02,~0x04,~0x08, ~0x10,~0x20}; //选中数码管表 void main() { TMOD=0x02; //把定时器模式设为模式2 TH0=0x56; //设置初值 TL0=0x56; //设置初值 TR0=1; //启动定时器 EA=1; //打开总中断开关 ET0=1; //打开定时器中断允许位 EX0=1; //打开外部中断0 IT0=1; //设置外部中断0的模式是下降沿触发 EX1=1; //打开外部中断1 IT1=1; //设置外部中断1的模式是下降沿触发 while(1) { flicker(); } } void delay(uint z)//z等于1,就是延时1ms { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--) ; } void write_address(uchar address)//显示数码管 { P2=address; } void write_data(uint n)//显示数据 { P0=TIMECODE[n]; } void flicker()//使数码管动态显示 { write_address(WEICODE[1]);//最左边数码管亮 write_data(date[1]); //date[1]的值就是最左边数码管显示的值 delay(1);//延时 P0=~0xff;//消影 write_address(WEICODE[2]);//同上理 write_data(date[2]); delay(1); P0=~0xff; write_address(WEICODE[3]); write_data(date[3]); delay(1); P0=~0xff; write_address(WEICODE[4]); write_data(date[4]); delay(1); P0=~0xff; write_address(WEICODE[5]); write_data(date[5]); delay(1); P0=~0xff; write_address(WEICODE[6]); write_data(date[6]); delay(1); P0=~0xff; } void serve()interrupt 1//定时器中断响应 { n++; if(n==5000) //当n=5000时,表示过了1s { n=0; second1++; if(second1==60) { second1=0; minute1++; if(minute1==60) { minute1=0; hour1++; if(hour1==24) { hour1=0; } } } date[6]=second1%10; date[5]=second1/10; date[4]=minute1%10; date[3]=minute1/10; date[2]=hour1%10; date[1]=hour1/10; } } void tiaofen() interrupt 0//外部中断,按键调分响应 { minute1++; if(minute1==60) minute1=0; } void tiaoshi() interrupt 2//外部中断,按键调时响应 { hour1++; if(hour1==24) hour1=0; }

新人博客,要是觉得有用给个赞呗嘻嘻



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3