24小时切换简易时钟-51单片机

这篇具有很好参考价值的文章主要介绍了24小时切换简易时钟-51单片机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

24小时切换简易时钟

简介

1、本设计主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机STC89C51单片机和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。
2、本设计拟实现的性能指标如下:
(1)键盘用于校正、调节数码管上显示的时间。
(2)单片机通过输出各种电脉冲信号开驱动控制各部分正常工作。
(3)单片机发送的信号经过显示电路通过译码最终在数码管上显示出来。
(4)按键还可以切换12小时制和24小时制,并有指示灯。
STC89C51单片机
STC89C51是一种低功耗、高性能CMOS8位微控制器,具有 4K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 4k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。
24小时切换简易时钟-51单片机
STC89C51单片机引脚图
(一)STC89C51主要功能、性能参数如下:
(1)内置标准51内核,机器周期:增强型为6时钟,普通型为12时钟;
(2)工作频率范围:040MHZ,相当于普通8051的080MHZ;
(3)STC89C51RC对应Flash空间:4KB;
(4)内部存储器(RAM):512B;
(5)定时器\计数器:3个16位;
(6)通用异步通信口(UART)1个;
(7)中断源:8个;
(8)有ISP(在系统可编程)\IAP(在应用可编程),无需专用编程器\仿真器;
(9)通用I\O口:32\36个;
(10)工作电压:3.8~5.5V;
(11)外形封装:40脚PDIP、44脚PLCC和PQFP等。
(二)STC89C51单片机的引脚说明:
(二)STC89C51单片机的引脚说明:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。上面图中的两个三角形表示的就是输入缓冲器CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作。这是由硬件自动完成的,不需要我们操心,1然后再实行读引脚操作,否则就可能读入出错,为什么看上面的图,如果不对端口置1端口锁存器原来的状态有可能为0Q端为0Q^为1加到场效应管栅极的信号为1,该场效应管就导通对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低使得外加的1信号读入后不一定是1。若先执行置1操作,则可以使场效应管截止引脚信号直接加到三态缓冲器中实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口。89C51的P0/P1/P2/P3口作为输入时都是准双向口。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。

源文件下载:
原文件(可点击跳转)

原理图:
24小时切换简易时钟-51单片机
代码:文章来源地址https://www.toymoban.com/news/detail-512152.html

/************************************************************
作品名字:简易时钟(12小时和24小时可转换)
功能:六位数码管显示时分秒
二十四小时制和十二小时制可切换
十二小时制红灯亮,二十四小时制红灯灭
当时间在凌晨0点~中午12点之间时,黄灯亮,此时按切换按键数码管的示数不会变化
制作说明:P0接数码管段选,P2低6位接数码管位   
	
**************************************************************/
#include<reg52.h>		   //包含库文件
#define uc unsigned char
#define ui unsigned int		//宏定义,就是定义ui代替unsigned int,方便下面程序调用
sbit LED=P3^2;//定义LED
sbit key0=P3^3;//定义小时切换按键
sbit key1=P3^4;//定义调小时按键
sbit key2=P3^5;//定义调分钟按键
sbit key3=P3^6;//定义秒清零按键
sbit wan=P3^7;//上下午指示灯
uc min,hour,sec,num;//分钟,小时,秒,定时器计时变量
bit bdata zhi;//小时制标志位
uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0,1,2,3,4,5,6,7,8,9,.*///共阴极编码

void delay(ui x)//延时函数,大约延时1ms
{
	ui i,j;
	for(i=0;i<x;i++)
	for(j=0;j<121;j++);	 //执行121次大约延时1ms
}
void display()//扫描显示函数,高位到低位
{
	P0=tab[hour/10];//小时数据是一个两位数,除以10得到的商是十位数,然后调用数组内的对应数字的编码赋值给P0口,显示对应数字
	P2=0xdf;//11011111	选择对应位
	delay(1);//延时
	P2=0xff;//关闭位选

	P0=(tab[hour%10])|0x80;//给第二位后加“点(段选接线最高位是小数点,所以就按位或0x80就是在最高位赋值1,就是显示小数点)
	P2=0xef;//11101111
	delay(1);
	P2=0xff;

	P0=tab[min/10];
	P2=0xf7;//11110111
	delay(1);
	P2=0xff;

	P0=(tab[min%10])|0x80;//给第四位后加“点”
	P2=0xfb;//11111011
	delay(1);
	P2=0xff;

	P0=tab[sec/10];
	P2=0xfd;//11111101
	delay(1);
	P2=0xff;

	P0=tab[sec%10];		//秒数据是一个两位数,%是取余运算,就是除以10的余数,得到个位数字
	P2=0xfe;//11111110
	delay(1);
	P2=0xff;
}

