可控跑马灯的设计与实现 2.docx
- 文档编号:5991186
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:13
- 大小:205.48KB
可控跑马灯的设计与实现 2.docx
《可控跑马灯的设计与实现 2.docx》由会员分享,可在线阅读,更多相关《可控跑马灯的设计与实现 2.docx(13页珍藏版)》请在冰豆网上搜索。
可控跑马灯的设计与实现2
摘要
本设计使用AT89C51单片机作为微控制器,利用P0口连接8个发光二极管,通过两个按键KEY1和KEY2输入外部中断INT0和INT1来控制“跑马灯”的运停和选项,从而实现多种跑马的形式,以达到停止、继续,并要求有多种亮暗组合的实现。
关键词:
MCS51跑马灯独立按键
目录
摘要I
1设计概述1
2AT89C51概述2
2.1AT89C51的硬件结构2
2.2AT89C51的工作模式6
2.3AT89C51程序存储器的加密8
3硬件电路设计9
4可控跑马灯的软件设计11
4.1程序流程图11
4.2程序代码12
5心得体会17
参考文献18
1设计概述
整个设计过程是先通过了解任务要求和功能指标,查阅书籍、资料,确定硬件和软件方案,到实现硬件电路和软件程序,最后到系统板的运行实验以及修改调试,最终成功完成。
在众多的微控制器中,我选择了较为熟悉的AT89C51单片机,由于按键软件去抖效果逊色于硬件去抖,所以我选用硬件去抖。
根据任务书中描述的功能,设计的外围资源较少,所以采用了两个外部中断来作为按键的输入,这样可以减少软件设计的负担。
而LED电路采用常用的上拉电阻,接到IO口的方法。
总体下来软、硬件都较为简易,这样设计时,成功率可大大提高。
2AT89C51概述
AT89C51是一个低电压,高性能CMOS8位单片机带有4K字节的可反复擦写的程序存储器(PENROM)。
和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。
片内含有8位中央处理器和闪烁存储单元,有较强的功能的AT89C51单片机能够被应用到控制领域中。
AT89C51提供以下的功能标准:
4K字节闪烁存储器,128字节随机存取数据存储器,32个I/O口,2个16位定时/计数器,1个5向量两级中断结构,1个串行通信口,片内震荡器和时钟电路。
另外,AT89C51还可以进行0HZ的静态逻辑操作,并支持两种软件的节电模式。
闲散方式停止中央处理器的工作,能够允许随机存取数据存储器、定时/计数器、串行通信口及中断系统继续工作。
掉电方式保存随机存取数据存储器中的内容,但震荡器停止工作并禁止其它所有部件的工作直到下一个复位。
2.1AT89C51的硬件结构
AT89C51共有40条引脚,引脚排列如图2.1所示。
图2.1AT89C51的引脚排列图
AT89C51主要特性如下:
1)与MCS-51兼容。
2)4K字节可编程闪烁存储器。
3)寿命:
1000写/擦循环。
4)数据保留时间为10年。
5)全静态工作为0Hz-24MHz。
6)三级程序存储器锁定。
7)128×8位内部RAM。
8)32可编程I/O线。
9)两个16位定时器/计数器。
10)5个中断源。
11)可编程串行通道。
12)低功耗的闲置和掉电模式。
13)片内振荡器和时钟电路。
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口:
P3.0RXD(串行输入口);P3.1TXD(串行输出口);P3.2/INT0(外部中断0);P3.3/INT1(外部中断1);P3.4T0(记时器0外部输入);P3.5T1(记时器1外部输入);P3.6/WR(外部数据存储器写选通);P3.7/RD(外部数据存储器读选通)。
端口引脚
第二功能
P3.0
RXD
P3.1
TXD
P3.2
INT0
P3.3
INT1
P3.4
T0
P3.5
T1
P3.6
WR
P3.7
RD
图2.2P3口第二功能列表
RST为复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG为当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN为外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP为当/EA保持低电平时,则在此期间外部程序存储器,不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
AT89C51中有一个用于构成内部震荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自然震荡器。
外接石英晶体及电容C1,C2接在放大器的反馈回路中构成并联震荡电路。
对外接电容C1,C2虽然没有十分严格的要求,但电容容量的大小会轻微影响震荡频率的高低、震荡器工作的稳定性、起振的难易程序及温度稳定性。
如果使用石英晶体,我们推荐电容使用30PF±10PF,而如果使用陶瓷振荡器建议选择40PF±10PF。
用户也可以采用外部时钟。
采用外部时钟的电路如图示。
这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。
由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。
2.2AT89C51的工作模式
AT89C51共用2种工作模式,分别为闲散节电模式和掉电模式。
下面进行介绍。
AT89C51有两种可用软件编程的省电模式,它们是闲散模式和掉电工作模式。
这两种方式是控制专用寄存器PCON中的PD和IDL位来实现的。
PD是掉电模式,当PD=1时,激活掉电工作模式,单片机进入掉电工作状态。
IDL是闲散等待方式,当IDL=1,激活闲散工作状态,单片机进入睡眠状态。
如需要同时进入两种工作模式,即PD和IDL同时为1,则先激活掉电模式。
在闲散工作模式状态,中央处理器CPU保持睡眠状态,而所有片内的外设仍保持激活状态,这种方式由软件产生。
此时,片内随机存取数据存储器和所有特殊功能寄存器的内容保持不变。
闲散模式可由任何允许的中断请求或硬件复位终止。
终止闲散工作模式的方法有两种,一是任何一条被允许中断的事件被激活,IDL被硬件清除,即刻终止闲散工作模式。
程序会首先影响中断,进入中断服务程序,执行完中断服务程序,并紧随RETI指令后,下一条要执行的指令就是使单片机进入闲散工作模式,那条指令后面的一条指令。
二是通过硬件复位也可将闲散工作模式终止。
需要注意的是:
当由硬件复位来终止闲散工作模式时,中央处理器CPU通常是从激活空闲模式那条指令的下一条开始继续执行程序的,要完成内部复位操作,硬件复位脉冲要保持两个机器周期有效,在这种情况下,内部禁止中央处理器CPU访问片内RAM,而允许访问其他端口,为了避免可能对端口产生的意外写入:
激活闲散模式的那条指令后面的一条指令不应是一条对端口或外部存储器的写入指令。
在掉电模式下,振荡器停止工作,进入掉电模式的指令是最后一条被执行的指令,片内RAM和特殊功能寄存器的内容在中指掉电模式前被冻结。
退出掉电模式的唯一方法是硬件复位,复位后将从新定义全部特殊功能寄存器但不改变RAM中的内容,在VCC恢复到正常工作电平前,复位应无效切必须保持一定时间以使振荡器从新启动并稳定工作。
闲散和掉电模式外部引脚状态如图2.3所示。
模式
程序存储器
ALE
P0
P1
P2
P3
闲散模式
内部
1
1
数据
数据
数据
数据
闲散模式
内部
1
1
浮空
数据
地址
数据
掉电模式
外部
0
0
数据
数据
数据
数据
掉电模式
外部
0
0
数据
数据
数据
数据
图2.3闲散和掉电模式外部引脚状态
2.3AT89C51程序存储器的加密
AT89C51可使用对芯片上的三个加密位LB1,LB2,LB3进行编程(P)或不编程(U)得到如图2.4所示的功能:
程序加密位
保护类型
1
U
U
U
没有程序保护功能
2
P
U
U
禁止从外部程序存储器中执行MOVC指令读取内部程序存储器的内容
3
P
P
U
除上表功能外,还禁止程序校验
4
P
P
P
除以上功能外,同时禁止外部执行
图2.4程序加密位的配置
当LB1被编程时,在复位期间,EA端的电平被锁存,如果单片机上电后一直没有复位,锁存起来的初始值是一个不确定数,这个不确定数会一直保存到真正复位位置。
为了使单片机正常工作,被锁存的EA电平与这个引脚当前辑电平一致。
机密位只能通过整片擦除的方法清除。
3硬件电路设计
本设计使用AT89C51芯片作为控制芯片,利用P0口连接8个发光二极管,利用按键S0输入INT0下降沿中断控制“跑马灯”D0—D7的停与运行,再利用按键S1输入INT1下降沿中断控制“跑马灯”的种类的变换,以达到要求的显示效果。
硬件资源分配如图3.1所示。
图3.1单片机硬件资源分配
即用8个发光二极管,正极上拉1K电阻到5V,负极分别接到P0.0到P0.7。
输入是用按键并联104电容,并上拉1K电阻到5V电源,接到外部中断INT0和INT1,用下降沿触发中断,来对按键进行输入,从而来控制跑马灯。
应用PROTEL软件画出电路原理图,并用手中已有的实验开发板来进行验证。
其中电路原理图如图3.2所示。
图3.2可控跑马灯电路原理图
4软件设计
由任务书给出的功能要求,并结合硬件电路设计和资源分配,来进行软件设计。
步骤为先画出软件流程,然后根据流程图在KeiluVision2开发环境下使用C语言进行编写代码和仿真调试,最后在手中已有的51开放板上进行脱机实验。
经过不断修改之后,代码趋于完善。
4.1程序流程图
图4.1程序流程图
4.2程序代码
/********
控制器:
AT89C51
编译环境:
KeiluVision2
实现功能:
要求开始时,所有灯全亮,按下按键后开始跑马灯,再按下键时停止,再按下键时继续,并要求有多种亮暗组合
资源配置:
外部中断P1.0和P1.1为按键KEY1和KEY2的输入;P0.0-P0.7为LED显示
********/
#include
#defineuintunsignedint
#defineucharunsignedchar
LED_tab1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
LED_tab2[8]={0xfc,0xf9,0xf1,0xe7,0xcf,0x9f,0x3f,0x7e};
LED_tab3[8]={0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};
ucharnum1;
ucharnum2;
ucharstop_num2;
ucharLED_STOP;
/****
功能:
延时
****/
voiddelay(uintt)
{
uinti;
ucharj;
for(i=0;i for(j=0;j<200;j++); } /***** 功能: LED显示 *****/ voiddisplay() { uchari; if(num1==0) { for(i=num2;i<8;i++) { P0=LED_tab1[i]; stop_num2=i; delay(200); if(LED_STOP) break; } } if(num1==1) { for(i=num2;i<8;i++) { P0=LED_tab2[i]; stop_num2=i; delay(200); if(LED_STOP) break; } } if(num1==2) { for(i=num2;i<8;i++) { P0=LED_tab3[i]; stop_num2=i; delay(200); if(LED_STOP) break; } } } /***** 功能: MCU的初始化 *****/ voidmcu_init(void) { P0=0x00; delay(2000); num1=0; num2=0; LED_STOP=0; EA=0; IT0=1; IT1=1; EX0=1; EX1=1; EA=1; } /***** 功能: 主函数 *****/ voidmain(void) { mcu_init(); while (1) { display(); } } /***** 功能: KEY1外部中断处理函数 *****/ voidKEY1_SER()interrupt0 { LED_STOP=! LED_STOP; if(! LED_STOP) P0=0xf0; else num2=stop_num2; } /***** 功能: KEY2外部中断处理函数 *****/ voidKEY2_SER()interrupt2 { num1++; if(num1>2) num1=0; } 5心得体会 在本周的课程设计中,我认识到课本上的知识的实际应用,增强了思考和解决实际问题的能力。 虽然只是短暂的一周,但在这期间,却让我受益匪浅。 这次课程设计让我认识到了知识和实践的重要性。 只有牢固掌握了所学的理论知识,才能有清晰的思路,知道每一步该怎样走,才能顺利的解决每一个问题。 但在实际应用中还要更深入思考。 通过查阅书籍和上网搜索资料,我发现所说的基本上都是一样的,只有通过自己的实际操练,上机编程,下载到实验板来验证,才能发现问题的所在,从而真正掌握知识技能。 一周的课程设计虽然结束了,但是在这期间所学的知识和老师的指导让我受益匪浅。 参考文献 1.姚福安.电子电路设计与实践.山东科学技术出版社,2001年10月 2.涂时亮.单片机软件设计技术.重庆科技文献出版社,1987 3.张毅刚.新编MCS51实用汇编程序设计.哈尔滨工业大学出版社,2003 4.康华光.电子技术基础.高教出版社,2003 5.胡汉才.单片机原理及接口技术.清华大学出版社,1996
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可控跑马灯的设计与实现 可控 跑马 设计 实现