//
//编写让LED以500ms的频率闪烁,要求分别使用
//定时器中的四种工作方式去实现
//
/定时器/计数器的工作方式0/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^3;
void timer_init()
{
TMOD = 0x00; //定时器工作方式0 TMOD4 TMOD5 0 0
TH0 = (8192 - 4608)/32; //总共位13位也就是2的13次方; 2的6次方32;
TL0 = (8192 - 4608)/32; //11.0592 也就是定时5ms
TR0 = 1; //启动定时器
ET0 = 1; //开定时器0中断
}
void main()
{
/*3步 总中断 次中断 此中断中断源*/
timer_init(); //串口初始化
EA = 1; //定时器中断打开;
while(1);
}
void timer0() interrupt 1
{
static uchar i;//溢出次数;
TH0 = (8192 - 4608) / 32;
TL0 = (8192 - 4608) % 32;
i++;
if(i == 100)
{
led = ~led;
i = 0;
}
}
/定时器/计数器的工作方式1/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^3;
void timer_init()
{
TMOD = 0x01; //定时器工作方式1
TH0 = (65536 - 46080) / 256; //总共位 16位也就是2的16次方; 2的8次方为256;
TL0 = (65536 - 46080) % 256; //11.0592 也就是定时50ms
TR0 = 1; //启动定时器
ET0 = 1; //开定时器0中断
}
void main()
{
/*3步 总中断 次中断 此中断中断源*/
timer_init(); //串口初始化
EA = 1; //定时器中断打开;
while(1);
}
void timer0() interrupt 1
{
static uchar i;//溢出次数;
TH0 = (65536 - 46080) / 256;
TL0 = (65536 - 46080) % 256;
i++;
if(i == 10)
{
led = ~led;
i = 0;
}
}
/定时器/计数器的工作方式2/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^3;
void timer_init()
{
TMOD = 0x02; //定时器工作方式2
TH0 = 256 - 200;
TL0 = 256 - 200;
TR0 = 1; //启动定时器
ET0 = 1; //开定时器0中断
}
void main()
{
/*3步 总中断 次中断 此中断中断源*/
timer_init(); //串口初始化
EA = 1; //定时器中断打开;
while(1);
}
void timer0() interrupt 1
{
static uint i;//溢出次数;
i++;
if(i == 2500)
{
led = ~led;
i = 0;
}
}
/*
晶振频率12Mhz利用定时器0工作模式3 为了增加一个附加的8位定时器、计数器而提供;
编写利用TL0计数器所对应的定时器实现间隔500毫秒闪烁一个LED灯
利用TH0计数器所对应的定时器实现间隔250毫秒闪烁另一个LED灯
*/
# include <reg52.h>
sbit D1 = P1^0;//LED灯对于IO口位声明
sbit D2 = P1^1;
void main()
{
TMOD = 0x03; //定时器0工作模式3,2个独立的8位计数器
TH0 = 256 - 200;//TH0储存8位初值, 定时200微秒
TL0 = 256 - 200;//TL0储存8位初值,定时200微秒
ET0 = 1; //开定时器TL0中断
ET1 = 1; //开定时器TH0中断
TR0 = 1; //启动定时器TL0
TR1 = 1; //启动定时器TH0
EA = 1; //开总中断
while (1);//等待中断
}
void TL0_Timer() interrupt 1//定时器TL0中断服务程序
{
static unsigned int i;//溢出次数计数静态变量
TL0 = 256 - 200;//TL0初值重装,定时200微秒
i++;
if (i == 2500) //2500次溢出后500毫秒时间到
{
D1 = ~D1;//将第一个LED灯状态取反
i = 0; // 清零溢出计次数
}
}
void TH0_Timer() interrupt 3//定时器TH0中断服务程序
{
static unsigned int i;//溢出次数计数静态变量
TH0 = 256 - 200;//TH0初值重装,定时200微秒
i++;
if (i == 1250) //1250次溢出后250毫秒时间到
{
D2 = ~D2;//将第二个LED灯状态取反
i = 0; // 清零溢出计次数
}
}
本文详细介绍了如何使用51单片机的定时器/计数器在四种不同的工作方式下实现LED灯以500ms频率闪烁的程序设计。通过具体的代码示例,展示了每种工作方式下定时器的配置、中断处理以及LED状态反转的实现过程。
1403

被折叠的 条评论
为什么被折叠?



