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