51单片机练习:用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时

题目:

用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时(来自郭天祥老师的51单片机练习)

代码:

初始化函数

//初始化函数
void Init()
{
	TMOD = 0x11;//两个定时器的工作模式
	TH0 = (65536 - 45872) / 256;//T0计时50ms
	TL0 = (65536 - 45872) % 256;
	TH1 = (65536 - 45872) / 256;//T1计时50ms
	TL1 = (65536 - 45872) % 256;
	EA = 1;//使能总中断
	ET0 = 1;//使能T0中断
	ET1 = 1;//使能T1中断
	TR0 = 1;//启动T0
	TR1 = 1;//启动T1
	
	time = 0;//1s加1计时
}

数码管显示函数

//数码管显示函数
void display()
{
	uint ge,shi;
	//计算每秒个位与十位的变化
	if(t1 == 20)
	{
		t1 = 0;
		time++;
		if(time == 60)
		{
			time = 0;
		}
		shi = time / 10;//十位
		ge = time % 10;//个位
	}
	
	//显示十位
	WLE = 1;
	P0 = 0xfe;
	WLE = 0;
	P0 = 0xff;//消影
	DLE = 1;
	P0 = Table[shi];
	DLE = 0;
	delay_1ms(5);//延时短,达到动态扫描的效果
	
	//显示个位
	WLE = 1;
	P0 = 0xfd;
	WLE = 0;
	P0 = 0xff;//消影
	DLE = 1;
	P0 = Table[ge];
	DLE = 0;
	delay_1ms(5);//延时短,达到动态扫描的效果
}

延时1ms函数

//延时1ms函数
void delay_1ms(uint z)
{
	uint x,y;
	for(x = z;x > 0;x--)
	{
		for(y =110;y > 0;y--){}
	}
}

定时器0中断函数

void Timer0() interrupt 1
{
	TH0 = (65536 - 45872) / 256;//T0计时50ms
	TL0 = (65536 - 45872) % 256;
	t0++;
	
	if(t0 == 4)
	{
		t0 = 0;
		led1 = ~led1;	
	}
}

定时器1中断函数

void Timer1() interrupt 3
{
	TH1 = (65536 - 45872) / 256;//T1计时50ms
	TL1 = (65536 - 45872) % 256;
	t1++;
}

整个项目代码

#include <reg52.h>

//【例3.5.2】在 TX-1C 实验板上完成如下功能:用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。
//实验板晶振 11.0529MHz

#define uint unsigned int
#define uchar unsigned char
	
sbit led1 = P1^0;//第一个发光管
sbit WLE = P2^7;//位选
sbit DLE = P2^6;//段选
//数码管的编码表
uchar code Table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint t0,t1,time;

void Init();
void LED();
void display();
void delay_1ms(uint z);

void main()
{
	Init();
	
	while(1)
	{
		display();
	}
}

//初始化函数
void Init()
{
	TMOD = 0x11;//两个定时器的工作模式
	TH0 = (65536 - 45872) / 256;//T0计时50ms
	TL0 = (65536 - 45872) % 256;
	TH1 = (65536 - 45872) / 256;//T1计时50ms
	TL1 = (65536 - 45872) % 256;
	EA = 1;//使能总中断
	ET0 = 1;//使能T0中断
	ET1 = 1;//使能T1中断
	TR0 = 1;//启动T0
	TR1 = 1;//启动T1
	
	time = 0;//1s加1计时
}

//数码管显示函数
void display()
{
	uint ge,shi;
	//计算每秒个位与十位的变化
	if(t1 == 20)
	{
		t1 = 0;
		time++;
		if(time == 60)
		{
			time = 0;
		}
		shi = time / 10;//十位
		ge = time % 10;//个位
	}
	
	//显示十位
	WLE = 1;
	P0 = 0xfe;
	WLE = 0;
	P0 = 0xff;//消影
	DLE = 1;
	P0 = Table[shi];
	DLE = 0;
	delay_1ms(5);//延时短,达到动态扫描的效果
	
	//显示个位
	WLE = 1;
	P0 = 0xfd;
	WLE = 0;
	P0 = 0xff;//消影
	DLE = 1;
	P0 = Table[ge];
	DLE = 0;
	delay_1ms(5);//延时短,达到动态扫描的效果
}

//延时1ms函数
void delay_1ms(uint z)
{
	uint x,y;
	for(x = z;x > 0;x--)
	{
		for(y =110;y > 0;y--){}
	}
}

void Timer0() interrupt 1
{
	TH0 = (65536 - 45872) / 256;//T0计时50ms
	TL0 = (65536 - 45872) % 256;
	t0++;
	
	if(t0 == 4)
	{
		t0 = 0;
		led1 = ~led1;	
	}
}

void Timer1() interrupt 3
{
	TH1 = (65536 - 45872) / 256;//T1计时50ms
	TL1 = (65536 - 45872) % 256;
	t1++;
}

心得/经验记录:

