资讯详情

AT89C51单片机为核心的时钟电路的程序设计

目前的位置:电工之家 > 电工知识 > 单片机 > 正文

AT89C以51单片机为核心的时钟电路程序设计

时间:2018-06-05 08:38 来源:电工之家

AT89C以51单片机为核心的时钟电路程序设计

1.主程序设计和系统主流程图

定时器用于设计T0中断完成,其余状态循环调用显示子程序。系统主流程图如图所示

41af7e9f249c81b8ef236ab3e04c3901.png

2.时钟电路的时钟和闹钟程序设计及流程图

时钟采用11.0256MHZ脉冲控制, 闹铃采用整点报时功能。

3 时钟电路的显示程序设计和流程图

内存单元70存储在码管显示的数据中H-75H中,其中70H~71H存储秒数据,72H~73H存储分数据,74H~75H存储数据时,每个地址单元都是十进制的BCD码。数据显示功能由软件动态扫描实现,显示采用十进制BCD存储在代码数据对应的段码中ROM表中。显示时,先取出70H~75H地址中的数据,然后从相应的显示段中检查相应的显示段P1口输出。P三口选择相应的数字管,即显示地址单元的数据值,每个单元LED数码管亮1MS时间循环。

4.时钟电路键盘程序设计及流程图

P0口输出段码数据,P1.0-P1.扫描输出两口,P0.1—P0.四口接按钮开关S1,S2,S3,S4,S5,rest 接S6复位按键。P0.0控制秒的调整,每次加1秒;P0.调整控制分,每次加1分;P0.调整控制时,每次加1小时。

5.仿真图及程序

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

通过S1、S2、S3和S44个按钮,修改时间,设置闹钟,S控制闹钟的启停。按下S4键显示闹钟,松开后显示时间;按下S1键进入时间修改模式,然后按S按1键时间加1,S3分加1,调整后按下S4恢复正常显示;按下S2键进入闹钟修改模式,然后按下S按3键闹钟时加1,按1S3分加1,调整后按下S4恢复正常显示。按键和放开时会抖动。抖动设计可以通过延迟程序进行。

Proteus仿真电路

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

系统晶振11通过4位数字管显示时间.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 ;中断返回

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

附:源程序

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

标题: 定时器中断 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--);

看过《AT89C51单片机为核心的时钟电路的程序设计》的人还看了以下文章

c语言sqrt函数怎么求三角形面积 使用C语言中的sqrt函数求三角形的面积,关键是已知条件是什么,并没有说,已知条件不同,所求三角形的面积公式也不同。 1)若是已知三角形的三条边长a、b、c,根据海伦公式可以求出三角形的面积,p=(a+b+c)/2,则三角形的面积:...

51单片机最小系统板各元器件的作用 51单片机最小系统板中,一般会有如下元器件:51单片机、晶振、稳压芯片(也可能是稳压电路或电源接口)、电阻、电容、电源开关、电源指示灯(即发光二极管)、编程接口、复位按钮等。当然了,有些是必须的,有些是可选的。...

单片机和dsp芯片输出电压能直接接负载吗 可以直接接负载,但是只能接微小电流的负载,一般10mA以内,甚至更...

51单片机模拟交通灯效果是如何实现的 交通灯红绿灯是按一定的顺序进行亮灭的,亮灯的时间也是一定的。那么就有逻辑可循。而单片机就可以根据逻辑性进行控制程序编写,然后烧录程序进单片机,控制IO串口输出高低电平及中断延时以达到模拟交通灯的效果。 那么...

IP全名:Interrupt Priority,是单片机的中断优先级控制寄存器 下图是中断优先级寄存器 IP 的控制位:可以通过程序来控制。 PS: 串行口中断优先级控制位; PT1: 定时器/ 计数器 T1 中断优先级控制位; PX1: 外部中断 1 中断优先级控制位; PT0: 定时器/ 计数...

标签: 51单片机稳压电源电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台