找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 134|回复: 0
打印 上一主题 下一主题
收起左侧

单片机定时器控制灯闪烁设计,含源码,原理图,仿真工程文件

[复制链接]
跳转到指定楼层
楼主
这是我们的实验,用89C51单片机定时器中断的方法实现定时器T0,工作方式1实现LED灯1s节拍闪烁,附带有单片机代码文件和protuse仿真工程文件。
这段代码的功能是利用8051单片机的定时器0(Timer 0)来控制P2端口的闪烁。程序的核心逻辑是通过定时器溢出(`TF0`)来计数,当计数达到20次时,翻转P2端口的电平状态,并重置计数器。以下是代码的详细分析和解释:
代码功能
• 硬件接口:
• 使用P2端口来输出信号,初始状态为全高电平(`0xFF`)。
• 使用定时器0(Timer 0)来产生定时溢出。
• 主要功能:
• 定时器0设置为模式1(16位定时器模式)。
• 定时器溢出时间初始为50ms(50000机器周期),之后改为30ms(30000机器周期)。
• 每次定时器溢出时,计数器`N`加1。
• 当`N`达到20时,翻转P2端口的电平状态,并重置`N`为0。
代码结构
主函数(`main`)
  1. void main()
  2. {
  3.     TMOD = 0x01; // 设置定时器0为模式1(16位定时器模式)
  4.     TH0 = (65535 - 50000) / 256; // 设置定时器高8位初值,初始定时50ms
  5.     TL0 = (65535 - 50000) % 256; // 设置定时器低8位初值
  6.     TR0 = 1; // 启动定时器0
  7.     TF0 = 0; // 清除定时器0溢出标志
  8.     P2 = 0xFF; // 初始化P2端口为全高电平

  9.     while (1)
  10.     {
  11.         while (TF0 == 0); // 等待定时器0溢出
  12.         TF0 = 0; // 清除定时器0溢出标志
  13.         N++; // 计数器加1

  14.         if (N == 20) // 判断计数器是否达到20
  15.         {
  16.             P2 = ~P2; // 翻转P2端口的电平状态
  17.             N = 0; // 重置计数器
  18.         }

  19.         TH0 = (65535 - 30000) / 256; // 重新设置定时器高8位初值,改为30ms
  20.         TL0 = (65535 - 30000) % 256; // 重新设置定时器低8位初值
  21.     }
  22. }
复制代码


代码逻辑分析
• 定时器初始化:
• `TMOD = 0x01;`:设置定时器0为模式1(16位定时器模式)。
• `TH0`和`TL0`:设置定时器初值,使定时器溢出时间为50ms(机器周期为12MHz)。
• `TR0 = 1;`:启动定时器0。
• `TF0 = 0;`:清除定时器0的溢出标志。
• 主循环:
• `while (TF0 == 0);`:等待定时器0溢出。
• `TF0 = 0;`:清除定时器0的溢出标志,防止中断触发。
• `N++;`:计数器加1。
• `if (N == 20)`:当计数器达到20时,翻转P2端口的电平状态,并重置计数器。
• 之后将定时器溢出时间改为50ms。
• P2端口翻转:
• `P2 = ~P2;`:翻转P2端口的电平状态,实现闪烁效果。
当中的问题不会可以发在评论区,如果收到我会回复的。谢谢大家!希望和一起学习进步。

51hei20250614-163627.png (213.11 KB, 下载次数: 0)

仿真界面

仿真界面

仿真加代码.zip

19.64 KB, 下载次数: 0, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表