基于单片机的0-99计数器设计(共8页).doc
9页精选优质文档-----倾情为你奉上 计数器设计一、实习目的与要求 1、设计的目的(1)掌握51系列单片机的基本硬件结构及工作原理2)掌握51系列单片机的汇编语言及基本程序设计方法3)学习并掌握使用51系列单片机开发控制系统的基本步骤及方法4)掌握51系列单片机键盘显示电路的编程方法 2、设计要求(1)设计十进制0~99的计数器,采用按键计数,数码管显示2)采用按键产生计数值:按下按键,计数值增加1;(3)采用2位数码管显示,计数初值为0;(4)当计数达到99时,再次按下按键,计数值从1开始增加;(5)设计一个按键,用于清空计数值2、 总体设计方案 1、计数器的基本原理利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.2管脚接一个轻触开关,作为手动计数的按钮再利用AT89S51单片机的复位键进行清零处理同时51单片机的P1.0-P1.7接共阴数码管的位选,作为0-99计数选择的位置用单片机的P0.0-P0.7接共阴数码管的段选,作为00-99计数的显示,总体结构框图如图1-1所示AT89S51 单片机 电源 数码管显示 键盘 图1-12、 模块电路分析(1) STC89C51单片机:它是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及STC8951引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的STC8951可为许多嵌入式控制应用系统提供高性价比的解方案。
STC8951具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入输出(I/O)口,5个中断优先级,2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信,片内时钟振荡器其单片机的外围引脚有40个,分别是:第20脚和40脚分别是电源,即GND和Vcc;第9脚是复位脚RST;第18脚是时钟XTAL2脚,片内振荡电路的输出端;第19脚是时钟XTAL1脚,片内振荡电路的输入端;第29脚:~PSEN脚,当访问外部程序存储器时,此引脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上;第30脚:ALE/~PROG,当访问外部数据存储器时,ALE(地址锁存)的输出用于锁存地址的低字节;第31脚:~EA/Vpp为程序存储器内外部选通信号;P0^0-P0^7.P1^0-P1^7.P2^0-P2^7.P3^0-P3^7这32个引脚为数据的输出及输入引脚,即I/0口2) 键盘模块:它是4个独立式键盘,其特点是一键一线,各键相互独立,每个按键各接一条I/O口线,通过检测I/O输入线的电平状态,可以很容易的判断那个键被按下,如图2-1所示。
图2-1 (3) 电源和复位电路:AT89S52需5V电压,所以可以采用USB接口的5V电源对其供电,复位电路可采用上电复位、按键电平复位、按键脉冲复位3种,本次采用按键电平复位,如图2-2所示 图2-2 (4) 显示模块:该模块由8位8段共阳极数码管组成,由8个PNP型三极管分别驱动其发光,从左至右位控分别接于单片机的P1.7-P1.0中上,段控a-dP接于单片机的P0.0-P0.7口上,使用动态显示从右向左循环点亮每一位数码管如电路原理图中的数码管电路如图2-3所示 图2-3(5) 总的原理图如图2-4所示 图2-4 专心---专注---专业三、软件编程1、程序流程图 主程序开始初始化,然后键盘扫描,复位电路,计数器当有键盘按键按下去时,调整计数器值,数码管显示新值。
当有复位键按下去时,计数器复为初值,重新按键计数当计数器计到100时初值复位1,又一次开始按键计数,程序流程图如图3-1 开始 计数加1是否有键按下 调用键盘扫描程序 调用显示函数初始化程序 否 是 计数加100时 回到预置值 指示计数值 图3-12、具体程序 //0~99计数器// #include
2)编写检测程序逐个点亮数码管,检查数码显示部分是否有硬件问题3)编写检测程序检测矩阵扫描是否有硬件问题2、程序调试 重点就是这个部分,很多程序就是在调试过程中慢慢完善,先前所完成的程序部分只能算一个基本框架,当然,这一切是建立在硬件没用问题的基础上程序在进行调试时,可以像硬件一样使用分模块调试,这样可以最迅捷的找出问题所在,不受其他模块的影响,我们在硬件调试时,一开始时51芯片不工作,经过反复检查后发现原来51芯片的31脚(/EA/VPP)必须接入高电平才能使单片机在读取程序时优先访问内部程序存储器,否则只访问外部程序存储器,而我们的程序是在内部的,故芯片不工作,我们随即在31脚外接VCC和限流电阻,在解决了这个后,硬件OK了软件调试时问题就比较多了,很多都是小问题,大多是因为在编写程序时一些地方不够注意或笔误引起的,在这里就不过多解释,少部分是一些难以解决的大问题,一是在输入数字的储存上,开始打算只使用一个数组disp_code[]解决,但在编程时发现在数字转换为一个一个的编码中发现直接引用会引起数据混乱,最后在添入另一数组str1[]后问题得到解决;二是输入数据在内部进行加减乘除时,加法乘法没有错误,但减法除法因为一次输出和二次输入数据的位置关系导致第二次运作时出现错误,最后我们调整了储存数据的变量,这个问题顺利的解决了,最后一个问题困扰我们最久,甚至导致调试过程一度中止,由于我们是2位数的运算,在数字显示过程中,出现了跳位现象,当输如12时,数码管正常显示12,但将3输入后,数码管显示变为了32,由于一直找不出原因,这个问题一直得不到解决,最后我尝试改变display( )函数和大循环中函数的位置循序后才能正常显示,但这从理论上说不通,最后得出可能是受到延时函数delay( )的延时影响,导致数码管动态显示位码出错。
5、 总结及体会从这次课题设计任务中,学习到了很多,经过二十天的努力,老师的精心指导,还有和在网上找到的一些资料,主要让我们掌握了数码管移位动态扫描显示的编程方法,掌握了矩阵扫描的编程方法,掌握了数据在内部运算的编程方法,这也是编程必须掌握的知识当然调试的时候也是一个重点,也收获良多,这其中就分硬件和软件两部分,硬件只要注意一些焊接问题,对板子输入简单的程序进行检测这个只要自己细心一点都可以按照原理图做好,其中最重要,最麻烦,也是学到和掌握的东西最多的地方就是软件调试了,这其中包括程序的编写检验,这样必须对程序的每部分都很熟悉,掌握每句程序的再整个整体的作用这样当出现问题是才能根据问题改变程序内容而达到目的出问题最多的也是这个地方,这也证明了我对程序的掌握还有欠缺,不能熟悉的掌握和运用程序,所以导致我们不能很快很好的完成课题任务当然也还有很多细节方面和人工的失误问题程序编写上也出现了很多细节的错误,并不能把程序依次性就编写好,这也浪费了很多的时间所以要把一次课题设计好,不但要学习好课堂的知识,而且要注意各方面的细节这次课题设计使我各方面都得到了一定的锻炼指导教师评语及成绩评定: 成绩: 指导教师签字: 年 月 日。





