利用Proteus和Keil5在AT89C52上实现呼吸灯和时钟
创作时间:
作者:
@小白创作中心
利用Proteus和Keil5在AT89C52上实现呼吸灯和时钟
引用
CSDN
1.
https://blog.csdn.net/2301_78871475/article/details/136968077
本文将介绍如何使用Proteus和Keil5在AT89C52单片机上实现呼吸灯和时钟功能。通过详细讲解设计原理、设计过程和实验代码,并附有仿真图和实验结果,帮助读者掌握单片机的基本应用。
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);//输出秒
}
}
热门推荐
竹子可以种在室内吗
外国人在日本买房是否可以获得签证?
抑郁症发病的表现症状有哪些
探寻失落之地“昆仑山”,修仙修道的宝地,神秘仙境是否存在?
如何看游戏的热度数据库
手把手秘籍大公开!让你的猫咪轻松活到20岁,幸福满溢的养猫指南
Nature子刊:肿瘤内注射三联mRNA-LNP疗法,诱导全身抗肿瘤免疫
快速判断扭伤还是骨折的方法
刺猬索尼克:从游戏传奇到电影巨作,IP的多元进化与辉煌
压铸101:一文搞懂压铸基本知识
奔腾小马车主必看!如何申请新能源电表,家里充电更省钱
黑曜石有几种?探索迷人火山玻璃的多样世界
古代医药店对联,22个字说出了看病和长寿的关键!
2024成都市高中生休学手续办理指南
比萨斜塔,1178年第一次发现倾斜,至今为何不倒?
创制纤维新材料 织就美好新生活
论乔丹为什么被尊为NBA历史第一人,后辈詹姆斯还有超越的可能吗?
无痛拔牙和普通拔牙的区别
瘤内注射二氧化氯疗法的最新临床总结
如何买卖新三板的股票,新三板和主板的区别
别再总说自己老了,真的会“越说越老”!
杭帮菜:弄来弄去就噶几道菜
如何理解黄金的金融属性?这种金融属性在投资中有何体现?
谷歌实现量子计算纠错新进展:更大比特数,更低错误率
“帕友”必读!如何科学服用美多芭?正确的用药方式给你讲明白了
轻度脑瘫应该怎么办
让AI成为孩子成长的好伙伴
昙花品种大全:从细叶到卷叶,一文详解五种独特昙花
“119”消防宣传月:理论实操演练相结合,提升消防安全意识
如何挑选适合自己的摩托车头盔尺码?不同尺码的头盔在使用中有哪些区别?