单片机学习笔记————51单片机实现数码管中的倒计时程序

本文记录了51单片机实现数码管倒计时程序的过程,包括使用Proteus绘制电路图,编写程序及进行仿真实现,详细讲解了每个步骤的操作和注意事项。
摘要由CSDN通过智能技术生成

一、使用proteus绘制简单的电路图,用于后续仿真

 

二、编写程序

/********************************************************************************************************************
----	@Project:	LED-74HC595
----	@File:	main.c
----	@Edit:	ZHQ
----	@Version:	V1.0
----	@CreationTime:	20200607
----	@ModifiedTime:	20200611
----	@Description:	启动和暂停键对应S1键,复位键对应S5键。
----	按下启动暂停按键时,倒计时开始工作,再按一次启动暂停按键时,
----	则暂停倒计时。在任何时候,按下复位按键,倒计时将暂停工作,
----	并且恢复倒计时当前默认值99。
----	单片机:AT89C52
********************************************************************************************************************/
#include "reg52.h"
/*——————宏定义——————*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/500)   /*0.5ms timer calculation method in 12Tmode*/

#define	const_voice_short	40	/*蜂鸣器短叫的持续时间*/
#define const_voice_long 200	/*蜂鸣器长叫的持续时间*/

#define	const_key_time1	20	/*按键去抖动延时的时间*/
#define	const_key_time2	20	/*按键去抖动延时的时间*/

#define const_dpy_time_half 200	/*数码管闪烁时间的半值*/
#define const_dpy_time_all 400	/*数码管闪烁时间的全值 一定要比const_dpy_time_half 大*/

/* 
* 如何知道1秒钟需要多少个定时中断?
* 这个需要编写一段小程序测试,得到测试的结果后再按比例修正。
* 步骤:
* 第一步:在程序代码上先写入1秒钟大概需要100个定时中断。
* 第二步:把程序烧录进单片机后,上电开始测试,手上同步打开手机里的秒表。
*         如果单片机倒计时跑完了99秒,而手机上的秒表才走了156秒。
* 第三步:那么最终得出1秒钟需要的定时中断次数是:const_1s=(100*99)/156=64
*/

#define const_1s  64	/*大概一秒钟所需要的定时中断次数*/

/*——————变量函数定义及声明——————*/
/*定义数码管的74HC595*/
sbit Dig_Hc595_Sh = P2^0;
sbit Dig_Hc595_St = P2^1;
sbit Dig_Hc595_Ds = P2^2;

/*定义蜂鸣器*/
sbit Beep = P2^7;

/*作为中途暂停指示灯 亮的时候表示中途暂停*/
sbit LED = P3^5;

/*定义按键*/
sbit Key_S1 = P0^0;	/*对应S1*/
sbit Key_S2 = P0^1;	/*对应S5*/

sbit Key_GND = P0^4;	/*模拟独立按键的地GND,因此必须一直输出低电平*/

unsigned char ucKeySec = 0;	/*被触发的按键编号*/
unsigned int uiKeyTimeCnt1 = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock1 = 0;	/*按键触发后自锁的变量标志*/
unsigned int uiKeyTimeCnt2 = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock2 = 0;	/*按键触发后自锁的变量标志*/

unsigned char ucDigShow8;   /*第8位数码管要显示的内容*/
unsigned char ucDigShow7;   /*第7位数码管要显示的内容*/
unsigned char ucDigShow6;   /*第6位数码管要显示的内容*/
unsigned char ucDigShow5;   /*第5位数码管要显示的内容*/
unsigned char ucDigShow4;   /*第4位数码管要显示的内容*/
unsigned char ucDigShow3;   /*第3位数码管要显示的内容*/
unsigned char ucDigShow2;   /*第2位数码管要显示的内容*/
unsigned char ucDigShow1;   /*第1位数码管要显示的内容*/

unsigned char ucDigDot8;   /*数码管8的小数点是否显示的标志*/
unsigned char ucDigDot7;   /*数码管7的小数点是否显示的标志*/
unsigned char ucDigDot6;   /*数码管6的小数点是否显示的标志*/
unsigned char ucDigDot5;   /*数码管5的小数点是否显示的标志*/
unsigned char ucDigDot4;   /*数码管4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值