单片机四位时钟电路设计方案(一)
以at89c51单片机为核心的时钟电路的程序设计
1.主程序设计及系统主流程图
设计中采用定时器t0中断完成,其余状态循环调用显示子程序。系统主流程图如图所示
2.时钟电路的时钟和闹铃程序设计及流程图
时钟采用11.0256mhz的脉冲控制, 闹铃采用整点报时功能。
3 时钟电路的显示程序设计及流程图
码管显示的数据存放在内存单元70h-75h中,其中70h~71h存放秒数据,72h~73h存放分数据,74h~75h存放时数据,每一地址单元内均为十进制bcd码。由于采用软件动态扫描实现数据显示功能,显示用十进制bcd码数据的对应段码存放在rom表中。显示时,先取出70h~75h某一地址中的数据,然后查的对应的显示段码从p1口输出。p3口将对应的数码管选中,就是显示该地址单元的数据值,每个led数码管亮1ms时间再逐位循环。
4.时钟电路的键盘程序设计及流程图
p0口输出段码数据,p1.0-p1.2口作扫描输出,p0.1—p0.4口接按钮开关s1,s2,s3,s4,s5,rest 接s6复位按键。p0.0控制秒的调整,每按一次加1秒;p0.1控制分的调整,每按一次加1分;p0.2控制时的调整,每按一次加1个小时。
5.仿真图及程序
单片机四位时钟电路设计方案(二)
通过s1、s2、s3和s4四个按键,对时间进行修改和闹钟的设置,s0控制闹钟的启动和停止。按下s4键显示闹钟,松开后显示时间;按下s1键进入时间修改模式,再按s1键时间的时加1,按s3分加1,调整结束后按下s4恢复正常显示;按下s2键进入闹钟修改模式,再按s3键闹钟的时加1,按s3分加1,调整结束后按下s4恢复正常显示。在按键按下和放开时会出现抖动现象。通过延时程序,可以进行去抖动设计。
proteus仿真电路
单片机四位时钟电路设计方案(三)
通过4位数码管来显示时间,系统晶振11.0592mhz,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6个按钮来对时间及闹钟时间的调节、关闭,p3.2接时间分加1按钮,p3.3接时间时加1按钮,p3.4接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5接闹钟加1按钮,p3.6接闹钟时加1按钮,p3.7接关闭闹钟按钮。
程序源代码:
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 ;中断返回
单片机四位时钟电路设计方案(四)
附:源程序
/***************************************************************************
标题: 定时器中断 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--);
数据被毁怎么办 数据恢复过程分享
宏程序提供了替代其他雷尼绍触发式循环的有力方案
Arasan推出超低功耗D-PHY IP
教育机器人的优势和劣势_教育机器人的种类
e络盟备有 Vishay Super 12 现货,可当天发货
单片机四位时钟电路设计方案汇总(四款电路图及程序分享)
Python 可视化如何配色
AN5120N引脚功能及电压参数
全面解读锂电池储能电芯产业链现状
基于Raspberry Pi 5的蜂窝物联网项目
为什么面包板不适合高频电路?
盘点Mini LED车载相关企业及进度
三星发布旗下首款5G基带芯片
超快激光微纳加工对空间光调制器的要求
NVIDIA收购ARM或将迎来反转,英国考虑否决的相关事宜
高频机是什么机器_高频机维修方法
英伟达与三星达成晶圆代工协议已证实 抢单大战正式开打
小米MIX2发布会日期确定,小米Note3包装盒曝光,小米Note3或成为彩蛋?
博士科技:技术市场建设运营“扬州模式”4年蝉联省级第一
Wind River与飞思卡尔强化双方长期合作关系