C51单片机——通过使用定时器控制LED闪灭

目录

0 引言

1 定时的原理

1.1 生活中的定时

1.2单片机中的定时器

2 C语言程序设计

2.1 定时器的内部功能

2.2 设置寄存器

2.3 实验程序

3 有两个小问题(算是延伸吧)

3.1 只能0.05s闪一次吗?

3.2 每次都要在草稿纸手算初始值好麻烦

4 最后


0 引言

其实,这个是可以通过软件延时计算器来生成自己需要的延时程序,而且效果非常好,但是既然要学习单片机,我们的目的就是要搞清楚硬件系统的知识,所以必须要学会如何用软件(程序)去控制硬件(处理器)。

1 定时的原理

1.1 生活中的定时

我们每个人都用过“定时”这个功能。比如说闹钟,我们需要学习1小时,然后定个1小时的闹钟,然后闹钟从59:59:59开始倒计时,直到00:00:00结束,闹钟响铃,学习结束,这个从我们的角度看来它是倒计时。单片机里的定时器原理也是这个,但是用的是正计时哈。

1.2单片机中的定时器

单片机的定时器,它是从某个值(你可以设定)加到某个值后停止。

这里要提到两个概念:①时钟周期;②机器周期。(下面用人话讲一下,可能不太严谨)

①时钟周期T:单片机上面有一个晶振,通电后它会产生一个工作频率f(我用的C51是11.0592MHz,板子不同频率可能不同,可以用放大镜看一下,他的参数刻在晶振的上面了),这个评率的倒数就是你用的这个板子的时钟周期,单位:s。

T = 1/f

②机器周期:一个机器周期 = n×时间周期;不同的板子,n的取值不同,C51系列的n是12(那我就以12说明了),单位也是:s。

说完这两个,开头说单片机的定时器的工作就是不停地加,而且是加1(计一个数),而每次+1,就要消耗一个机器周期(所有这就是我为啥要先解释①②),或者讲每隔一个机器周期就寄存器就会+1。

知道这个有啥用呢?因为我们要算出来,我们打算让LED隔多长时间闪一次啊,这就是目的。

现在我们打算让灯泡每隔0.05秒闪一次,即:

0.05 (s) = m × n/f (s)

n和f刚才提到了,我用我的板子的参数代进去举个例子吧。

 0.05 (s) = m × 12/11059200(s)

m =  46080(次)

 也就是说,寄存器加了四万多个1,所用时长大约0.05s。

闹钟是从你设定的某个值倒计时至00:00后停止计时,单片机中寄存计时是你设置某个值后不断+1,直到加到某个值后停止,那加到哪个数值才能停止呢?

51系列标准的单片机内部是有两个寄定时器T0和T1,每一个定时器(也就是寄存器)有16bit,最大可以存储2^16bit的数据,换成16进制就是可以储存0x00到0xFF,超过这个数值,就会发生溢出(overflow),从0xFF进位后再次变成0x00,所以如果我们可以检测到有进位的情况,说明我们设置的初值经过不断+1,到了最大值(是不是很像闹钟计时到了终值00:00呢),此时LED闪一次。

这就是所需的原理部分。下面讲一下如何将原理通过c程序的方式实现目标。

2 C语言程序设计

  • 19
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
好的,关于c51单片机蜂鸣器通过定时器产生音乐,我可以为您提供一些基本的思路和代码示例。 首先,需要将蜂鸣器接到单片机的一个IO口上,并且在程序中进行相应的设置。假设我们将蜂鸣器接到了P2口的第0个引脚上,则可以使用以下代码进行初始化: ```c sbit Beep = P2^0; // 定义蜂鸣器控制引脚 void InitBeep() { Beep = 0; // 初始置0 } ``` 然后,我们需要使用定时器来产生音乐,具体步骤如下: 1. 设置定时器的工作模式为定时模式,并且设置定时器的计数值,以控制音乐的频率。假设我们使用定时器0,并且需要产生440Hz的音乐,则可以使用以下代码进行设置: ```c void InitTimer0() { TMOD &= 0xF0; // 设置定时器0为定时模式 TMOD |= 0x01; TH0 = 0xFE; // 设置定时器初值,以产生440Hz的音乐 TL0 = 0x5E; TR0 = 1; // 启动定时器0 } ``` 2. 在定时器中断函数中,控制蜂鸣器的状态,以产生音乐。假设我们需要产生持续1秒钟的音乐,则可以使用以下代码: ```c void Timer0_ISR() interrupt 1 { static uint count = 0; // 定义计数器 count++; // 每次进入中断函数,计数器加1 if(count == 440) // 每440次中断,控制蜂鸣器状态反转一次 { Beep = ~Beep; count = 0; // 计数器清零 } } void main() { InitBeep(); // 初始化蜂鸣器 InitTimer0(); // 初始化定时器0 while(1) // 主循环 { // do something } } ``` 以上就是一个基本的通过定时器产生音乐的代码示例,您可以根据自己的需求进行相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hsing Chin

我们的目标是学到东西!加油。

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

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

打赏作者

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

抵扣说明:

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

余额充值