您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 基于51单片机的可预置分秒倒计时装置
11.设计方法本次课程设计的题目是设计并实现可编程倒计时装置。具体要求是按秒倒计时并键盘预置分、秒各两位数,键控启动计时,数码管显示倒计时;计时器归零时输出一音频信号。根据实验要求选用AT89C52单片机作为最基本的部件,包括数码管部分,蜂鸣器部分,矩阵键盘部分等几大模块,以下依次进行介绍。1.1硬件简介(1)AT89C52AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。引脚图如下:图一PDIP封装的AT89C52引脚图该单片机的功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。RST(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)为供电端口,接+5V电源的一端,GND(20脚)为接地端,接地。P0~P3为可编程通用I/O脚,在本设计中,P0端口(32~39脚)被定义为数码管数据输入端口,分别与数码管的相应功能管脚相连接。P2端口外接一个74LS373对控制信号进行锁存,然后从P2口的低四位输出到数码管的片选2端,进行对四位数码管的选择。P3口中的P3.0接蜂鸣器的使能端,控制蜂鸣器的选通。(2)时钟振荡器AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,如果使用石英晶体,电容使用30pF±10pF,而如使用陶瓷谐振器建议选择40pF±10pF。(3)键盘按键电路矩阵键盘:为了节省I/O口,通常将按键排列成矩阵形式,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。本设计采用4*4矩阵电路,包括0~9十个数字,设置,启动,暂停,左移,右移和确定这十六个按键。P1.0~P1.3为列扫描,P1.4~P1.7为行扫描。(4)数码管图二数码管简介图如图所示,数码管主要有两种形式,共阴极和共阳极。共阴极的数码管就是公共端接地,共阳极的数码管就是公共端接电源。本次设计采用的是共阳极的设计方案。31.2设计思路在本设计中:(1)4x4矩阵键盘,有数字0-9输入,可以方便快捷的预置分秒,抛弃了‘分’‘秒’按键,采用‘左’‘右’按键,使得预置数值时更加方便,可以随心所以左右移动,选择输入。另增加一个暂停键,功能是使得再倒计时的过程中,随时暂停,再按启动键时,倒计时继续开始。(2)数码管采用的是4位一体共阳数码管,有4个位选端,来分别选择4个数码管。(3)蜂鸣器采用的是有源蜂鸣器,无源蜂鸣器和有源蜂鸣器的区别在于,有源蜂鸣器只需加入一个高电平就可以发声,而无源蜂鸣器需要输入一定频率的脉冲才可以发声,从而选择简单高效的有源蜂鸣器。1.3设计框图4x4矩阵键盘单片机AT89C52四位数码管蜂鸣器图三设计框图42系统硬件设计图根据思路设计出的硬件如下图所示图四硬件电路连接图3程序设计框图P1.0P1.1ALEP1.2P1.3P1.4P1.5P1.6P1.7P1.0P1.1P1.4P1.5P1.6P1.7P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7Q0Q1Q2Q3Q0Q1Q2Q3P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P1.2P1.3XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52X1CRYSTALC130pFC230pFC330uFR110k+5v+5V0123456789左右启动设置D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719OE1LE11U274LS373共阳极数码管确定LS1SOUNDER暂停+5VQ1PNPR210k+5V234567891RP1RESPACK-85开始动态扫描数码管显示全A,代表初始状态键盘扫描“设置”键是否按下否进入赋值阶段,i=0,(i代表正在赋值的位数)是第i位数码管闪烁亮A,代表正在给第i位赋值键盘扫描——矩阵键盘,是否有键按下0-9按下左移按下右移按下确认按下设置按下否第i位数码管赋值,i++i--,if(i==-1)i=3;第一位左移代表去了第四位i++,If(i==4)i=0;第四位右移代表去了第一位四位数码管是否都赋值完成否点亮分秒之间的小数点,代表赋值完成是以当前值动态扫描数码管键盘扫描“启动”键是否按下否开始以1S为单位,减计数是检测“暂停”是否按下检测“启动”是否按下是否定时完成蜂鸣器响是否结束64资源分配表(1)P0.0-p0.7上先接一个排阻,作为上拉电阻。如下图所示图五上拉电阻然后引脚接入共阳数码管的段选端,如下图所示:P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7Q0Q1Q2Q3共阳极数码管图六数码管(2)P1.0-P1.7接矩阵键盘,其中p1.0-p1.3为列扫描,p1.4-p.17为行扫描如下图所示:7P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.70123456789左右启动设置确定暂停图七矩阵键盘连接图(3)P2口的p2.0-p2.3先接入一个74ls373锁存器,之所以要接这个锁存器是因为我们选用的是共阳数码管,需要大驱动,直接用单片机接的话带不起来,亮度会很低。如下图:图八锁存器之后373的Q输出端的q0-q3再接入供养数码管的位选端,分别选中4个数码管,高电平有效,如图4.3所示。(4)P3口的p3.0接入蜂鸣器,输入一个低电平,蜂鸣器便发声。85源程序#includereg52.h#includeintrins.h#defineuintunsignedint#defineucharunsignedcharsbitP3_0=P3^0;charseg_n[4]={10,10,10,10};//设置阿拉伯数字表示ucharseg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//共阳码表ucharseg[4]={0xff,0xff,0xff,0xff};//设置值全局变量段值ucharnum[4]={0,0,0,0};//位是否赋值标志位ucharkey_num=50;uintrupt;uintbuz;/***************延时函数***************/voiddelay1ms(void)//误差0us{unsignedchara,b,c;for(c=1;c0;c--)for(b=142;b0;b--)for(a=2;a0;a--);}voiddelay500ms(void)//误差0us{unsignedchara,b,c;for(c=23;c0;c--)for(b=152;b0;b--)for(a=70;a0;a--);}voiddelay20ms(void)//误差0us{unsignedchara,b;for(b=215;b0;b--)for(a=45;a0;a--);}9/***************中断函数***************/voidTimer1Interrupt(void)interrupt3//中断1MS{TH1=0x0FC;TL1=0x18;rupt++;}/***************动态扫描数码管**************/voidseg_scan(ucharchose)//chose选择闪烁显示或不闪烁,1为闪烁,0为不闪{uinti=0;uintj=0;for(;j125;j++){for(i=0;i4;i++){P2=0x01;P2=_crol_(P2,i);P0=seg[i];delay1ms();P0=0xff;//段值清零,防止乱码}if(chose==0)j=125;//如果为0,选择为不闪模式,跳出循环}if(chose==1)delay500ms();//选择为闪烁模式,执行闪烁延时500ms}/***************键盘扫描***************/voidkeyboard_scan(){ucharx=50;uchari=0;//i为行,j为列ucharj=0;ucharr[4]={0xe0,0xd0,0xb0,0x70};ucharl[4]={0x0e,0x0d,0x0b,0x07};ucharkey[4][4]={{9,8,7,14},{6,5,4,24},{3,2,1,34},{0,42,43,44}};//按键值,代码P1=0xf0;for(i=0;i4;i++){if(P1==r[i])//确定在第I行{P1=0x0f;10for(j=0;j4;j++){if(P1==l[j])//确定在第J列{P1=0xf0;delay20ms();//延时20MS再测for(i=0;i4;i++){if(P1==r[i])//确定在第I行{P1=0x0f;for(j=0;j4;j++){if(P1==l[j])//确定在第J列x=key[i][j];}}}}}}}key_num=x;}/***************设置按键键盘扫描***************/voidsetup(){uchari=0;seg[0]=0x88;seg[1]=0x88;seg[2]=0x88;seg[3]=0x88;for(;i!=1;){seg_scan(0);keyboard_scan();if(key_num==44)i=1;}}/***************赋值函数***************/voidseg_value(){11uchary[4]={0,0,0,0};chari=0;seg[0]=0xff;//数码管清零seg[1]=0xff;seg[2]=0xff;seg[3]=0xff;for(i=0;;i++){for(num[i]=0;num[i]!=1;){key_num=50;//key_num需要赋值一个无关值,以免出现乱码seg[i]=0x88;//赋值为A,30为学林值,88为共阳值seg_scan(1);keyboard_scan();switch(key_num)//检测是否有功能键按下{case24:if(y[0]&y[1]&y[2]&y[3]){seg[i]=seg_code[seg_n[i]];//清掉Agotolabel_reset;}break;//4位都赋
本文标题:基于51单片机的可预置分秒倒计时装置
链接地址:https://www.777doc.com/doc-2567822 .html