51单片机002:利用定时/计数器T0从P1^0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHZ
题目解析:
让发光二极管以1HZ闪烁,周期为频率的倒数,也就是发光二极管以1s为周期闪烁。闪0.5s,灭0.5s。
思路解析:
1、选择一个发光二极管体现实验现象。
2、要用到定时器,肯定要写定时器初始化函数和中断服务函数,定时器初始化函数要配置相关寄存器和参数,定时器中断服务函数描述中断具体执行的任务。
定时器初始化函数:
主要配置寄存器有:TCON、TMOD、高八位寄存器(定时器0:TH0;定时器1:TH1)、低八位寄存器(定时器0:TL0;定时器1:TL1)。TMOD不同的是TMOD寄存器不可位寻址,因此对TMOD的配置需要对这个8bit寄存器整体赋值。根据具体的情况对相应寄存器赋值即可,如选择定时器0模并选择工作方式1,TMOD寄存器就为0000 0001,所以对TMOD赋值为0x01。
中断服务函数:
1、如果TMOD工作模式未选择自动重装,则需要对TH0和TL0寄存器重新赋值。
2、进行计数变量的累加
3、执行简单的中断任务
完整代码:
#include "reg52.h" typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1=P2^0; void time0_init(void) { TMOD|=0X01; //选择为定时器0模式,工作方式1 TH0=(65535-50000)/256; //50ms定时20次 TL0=(65535-50000)%256; ET0=1; //打开定时器0中断允许 EA=1; //打开总中断 TR0=1; //打开定时器 } void main() { time0_init();//定时器0中断配置 while(1) { } } void time0() interrupt 1 //定时器0中断函数 { static u16 i; //定义静态变量i TH0=(65535-50000)/256; //50ms定时20次 TL0=(65535-50000)%256; i++; if(i==10) { i=0; LED1=!LED1; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)