单片机制作时钟倒计时

STC11FO2E介绍

STC11F02E单片机是STC生产的单时钟/机器周期(1T)的高性能单片机。采用了增强型内核,STC11F02E保留普通8051的所有功能,并提供6个中断源、2个中断优先级、片内和晶体振荡器、1个看门狗。

增强型8051CPU,1T,单时钟/机器周期,速度比普通8051快6-7倍。
工作电压:4.1V -5.5 V
工作频率:0 - 35MHz,相当于普通8051的0 - 420MHz
2K字节片内Flash程序存储器
片内256字节的SRAM
超强抗干扰,超低功耗
共2个16位定时器/计数器,与普通8051的Timer0/Timer1完全一致
可将掉电模式/停机模式唤醒的资源有:INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0
可编程时钟输出功能。T0从P3.4输出时钟,T1从P3.5输出时钟,BRT从P1.0输出时钟。

封装:SOP-20,DIP-20

proteus电路图

由于数码管显示用的是扫描显示方法,所以截图接不到三个灯全亮。(Proteus中单片机不需要搭建最小系统所以就省略了)

实际电路

用洞洞板搭建的电路,后面焊接的不太好就不发照片了。由于条件有限没有四位的数码管只能用三位的替代了,继电器也没有5v的所以就先不加了,这都不重要。左边的第一个数码管是小时,剩下的两个数码管是分钟,下面还有三个按键,晶振选用的是12M,记得要在单片机数码管输出的I/O口加装排阻,不然I/O的电流不足以驱动数码管。

定时器工作过程

首先上电之后先调整定时时间,每按一次加键定时加十分钟,减键同理,当设置好分钟之后按下设置键等到数码管闪动后松开按键进入小时设置,每按一次加键定时增加一小时,设置好分钟和小时后再次按下设置键就会启动定时,此时控制三极管的I/O口为1,等到定时完毕之后数码管显示000,闪动五次,之后就会将接到三极管的I/O口置零三极管关断输出继电器断开。

单片机程序

#include"reg52.h"              //头文件

#define LED P1             		//数码管阴极
#define LED1 P3					//数码管阳极
sbit jia = P3^3;
sbit jian= P3^4;
sbit she = P3^5;				//设置
sbit kai = P3^7;				//控制引脚

unsigned int cont = 0;
unsigned int c,dod;
unsigned int shi,fen,miao;

void Timer0_uint();                  //定时器0初始化
void RTC();							//计时函数
void displayRTC();					//将个位与十位分开
void display();						//显示函数
void delay_ms(int n);				//延时
void stop();						//设置定时时间
void display_Z();					//到达时间之后关断输出

unsigned char code dm[]={0xf6,0x12,0xea,0x7a,0x1e,0x7c,0xfc,0x32,0xfe,0x3e};			//段码
unsigned char code wm[]={0xf6,0xfd,0xfb};     //位码
unsigned char LED_z[3];			//数码管轮流显示数组
void main()
{
	
	EA = 1;                          //打开总中断
	shi = 0;
	fen = 0;
	miao =0;
	jia =1;
	jian=1;
	she=1;
	stop();
	RTC();
	displayRTC();
	Timer0_uint();                   //调用Timer0初始化函数
	while(1)
	{
		displayRTC();
		display();
	}
}
void Timer0_uint()
{
		TMOD = 0x01;                  //定时器工作模式 1
		ET0 = 1;                      //定时器0中断开关
		TH0 = 0x3C;                    //初始值
		TL0 = 0xB0;
		TR0 = 1;                      //开始定时
		TF0 = 0;
}
void timer0interrupt() interrupt 1      
 //当定时器溢出时(TF0=1)就会进行中断服务函数
{
	TH0 = 0x3C;                           //再次赋初值
	TL0 = 0xB0;
	TF0 = 0;                              //TF0赋值为0
	cont++;
	if(cont>=10)							//一秒一次
	{
		display_Z();
		RTC();
		displayRTC();
		display();
		cont = 0;
	}
}

代码比较长,这里只给出一部分,想要完整代码可以评论区留言,

代码比较简单,而且已经写好注释就不用过多的解释了,如果有不明白的地方可以问我,但是本人能力有限问了也不一定能回答上来。

总结

如果有写的不对的地方欢迎指正。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值