清翔电子51单片机11课串口通讯课后作业3

本文详细介绍了如何使用51单片机的定时器/计数器在四种不同的工作方式下实现LED灯以500ms频率闪烁的程序设计。通过具体的代码示例,展示了每种工作方式下定时器的配置、中断处理以及LED状态反转的实现过程。

//
//编写让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;	 //	清零溢出计次数
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值