1.不能将led灯的程序写在主函数中。因为,如果led灯的程序写在主函数中,并且led灯亮灭的间隔时间减短(如20ms),数码管每次显示的时间加长(如50ms),在这种情况下,有可能程序进入到数码管的display函数中执行并延时,但此时led灯的程序也到时间该执行,实际上却无法执行,那么t0变量就会一直加下去,之后led灯也就不会改变状态了。(郭天祥老师经验)

2.在数码管的display函数中,段选与位选的显示语句不能写在if语句中,否则数码管的十位会一直闪,不能正常显示。因为当段选与位选的显示语句写在if语句中时,只有t1=20时,才会显示数码管,对于十位数来说,就是短暂的几毫秒,之后就马上会因为个位数的显示而关闭,因而看到的实验现象是十位数隐隐闪现。当段选与位选的显示语句写在if语句外时,主函数的while语句会一直执行display函数,当t1没到20的时候,数码管就一直显示上一秒的值(数码管动态显示),当他t1=20的时候,说明1秒到达,就改变个位ge和十位shi变量的值,数码管显示数值就会更新,加1秒。

写此文章,仅记录自己学习51单片机过程中的一些思考和心得感悟,方便自己之后查阅,也供学习51单片机的小伙伴学习参考~

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机原理及系统课程设计 专 业: 电气工程及其自动化 班 级: 姓 名: 学 号: 指导教师: "评语: " " " " " " " " " " " " " "平时(40)" "修改(3" "报告(3" "总成绩 " " " " "0) " "0) " " " " 兰州交通大学自动化与电气工程学院 2012 年 7月 1日 1 引言 随着电子技术的发展,电子技术在各个领域的运用也越来越广泛,人们对它的认识也 逐步加深。秒表计时器常常用于体育竞赛及各种其他要求有较精确时间的各领域中。其 中启/停开关的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开 始计时,再按一下启/停开关计时终止。而复位开关可以在任何情况下使用,即使在计时 过程中,只要按一下复位开关,计时应立即终止。 2 设计方案及原理 以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、停止 、时间显示。 采用3个LED数码管显示时间,计时范围设置为0~99.9秒,即精确到0.1秒,用按键控 制秒表的"开始"、"暂停"、"复位",按"开始"按键,开始计时;按"暂停"按键,系统暂 停计时;再按"开始"键,系统继续计时数码管显示当前计时值;按"复位"按键,系统 清零。 3 硬件设计 MCS- 51系列单片机是8位单片机产品,89C51是其中的典型代表,基本模块包括以下几个部分 : (1)CPU:89C51的CPU是8位的,另外89C51内部有1个位处理器; (2)R0M:4KB的片内程序存储器,存放开发调试完成的应用程序; (3)RAM:256B的片内数据存储器,容量小,但作用大; (4)I/O口:P0-P3,共4个口32条双向且可位寻址的I/O口线; (5)中断系统:共5个中断源,3个内部中断,2个外部中断; (6)定时器/计数器:2个16位的可编程定时器/计数器; (7)通用串行口:全双工通用异步接收器/发送器; (8)振荡器:89C51的外接晶振与内部时钟振荡器为CPU提供时钟信号; (9)总线控制:89C51对外提供若干控制总线,便于系统扩展。 89C51单片机内部的振荡电路是一个高增益反相放大器,引线XTAL1和XTAL2分别为反 相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的输出,该反相放大 器可以配置为片内振荡器。 采用上电复位,上电后,由于电容充电,使RST持续一段时间的高电平,从而实现上 电复位操作。 采用3个LED数码管,LED是七段显示器,内部有7个条形发光二极管和1个小圆点发光 二极管,根据各管的亮暗组成字符。用Proteus软件画出主电路图见附录一。 4 软件设计 (1)秒表的初始化 根据程序流程图,先进行秒表的初始化,即: 将I/O口P3全写一,为秒表的控制输入 做好准备; 将数码管全部置零,使其处于秒表计时的初始状态; 将工作寄存器R0~R2以 及30H初始化,留待后面的计时程序备用; 将定时器0置于工作方式1,并为其装入计时 预置数D8FE(因为程序运行过程中占用的时间会导致一定误差,此为经实物测试之后的 修正值),即将定时器定为每10ms溢出; 开总中断允许和定时器0中断允许。初始化完 成后,即进入之后的按键扫描程序。 (2)按键检测程序 轮流检测开始计时(P3.2)、暂停计时(P3.3)、秒表清零(P3.4)三个按键。若发现有一 个按键出现低电平(可能被按下),则延时10ms(调用延时子程序DELAY),延时完成后 ,若发现低电平消失,则说明该按键实际上未被按下,此时转回按键检测处继续检测; 若发现仍然是低电平,则说明此键确实被按下了,此时就跳转至相应的程序标号处,执 行相应的功能。 (3)开始计时 若确认"开始计时"键被按下,则跳转至程序标号"RUN"处,将定时器0计时允许控制位 TR0置位,则定时器开始运行。此动作完成后,返回按键检测程序,等待操作者的下一次 指令。 (4)计时程序 定时器0计时至10ms,溢出,引发中断,程序跳转至定时器0中断服务程序入口000BH 处执行。程序跳转至中断服务程序TIME0。由于秒表的最小计时单位是0.1s,即100ms, 因此需加入软件计时,使定时器0溢出10次之后才改变数码管的显示状态。因此每来一次 中断就将30H中的数加1,若30H中的数没有到10,则给定时器0重新装入预置数,之后中 断返回并继续等待中断;到10了,才进入显示程序,改变数码管的显示状态,执行完毕 之后中断返回并继续等待中断。 (5)显示程序 将数码管的段选码放在数表TAB中。每次100ms计时完成后,将R0中的值(初值为0) 送入A,然后自加1。若R0中的值没到10,则使用累加器A查表,并将查得的数码管段选码 送入毫秒位数码管。之后将30H中的数置零,中断返回。若发现R0中的数到
摘要 随着时代的进步,电子行业的发展,定时器的应用也越来越广泛,单片机以其强大的 功能,成为许多功能电子产品的首选。本次电子定时器电路根据设计要求采用AT89C51单 片机来实现最大99秒倒计时,采用两位数码管显示。文章的核心主要是硬件介绍及连接 和软件编程两个大的方面。硬件电路主要包括AT89C51、晶振电路、数码管,发光二级管 ,按键。软件用汇编语言实现,主要包括主程序、倒计时、重启控制程序等软件模块。 采用软硬件配合基本能实现设定定时时间倒计时功能,达到了设计的要求和目的。并在 Proteus软件上进行了仿真和调试。 关键词 AT89C51单片机定时器;倒计时 目录 摘要…………………………………………………………………………………………… 第一章 绪论 1.1定时器的发展 1.2 电子定时器的应用 1.3选题的目的和意义 1.4 本章小结 第二章 单片机的基础知识 3 2.1单片机简介 3 2.2单片机的特点 3 2.3 本章小节 第三章 功能实现及硬件介绍 4 3.1 设计功能实现 4 3.2 C51单片机引脚介绍 9 3.3时钟和复位电路 3.4数码管显示 10 3.5键盘 12 3.6电气原理图……………………………………………………… 3.7本章小结 第四章 软件设计 15 4.1 程序流程图 15 4.2定时1秒设计 16 4.3重新启动 17 4.4程序 17 4.5 本章小结 结论 参考文献 致谢 第一章 绪论 1.1定时器的发展 人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试 使用这种全新的计时工具来改进定时器,达到准确控制时间的目的。传统的定时器都是 使用发条驱动式、电机传动式、电钟式等机械定时器。20世纪末,电子技术获得了飞速 的发展,在其推动下,现代电子产品几乎渗透了社会的备个领域,有力地推动了社会生 产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更 新换代的节奏也越来越快。电子定时器相对传统定时器来说体积小,重量轻,造价低, 精度高,寿命长,而且安全可靠适用于频繁使用,在各个领域得到了广泛的应用。使相 当多需要人控制时间的工作变得简单了许多。 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、 小体积、大容量、高性能、低价格和外围电路内装化等几个方而发展,它从根本上改变 了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分 功能,现在己能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为 微控制技术,是传统控制技术的一次革命。 1.2电子定时器的应用 电子定时器大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、 时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备甚至各种 定时电气的自动启用等。 电子定时器经常用于延时自动关机、定时。延时自动关机可用于电视机、催眠器、路 灯及其他电器的延时断电及延时自停电源等。定时可用于照相定时曝光,定时闪光,定 时放大,水位定时报警,延时电铃,延时电子锁等,人们甚至将定时器用在了军事方面 ,制成了定时炸弹,定时雷管。 电子定时器影响着人类的生产和生活,随着电子技术的发展,电子定时器也在不断的 进步,将朝着更高精度,更多用途的方向为我们服务。 1.3 选题的的目的和意义 定时器与生活联系密切,我们亲身体会到它存在的价值,通过课程设计自己亲自完成 电子定时器的简单设计不仅可以将学到的理论知识应用于实践,更提高了我们思考问题 ,解决问题的能力,同时提高我们的学习兴趣。 1.4 本章小结 本章小结:本章主要介绍了定时器的现状,让我们对电子定时器的有了初步的了解, 为进一步设计及研究奠定了基础。 第二章 单片机的相关知识 2.1单片机简介 单片机全称为单片机微型计算机(Single Chip Microsoftcomputer)。从应用领域来看,单片机主要用来控制,所以又称为微控制器(M icrucontroller Unit)或嵌入式控制器。单片机是将计算机的基本部件微型化并集成在一块芯片上的微型 计算机。 2.2单片机的特点 l. 单片机的存储器ROM和RAM是严格区分的。RAM称为程序存储器,只存放程序,固定常数, 及数据表格。RAM则为数据存储器,用作工作区及存放用户数据。 2. 采用面向控制的指令系统。为满足控制需要,单片机有更强的逻辑控制能力,特别是单 片机具有很强的位处理能力。 3. 单片机的I/O通常是多功能的。由于单片机芯片上引脚数目有限,为了解决实际引脚数和 需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设 置或由机器状态来区分。 2.3 本章小结 通过对单片机总体的介绍,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值