前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8051和8052_基于单片机多用途定时器的设计

8051和8052_基于单片机多用途定时器的设计

作者头像
Java架构师必看
发布2022-10-24 14:30:05
4080
发布2022-10-24 14:30:05
举报

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说8051和8052_基于单片机多用途定时器的设计,希望能够帮助大家进步!!!

感谢!

52单片机的大家都熟悉,可是其中的Timer2很少有人去用,书上和网上鲜有资料,这里转载一篇文章,初步了解一下他的应用

/***********************************************************
	程序功能:52系列单片机定时器计数器2使用
	程序设计:燕山大学 鲁信琼
	晶振选择:24MHz, 如果晶振不匹配,请修改延时函数参数;P2^6口接数码管段选控制位; P2^7口接数码管位选控制位; P1^7口作为测试指示灯
	本实验注意事项:
	1. 定时器2的中断使能为IE^6位,也就是ET2; 中断服务程序标号为5。
	2. 定时器2工作在16为自动重装模式下,不需要在中断服务程序中重新赋初值,在程序初始化的时候我们应该给RCAP2L和RCAP2H赋值,TH2和TL2将会在
	中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。
	3. 定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零,为了使定时尽量准确,我们常在终端服务程序中第一步就使TF2=0。
	4. 使定时器2产生中断的有两个中断源,如果EXEN2(定时器2外部使能标志)置1的话,使定时器2进入中断的有可能是定时器2计数溢出,也可能是捕获
	到T2EX(单片机P1^1口)有负跳变,所以需要在中断服务程序中判断EXF2是否为1。
	
	承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作
	
	EMail: dotcpp@139.com	QQ: 9790335		手机: 13633330733
***********************************************************/

#include <REGX52.H>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define LED_DATA P0
sbit DULA=P2^6;
sbit WELA=P2^7;
sbit LED=P1^7;
uchar timer2_ctr,num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};
				   // 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F    -

//24MHz晶振延时x毫秒函数
void delay_ms(uint xms)
{
	uint x,y;
	for(x=xms; x>0; x--)
		for(y=248; y>0; y--);
}

//初始化主函数
void init_main()
{
	DULA=0;						//关闭数码管显示
	WELA=0;

	RCAP2H=(0xFFFF-50000)/256;	
	RCAP2L=(0xFFFF-50000)%256;	//24MHz晶振下定时25ms,自动重装	
	TH2=RCAP2H;
	TL2=RCAP2L;					//定时器2赋初值
	T2CON=0;					//配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置
	T2MOD=0;					//配置定时器2工作模式寄存器,这里其实不用配置,T2MOD上电默认就是0,这里赋值只是为了演示这个寄存器的配置
	IE=0xA0;					//1010 0000开总中断,开外定时器2中断,可按位操作:EA=1; ET2=1;  
	TR2=1;						//启动定时器2
}

//数码管显示3位数:0-255
void display(uchar num)
{
	uchar gw,sw,bw;	
	bw=num/100;
	sw=num%100/10;
	gw=num%10;

	LED_DATA=0XFE;		//1111 1110
	WELA=1;
	_nop_();_nop_();
	WELA=0;
	LED_DATA=table[bw];
	DULA=1;
	_nop_();_nop_();
	DULA=0;
	delay_ms(3);

	LED_DATA=0XFD;		//1111 1101
	WELA=1;
	_nop_();_nop_();
	WELA=0;
	LED_DATA=table[sw];
	DULA=1;
	_nop_();_nop_();
	DULA=0;
	delay_ms(3);
	
	LED_DATA=0XFB;		//1111 1011
	WELA=1;
	_nop_();_nop_();
	WELA=0;
	LED_DATA=table[gw];
	DULA=1;
	_nop_();_nop_();
	DULA=0;
	delay_ms(3);	
}

void main()
{
	init_main();
	while(1)
	{
		display(num);
	}	
}

void timer2() interrupt 5
{
	TF2=0;					//!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
	timer2_ctr++;

	if(timer2_ctr>=40)		//定时25ms×40=1000ms即1秒钟,这里模拟一个60秒秒表
	{
		timer2_ctr=0;
		LED=~LED;
		num++;
		if(num>=60)
		{
			num=0;
		}
	}
}

只听到从架构师办公室传来架构君的声音:

一场寂寞凭谁诉。有谁来对上联或下联?

大家可以编译下载试试哦,我试过,可以运行,不过是12MHz的晶振。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-232,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档