void keyscan()//键盘扫描,开关接地
{
	if(key0==0)			  //检测到按键按下
	{
		delay(5);		  //延时去抖
		if(key0==0)		  //再次判断按键是否按下
		{
			LED=~LED;	  //LED取反操作
			zhi=~zhi;	  //小时制取反
			if((hour>=12)&&(zhi==0))//小时大于等于12点时,且小时制等于0,也就是12小时制
			{	
				hour=hour-12;	//将当前小时数据减12赋值给hour
			}
			if((zhi==1)&&(wan==1))//小时制为24小时。是下午时
			{
				hour=hour+12;//将小时数据加12赋值给hour
			}			 		 
		}
		while(!key0) display();//判断是否松开,按键不送开时,key0是0,取反就是1,一直成立,就一直执行后面的显示函数,按键松开就跳出
	}
	if(key1==0)		//加小时按键按下
	{
		delay(5);
		if((key1==0)&&(zhi==0))	 //12小时制
		{
			hour++;				 //小时加
			if(hour==12)		 //加到12点
			{
				hour=0;			 //小时清零
				wan=~wan;		 //切换上下午
			}
		}
		if((key1==0)&&(zhi==1))	 //24小时制
		{
			hour++;				 //小时加
			if(hour==24)		 //加到24点
			hour=0;				 //清零
		}
		while(!key1) display();//判断是否松开
	}
	if(key2==0)					//分加按键按下
	{
		delay(5);
		if(key2==0)
		{
			min++;				 //分加
			if(min==60)			 //加到60
			min=0;				 //分清零
		}
		while(!key2) display();//判断是否松开
	}
	if(key3==0)//秒清零按键
	{
		delay(5);
		if(key3==0)
		{sec=0;}		//秒清零
		while(!key3) display();//判断是否松开
	}
}

void init()				  //系统初始化函数
{
	sec=0;//一通电,显示12:30:00
	min=30;
	hour=12;
	LED=1;	  //led点亮
	zhi=1;	  //默认是24小时制
	wan=1;	  //下午
	TMOD=0x01;//设置定时器0工作方式1
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;	//定时器初值50ms
	EA=1;				   //打开中断总开关
	ET0=1;				   //打开中断允许开关
	TR0=1;				   //打开定时开关
}

void shizhi()			   //小时制函数
{
	if(hour>=12)		   //小时能加到大于12点,说明是24小时制
	wan=1;				   //却换到下午
	if((hour<12)&&(zhi==1))//小时小于12并且是24小时制
	wan=0;				   //切换到上午
}

void main()//主函数
{
	init();			//调用初始化函数
	while(1)		 //进入循环
	{
		display();	//调用显示函数
		keyscan();//扫描是否有键按下
		shizhi();	//小时制函数
	}
}
void time0() interrupt 1	//定时器0工作函数
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;	 //进入中断后重新赋初值50ms
	num++;				//变量加
	if(num==20)			//加20次就是1s
	{
		num=0;		   //变量清零
		sec++;		   //秒变量加
		if(sec==60)	   //秒加到60
		{
			sec=0;	   //秒清零
			min++;	   //分加
			if(min==60)//分加到60
			{
				min=0; //分清零
				hour++;//小时加
				if((hour==12)&&(zhi==0)) //小时加到12,小时制为12
				{
					wan=~wan;	//切换上下午
					hour=0;		//小时清零
				}
				if((hour==24)&&(zhi==1)) //小时加到24,小时制为24小时制
				{
					hour=0;			  //小时清零
				}
			}
		}
	}
}

