如何利用AT89S52单片机实现多功能数字钟

一:电路原理和器件选择
制作电路:单片机(at89s52)实现多功能数字钟
性能指标:该数字钟实现时钟运行,调整,倒计时,秒表功能,且精确度经调试一天的误差在2s内。
实现原理:利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
电路主要模块及原理图:
1.数码显示硬件驱动
数码管驱动电路
2.单片机最小系统:
单片机最小系统
3.led及单片机电源原理图
led及单片机电源
4.外部控制状态输入模块原理图
外部控制状态输入模块原理图
主要元器件选择:
单片机:at89s52采用市场上比较常用的at89s52,这里采用at89s52而不是at89s51是为了最大限度减小误差,因为要实现多功能(例如秒表,时钟,倒计时)为了相互之间不干扰而要用到3个定时/计数器,而51系列只有2个,而52系列有3个,故采用52系列
三极管:用来进行数码管显示的位选,这里采用pnp管
数码管:采用共阳级四位数码管
晶振:采用的是11.0592mhz的晶振
电源部分:采用5v电压供电,采用的是l7805稳压芯片供电(加滤波)
电阻:大部分时限流电阻,阻值为4.7k或10k,1k
端口分配及连接:
p0:led数码管显示内容通过p1口从单片机传送到数码管
p2.4-p2.7:数码管位选控制端口
p2.0-p2.3:分别连接开关k0,k1,k2,k3通过不同的组合实现外部控制程序状态
p1.0:蜂鸣器,倒计时完毕产生鸣响
p1.2-p1.5:四个发光二极管,显示当前时钟状态
完整的源程序如下:
附程序源代码及注释
#include
#include
#define uint unsigned int
#define uchar unsigned char
/*定义p2口各管脚*/
sbit k0=p2^2;
sbit k1=p2^1;
sbit k2=p2^0;
sbit k3=p2^3;
sbit d0=p2^4;
sbit d1=p2^5;
sbit d2=p2^6;
sbit d3=p2^7;
/*定义p1口各管脚*/
sbit beep=p1^0;
sbit l0=p1^5;
sbit l1=p1^4;
sbit l2=p1^3;
sbit l3=p1^2;
uchar data buffer[4]={0,0,0,0}; //显示缓冲区(依次从低位到高位,共四位数码管)
uchar data clock[4]={0,0,0,0}; //存放时钟时间(依次是百分秒,秒,分,时)
uchar data second[3]={0,0,0}; //存放秒表时间(依次时百分秒,秒,分)
uchar data sever[4]={0,0,0,0}; //存放倒计时时间(依次是百分秒,秒,分,时)
/*定义程序运行状态*/
uchar data state=0;
/*state=0;时钟运行*/
/*state=1;时钟分调整*/
/*state=2;未定义状态,可添加*/
/*state=3;时钟时调整*/
/*state=4;倒计时分调整*/
/*state=5;倒计时时调整*/
/*state=6;秒表*/
/*state=7;倒计时运行*/
/*定义辅助计时全局变量*/
uchar m=60;
/*共阳数码管显示“0”-“9”,“-” */
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xbf};
/*自定义子函数*/
void display(); //显示函数
void delay(); //显示延时函数
void intsvr(); //调整时间时加1子函数
void delay10ms(); //延时函数
/*主函数体*/
void main(void)
{
ea=1;et0=1; //开总中断源,开t0中断
tmod=0x61; //t1方式2计数,t0方式1计时
th0=-9460/256;tl0=-9460%256; //初始化计数器初值
th1=0xff;tl1=0xff;
t2con=0;th2=-9452/256;tl2=-9452%256;
k0=1;k1=1;k2=1; //初始化控制状态位
state=p2&0x07;
for(;;)
{
switch(state)
{
case 1: //时钟分调整程序
{
tr0=0;et0=0;ex0=0;tr2=0; //关闭定时器,时钟停止运行,同时关闭外中断it0
l3=0;l1=0;l2=0;l0=1;
intsvr(); //调用加1函数
buffer[0]=clock[2]%10; //数码管显示分钟个位
buffer[1]=clock[2]/10; //数码管显示分钟十位
buffer[2]=10; //显示“-”
buffer[3]=10; //显示“-”
}break;
case 3: //时钟时调整程序
{
tr0=0;et0=0;ex0=0;tr2=0; //关闭定时器,时钟停止运行
l3=0;l1=0;l2=0;l0=1;
intsvr(); //调用加1函数
buffer[0]=clock[2]%10; //数码管显示分钟个位


PCBA组装怎样可以做到可靠性设计
高温mm-Wave和太赫兹测量的独特解决方案
高通推出Snapdragon Seamless技术,支持用户的不同终端以统一的整体工作
模组厂商也迈向物联网领域,汉枫电子打磨一套工业物联解决方案,
电子供应链:挑战是什么,市场的方向是什么?
如何利用AT89S52单片机实现多功能数字钟
华为千兆光纤宽带+千兆Wi-Fi 6积极推进湛江移动云VR业务发展
Linux核心4.9出炉,Linus保证史上最大改版!
半导体芯片的制造过程及原理
什么是触摸屏的硬度/分类/有效触摸区域/感应力度/定位精度
Limelight宣布已将其网络出口容量较去年提高了70%以上
2021 EeIE智博会,全新智能制造体验火热登场,这个7月等你来!
德力西集团创业40周年标识正式发布
Meditation:一个游戏平台,但更多的是提供灵感
为什么压力传感器的包装很重要
DFRobot SCI采集模块多重应用领域的数据采集利器
普瑞森成“节水能手” 年降成本百万元
电脑硬件基础篇硬盘(硬盘工作原理及作用_特性参数及型号和位置)
如今连接器行业的竞争已经从连接器厂商之间的竞争,转到连接器代理商之间的竞争
审美意识觉醒后,旗袍为何成为国潮顶流?