利用proteus和keil5在at89c52上实现51呼吸灯和51时钟

51呼吸灯

设计原理

利用占空比的不同,亮度不同的特性,达到呼吸灯由暗到亮在到暗的效果

通过改变时延,改变占空比

通过进行无意义的操作,耗费cpu的时间,从而产生时延

 设计过程

占空比

高电平的时长在整个时钟周期(一次高电平一次低电平)中占的比例

时延

为了达到某种特点效果,需要降低cpu的运算速度,但是因为cpu的运算速度已经是固定了的,所以只能采用让cpu进行一些无意义的运算,来消耗时间,从而达到产生时间间隔的效果。

通过进行无意义的运算来产生时延是一种非精准的时延,会根据cpu的运算速度而改变,因此还有一种利用时钟的方法来产生时延,这是一种精准的时延方法。

实验代码

代码讲解

shi()函数

通过让cpu进行无意义的计算,来消耗时间,产生时延

pw () 函数

通过改变高低电平存在的时间,从而改变其占空比

#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
void shi(uint k)
{
	uint i,j;
	for(i=k;i>0;i--)
	{
		for(j=114;j>0;j--);
	}
}	
void pw(uint a)
{
	P2_1=1;
	shi(a);
	P2_1=0;
	shi(10-a);
}
void main()
{
	P2_2=1;
	while(1)
	{	
		uint i;
		for(i=1;i<9;i++)
		{
			pw(i);
		}
		for(;i>1;i--)
		{
			pw(i);
		}
	}
}

仿真

实验现象和结果

第一个灯持续闪烁,第二个灯一直亮(对照)

51时钟

设计思路

利用单片机自带的计时器产生中断然后进行计时,然后在lcd1602的显示屏上显示

设计过程

计时器的使用

首先根据计时器的特性,编写代码对计时器进行启动和初始化并让单片机进入中断。

因为一次计数是1微秒,进行1000次就是1毫秒,所以设置为每计数1000次中断一次。

因为计时器最大可以记65535,所以向下取1000。

void Timer0_Init()
{
	TMOD=0X01;
	TF0=0;
	TR0=1;
	
	TH0=64535/256;
	TL0=64535%256;
	
	ET0=1;
	EA=1;
	PT0=1;
}

然后再编写以下中断函数

每一次中断都要重新对计时器初始化一边,保证每一次中断的时间是一样的

累计1000次中断就是1秒,然后就可以在时钟上记录一次。

unsigned int T0_Count;
void Timer0_Routine() interrupt 1
{
	TH0=64535/256;
	TL0=64535%256;
	T0_Count++;
	if(T0_Count>=1000)
	{
		T0_Count=0;
		
	}
}

在中断函数里面可以添加特定的语句到达不同的效果,或者改变数值达到不同的中断时间

仿真

仿真图

实验结果和现象

实验代码

#include <REGX52.H>
#include "LCD1602.h"
void Timer0_Init()
{
	TMOD=0X01;//启动计时器
	TF0=0;
	TR0=1;
	
	TH0=64535/256;//初始化计时器
	TL0=64535%256;
	
	ET0=1;//进入中断
	EA=1;
	PT0=1;
}

void main()
{

	LCD_Init();//初始化lcd1602
	LCD_ShowString(1,1,"h:m:s");
	LCD_ShowChar(2,3,':');
	LCD_ShowChar(2,6,':');
	Timer0_Init();
	while(1)
	{
			
	}
}
unsigned int T0_Count;
unsigned int T_s=0,T_m=0,T_h=0;
void Timer0_Routine() interrupt 1
{
	TH0=64535/256;
	TL0=64535%256;
	T0_Count++;
	if(T0_Count>=1000)
	{
		T_s++;
		if(T_s==60)
		{T_m++;T_s=0;}//每满60秒进1分钟
		if(T_m==60)
		{T_h++;T_m=0;}//每满60分钟进1小时
		T0_Count=0;
		LCD_ShowNum(2,1,T_h,2);//输出小时
		LCD_ShowNum(2,4,T_m,2);//输出分钟
		LCD_ShowNum(2,7,T_s,2);//输出秒
	}
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值