到了这里,关于24小时切换简易时钟-51单片机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机数字时钟

    我们学单片机,一般都会写数字时钟编程。它能帮助我们: a. 能够系统性地总结掌握的知识,将单元模块知识有机的结合在一起。 b. 能够充分协调好硬件与软件之间的相互结合,合理设计硬件电路。 c. 掌握单片机 C 语言判断语句、分支语句以及子程序调用等编程知识。

    2024年02月11日
    浏览(41)
  • 51单片机实时时钟显示

    51单片机+DS1302+DS18B20+LCD12864 用的IIC通信,写的一个ds3231时钟模块的程序,可更改时间,下面是.h文件里面的部分代码 #ifndef __ds3231_h #define _ ds3231_h #include reg51.h #define uchar unsigned char #define uint unsigned int extern uchar day2,Htemp2,Mtemp2,Stemp2; //星期,时分秒 extern ucharYtemp2,Mtemp2,Dtemp2,Ttem

    2024年02月09日
    浏览(37)
  • 51单片机——DS1302时钟

    目录 1.前言 1.1 实验现象 2. DS1302的介绍 2.1 DS1302的引脚定义以及应用电路 2.2 DS1302内部结构 2.21  DS1302内部特殊寄存器 2.22 时序 2.3 BCD码 3.源码 3.1 main.c 3.2 DS1302.c 3.3 DS1302.h 3.4 LCD1602.c 3.5 Delay.c 3.6 Delay.h 之前我们已经使用了定时器做过了简易的时钟了,为什么还要用DS1302制作时钟

    2024年01月16日
    浏览(45)
  • 『51单片机』 DS1302时钟

    🚩 WRITE IN FRONT 🚩     🔎 介绍:\\\"謓泽\\\"正在路上朝着\\\"攻城狮\\\"方向\\\"前进四\\\" 🔎 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博主、华为云享专家、阿里云专家博主、掘金优秀创作者、全网粉丝量7w+、全网访问量100w+🏅 🆔 本文章内容由 謓泽

    2024年02月08日
    浏览(50)
  • 单片机原理与应用课程设计-基于51单片机的时钟日历

    摘 要 本课程设计是基于51单片机的日历时钟设计。作为嵌入式系统中常用的控制器,单片机在各种电子设备和系统中广泛应用。日历时钟作为一个常见的功能模块,在现代生活中具有重要意义。因此,设计一个基于51单片机的日历时钟,不仅有助于我们掌握单片机编程技术和

    2024年02月20日
    浏览(66)
  • 基于51单片机的数字时钟设计

    目录 一、总体概述 1、计时控制方案 2、主控制器模块 3、显示电路模块 4、调试按键模块 5、电源模块 6、闹钟声光报警模块 二、系统总体结构 1.电路图 三、系统的硬件设计与实现 1、电源电路 2、显示电路 3、单片机基本电路 4、按键电路 四、功能测试及结果分析 五、程序附

    2024年02月07日
    浏览(41)
  • 51单片机(数码管可调时钟)

    1.数码管(共阴极)如何显示数字:位选+段选(单个) 位选:138译码器通过P22、P23、P24三个端口输入二进制数(011、000等)来选择连同译码器右边的哪一条线,而这些线又分别连着数码管的LED12345678、决定选择哪一个来显示数字 段选:决定输出什么数字,数码管下方又连着一

    2024年02月05日
    浏览(46)
  • 基于51单片机的可调时钟(开源)

            应用DS1302实现在LCD1602上显示时间,包括年月日,时分秒以及星期几的英文缩写,并具有时间可调的功能,调节当前位时闪烁。利用独立按键1实现模式切换,按键2设置时间位选择,按键3当前时间位+1,按键4当前时间位-1,调节时间具有边界判断和自动校正功能,同时

    2024年02月06日
    浏览(47)
  • 51单片机——DS1302可调时钟

    目录 一、功能介绍 二、主要模块介绍 2.1 DS1302模块 2.1.1 DS1302芯片介绍 2.1.2  DS1302的使用 三、程序汇总 3.1测试文件test.c 3.2 LCD1602模块程序 3.2.1 LCD1602.h 3.2.2 LCD1602.c 3.3 DS1302模块程序 3.3.1 DS1302.h 3.3.2 DS1302.c 3.4 独立按键模块程序 3.4.1 Independentkey.h 3.4.2 Independentkey.c 3.5 T0定时器模

    2024年02月02日
    浏览(68)
  • 51单片机电子时钟(C语言)

     全部硬件电路分为四大部分: 控制模块51单片机; 显示模块LCD1602,由P0口控制; 计时模块DS1302,由P1口控制; 输入按键,由P3口控制。         实际设计硬件电路时应考虑到51单片机的电源、复位电路以及外接晶振,时钟芯片DS1302的备用电源等。 从1302的寄存器中读取数据

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包