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;
}
}


 

posted @   Flying3080  Views(270)  Comments(0Edit  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示