课程设计说明书
课程设计名称: 单片机专业课设
课程设计题目: PWM信号发生器的研制
学 院 名 称: 信息工程学院
专业: 电子信息工程 班级:
学号: 姓名:
评分: 教师:
20 13 年 7 月 2 日
摘要
随着电力电子全控开关器件的出现,脉宽调制技术(PWM)在电力电子变流技术中获得了,。泛的应Hj,如直流开关电源(DC/DC变换)、交。交变频(AC/AC变换)、交.直.交变频系统、UPS电源(DC/AC变换)、高功率因数整流(PWM整流或功率l灭l数校正PFC等)等电力电子各个应用领域,无不采用PWM控制技术。PWM控制最基本的实现方法是通过载波和控制波的模拟电路调制米产生,如采用三角形载波(或锯齿波)和直流(或正弦波)控制信号比较器进行比较产生PWM波。这种方法在模拟控制技术中广泛采用,并出现过许多产生PWM波控制芯片,如用于开关电源的TL494、SG3525、UC3842等。随着数字控制技术的发展,又出现了许多数字式PWM集成芯片,如用于变频调速的三相PWM发生器HEF4752、SLE4520、MA818等。但与迅速发展的微机控制技术相比,该方法显示出电路复杂、调制方式不够灵活等缺点,而采用软件计算的实时PWM控制策略越来越彼人们接受,并出现了许多不同的PWM波的计算方法,如采样SPWM法、谐波注入PWM法、均值PWM法、等面积PWM法等。电力电子的微机PWM控制技术已成为一种必然趋势。因此本文就PWM的单片机控制与实现进行分析研究,通过对外围电路芯片的设计实现PWM输出波形的频率、电压幅值、占空比的连续调节,达到产生PWM信号目的。
关键字:脉宽调制技术(PWM)、占空比、控制信号
单片机原理与接口技术 课程设计任务书
20 12 -20 13 学年第 2 学期 第 17 周- 19 周
注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。
目 录
第一章 系统的基本结构与分析························································ 5
1.1 系统设计内容与要求·································································· 5
1.2系统的基本结构········································································· 5
1.3系统的原理分析········································································· 5
第二章 软件设计············································································ 6
2.1程序设计语言的区别与选择··························································· 6
2.2 键盘功能介绍··········································································· 7
2.3 程序内部的具体说明·································································· 8
2.3.1关键字的具体说明···································································· 8
2.3.2单元地址介绍········································································· 8
2.4软件流程图·············································································· 9
第三章 硬件设计············································································· 10
3.1 方案的选择············································································ 10
3.2 各个电路模块的介绍································································· 11
3.2.1振荡电路··············································································· 11
3.2.2复位电路··············································································· 11
3.2.3 8253芯片定时/模块·································································· 12
3.2.4键盘及显示电路······································································· 15
第四章 实验调试与结果分析····························································· 17
4.1 实验调试器材········································································· 17
4.2 实验调试过程········································································· 17
4.3 测试结果分析··········································································· 18
结论······························································································· 19
参考文献························································································· 20
附录A···························································································· 21
附录B···························································································· 23
第一章 系统的基本结构与分析
1.1 系统设计内容与要求
一、设计内容与要求:
(4) 采用定时/计数器8253
(5) PWM信号的工作频率为500H
(6) 占空比可变且显示占空比
1.2 系统的基本结构
如图1.1所示为系统的基本结构框图。第一个框图中的显示器是由HD7279来控制,HD7279芯片是管控制的显示与键盘。第二个框图中锋的单片机用到的是89C51的核心控制单元。第三个框图中的定时/计数器,选用的是8253芯片,并且用到了74LS138译码器的片选功能。另外还用到一些门电路以及74LS373地址寄存器。
图1.1 基本结构框图
1.3 系统的原理分析
在实验中,首先我们通过编写软件程序的,对8253计数器的写入值产生一系列幅值相等而宽度不等的脉冲。其次,89C51单片机的作用是对PWM的显示器和定时/计数器进行控制。最后,产生一系列有规则的脉冲PWM波形。此外通过键盘按键的控制可以对8253计数器的初值进行改变,与此同时,数码管的占空比也能相应的显示出来。
第二章 软件设计
2.1程序设计语言的区别与选择
汇编语言和C语言他们的指令集,寻址方式不同,相当于两个机器各有各的操作方式
汇编语言是低级语言,在编写程序的时候会把根据不同的情况指定使用不同的寻址方式,能够对内存和CPU里的通用寄存器直接操纵。不同的计算机系列会有不同的汇编语言
而C语言是高级语言,可以实现跨平台。编写程序无需指定CPU的指令执行情况,一段程序可以在不同体系结构的计算机上使用,综合我们的实验要求,我们选择用汇编语言对程序进行编写。
2.2键盘功能介绍
我们键盘功能需要使用到的芯片是HD7279,HD7279A是一片具有串行接口的,可驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。
产品特点:
串行接口,无需外围元件可直接驱动LED
各位独立控制译码/不译码及消隐和闪烁属性
(循环)左移/(循环)右移指令
具有段寻址指令,方便控制独立LED
64键键盘控制器,内含去抖动电路
有DIP和SOIC两种封装形式供选择。
图2.2-1 图2.2-2
HD7279A芯片图 HD7279A芯片及键盘图
2.3程序内部的具体说明
2.3.1关键字的具体说明
表2.3.1 关键字说明
2.3.2单元地址介绍
表2.3.2 单元地址介绍
2.4软件流程图
对7279初始化,判断是否有按键按下,若没有按键按下,再次判断,重新进行键盘扫描;若键按下,判断是哪个键按下,并进行相应的操作。最后通过ALE不断给8253计数器时钟信号,进而改变占空比,对计数器0口不同输出,进而达到实验要求。
第三章 硬件设计
3.1方案的选择
通过研究占空比可调信号的产生方法,采用三种不同的方案使用汇编语言的产生。
方案一:的原理是分频,即用计数器计算时钟脉冲的上升沿个数,再通过输出电平反复翻转得到计数个数(脉冲宽度)可控的PWM信号;
方案二:的原理是锯齿波比较法,首先编程产生阶梯状的锯齿波,再通过锯齿波与输入占空比值(数值可控的直线)比较产生脉冲宽度随输入占空比数值变化的PWM信号。
方案三:是用有限状态机产生有用信号,首先定义两个状态,再通过计数器值与输入占空比值比较控制状态的切换,产生PWM信号。
方案四:选用可编程芯片8253的计数器0作为PWM信号发生器,8253的计数器0工作在可重复触发单稳态方式1下,它的输出口OUT0产生宽度可调的PWM信号脉冲,该输出脉冲宽度为:W=N/f;输出的占空比为:P=W1×(f/N)
通过使用proteus软件采用汇编语言能仿真证实了上文提到的四种PWM信号产生方案都是可行的,都能产生切实可用的PWM信号,四种方案中均可以通过修改输入端口占空比来控制产生信号的脉宽,且可以通过在程序中修改计数器的计数上限和分频模块的分频比改变信号的周期及频率,实现了多参数可调,使整体设计具有灵活的现场可更改性和较好的可移植性。且实现功能的程序简单易懂,设计过程中思路阐述清晰,流程介绍明了,且程序易于修改,可读性好
但是我综合各个因素我选择方案四。
3.2各个电路模块的介绍
3.2.1振荡电路
振荡器能够输出某一指定频率的正弦波,因此闭合环路中包含选频网络。若选频网络由RC元件构成,则该振荡器称为RC振荡器,一般用来产生1赫至几兆赫范围 内的低频信号;若选频网络由LC元件组成,则该振荡器称为LC振荡器,一般用来产生几百千赫以上的高频信号。若在LC振荡电路的选频网络中加入晶振元件, 我们则称该电路为石英晶体振荡器,其目的是为了提高输出信号的频率稳定度。
3.2.2复位电路
按键按下会复位,单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。
总结:
1、复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的。
2、按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。
图3.2.1复位与振荡电路仿真图
3.2.3 8253芯片定时/模块
这个芯片和模块的功能对于此次实验起着这关重要的作用,下面先来介绍一下这块芯片的控制字和具体的工作方式。
图3.2.3-1 8253控制字
每个计数通道内含1个16位的初值寄存器、减1计数器和1个16位的(输出)锁存器。8253内部包含3个功能完全相同的通道,每个通道内部设有一个16位计数器,可进行二进制或十进制(BCD码)计数。采用二进制计数时, 最大计数值是FFFFH, 采用BCD码计数时。 最大计数值是9999。与此计数器相对应, 每个通道内设有一个16位计数值锁存器。必要时可用来锁存计数值。
当某通道用作计数器时,应将要求计数的次数预置到该通道的计数器中、被计数的事件应以脉冲方式从CLK端输入, 每输入一个计数脉冲,计数器内容减“1”,待计数值计到“0”。 OUT端将有输出。表示计数次数到。当某个通道用作定时器时。 由CLK输入一定频率的时钟脉冲。根据要求定时的时间长短确定所需的计数值。并预置到计数器中,每输入一个时钟脉冲,计数器内容减“1”, 待计数值计到“0”。OUT将有输出,表示定时时间到。允许从CLK输入的时钟频在1~2MHz范围内。因此,任一通道作计数器用或作定时器用,其内部操作完全相同,区别仅在于前者是由计数脉冲进行减“1”计数。 而后者是内时钟脉冲进行减“1”计数。作计数器时, 要求计数的次数可直接作为计数器的初值预置到减“1”计数器中。作定时器时, 计数器的初值即定时系数应根据要求定时的时间进行如下运算才能得到:
定时系数=需要定时的时间/时钟脉冲周期
①设置通道:向方式控制字寄存器端口写入方式选择控制字,用于确定要设置的通道及工作方式;
②计数/定时:向通道写入计数值,启动计数操作;
③读取当前的计数值:向指定通道读取当前计数器值时,8253将计数器值存入锁存器,从锁存器向外提供当前的计数器值,计数器则继续作计数操作。
④计数到:当计数器减1为0时,通过引脚OUTi向外输出“到”的脉冲信号。
计数初值输入存放在初值寄存器中,计数开始或重装入时被复制到计数器中。
锁存器在非锁存状态,其值随计数器的变化而变化;一旦锁存了计数器的当前值,直到锁存器值被读取后才能解除锁存状态。
8253中各通道可有6种可供选择的工作方式, 以完成定时、计数或脉冲发生器等多种功能。8253的各种工作方式如下:
1.方式0:计数结束则中断
工作方式0被称为计数结束中断方式,它的定时波形如图9.3.4所示。当任一通道被定义为工作方式0时, OUTi输出为低电平;若门控信号GATE为高电平,当CPU利用输出指令向该通道写入计数值WR#有效时,OUTi仍保持低电平,然后计数器开始减“1”计数, 直到计数值为“0”,此刻OUTi将输出由低电平向高电平跳变,可用它向CPU发出中断请求,OUTi端输出的高电平一直维持到下次再写入计数值为止。
2.方式1:单脉冲发生器
工作方式1被称作可编程单脉冲发生器,进入这种工作方式, CPU装入计数值n后OUTi输出高电平, 不管此时的GATE输入是高电平还是低电平, 都不开始减“1”计数,必须等到GATE由低电平向高电平跳变形成一个上升沿后,计数过程才会开始。与此同时,OUTi输出由高电平向低电平跳变,形成了输出单脉冲的前沿,待计数值计到“0”, OUTi输出由低电平向高电平跳变,形成输出单脉冲的后沿, 因此,由方式l所能输出单脉冲的宽度为CLKi周期的n倍。
3.方式2:速率波发生器
工作方式2被称作速率波发生器,其定时波形如图9.3.6所示。进入这种工作方式, OUTi输出高电平,装入计数值n后如果GATE为高电平,则立即开始计数,OUTi保持为高电平不变; 待计数值减到“1”和“0”之间, OUTi将输出宽度为一个CLKi周期的负脉冲,计数值为“0”时,自动重新装入计数初值n,实现循环计数,OUTi将输出一定频率的负脉冲序列, 其脉冲宽度固定为一个CLKi周期, 重复周期为CLKi周期的n倍。
4.方式3:方波发生器
工作方式3被称作方波发生器,其定时波型如图9.3.7所示。任一通道工作在方式3, 只在计数值n为偶数,则可输出重复周期为n、占空比为1:1的方波。
进入工作方式3,OUTi输出低电平, 装入计数值后,OUTi立即跳变为高电平。如果当GATE为高电平, 则立即开始减“1”计数,OUTi保持为高电平,若n为偶数,则当计数值减到n/2时,OUTi跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值n,实现循环计数。这时OUTi端输出的周期为n×CLKi周期,占空比为1:1的方波序列; 若n为奇数, 则OUTi端输出周期为n×CLKi周期,占空比为((n+1)/2)/((n-1)/2)的近似方波序列。
5.方式4:软件触发方式计数
工作方式4被称作软件触发方式,其定时波形如图9.3.8所示。进入工作方式4,OUTi输出高电平。 装入计数值n后, 如果GATE为高电平,则立即开始减“1”计数,直到计数值减到“0”为止,OUTi输出宽度为一个CLKi周期的负脉冲。由软件装入的计数值只有一次有效,如果要继续操作, 必须重新置入计数初值n。如果在操作的过程中,GATE变为无效,则停止减“1”计数, 到GATE再次有效时,重新从初值开始减“1”计数。
6.方式5:硬件触发方式计数
工作方式5被称为硬件触发方式,其定时波形如图9.3.9所示。进入工作方式5, OUTi输出高电平, 硬件触发信号由GATE端引入。 因此,开始时GATE应输入为0, 装入计数初值n后,减“1”计数并不工作,一定要等到硬件触发信号由GATE端引入一个正阶跃信号,减“1”计数才会开始,待计数值计到“0”, OUTi将输出负脉冲,其宽度固定为一个CLKi周期,表示定时时间到或计数次数到。
图3.2.3-2 定时/计数器8253控制电路图
3.2.4 键盘及显示电路
HD7279A 专用键盘显示电路,真正的单片LED数码管显示和键盘接口芯片,无需外围电路,只需要外接少量的电阻等,即可构成完善的显示、键盘接口电路。而与CPU的接口采用SPI串行接口方式,使用方便。可方便的构成64按键,8位数码显示电路(共阴极结构)
HD7279A内部含有译码器,可直接受BCD码或16进制数据或七段显示码数据。此外,还具有多种控制指令,如消隐,闪烁,左移,右移,段寻址等。具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。
HD7279的纯指令:
1、复位指令(A4H)
当HD7279A收到该指令后,将所有显示清除,所有设置的字符消隐、闪烁等属性也被一起清除。执行后,芯片的状态与上电时一样。
2、测试指令(BFH)
该指令使所有的LED全部点亮,并处于闪烁状态,主要用于测试(检查LED是否坏) 3、左移指令(A1H)
使所有显示左移一位,消隐及闪烁属性不移位,最右边一位为空(暗)。
4、右移指令(A0H)
使所有显示右移一位,消隐及闪烁属性不移位,最左边一位为空(暗)。
5、循环左移指令(A3H)
使所有显示右移一位,消隐及闪烁属性不移位,最左边一位移到最右边。
6、循环右移指令(A2H)
使所有显示右移一位,消隐及闪烁属性不移位,最右边一位移到最左边。
第四章 实验调试与结果分析
4.1 实验调试器材
数字万用表 一个
稳压电源 一个
示波器 一台
4.2 实验调试过程
采用了ISIS 7 Professional 进行了实验电路的构建,接下来用Keil uVision4软件进行仿真,并在仿真调试中不断的对实验程序进行修改,最后仿真能较好的完成。接下来开始了硬件电路板的设计制作,硬件电路制作中杜邦线的制造是需要花一点心思的,线一定要插到底并加以固定。 之后实验电路制作完成后,用万用表检测有无短路开路等现象,在保证硬件电路没有问题后,用示波器的串口线与硬件电路相连,运行程序进行调试。
在一开始时数码管能显示“good050”,但在接下来输入的时候发现输入的数并不能在数码管上有所显示,一直是“NICE050”,于是我又对程序进行了检查,原来是输入按键时没有调用显示子程序,程序发生了问题,接着在对程序修改之后,输入不显示的问题解决了。如我要输入占空比为“45”的数值,只要依次输入“0”、“4”、“5”。数码管就能显示“nice045”。
输入问题解决了,但是波形并不能如愿的产生,我们再次对电路进行了检查,原来是电路中部分焊点的连线接触不良,导致波形不能产生,于是我们重新对那些焊点重新焊接加以固定。并在连接示波器的时候对于线的连接也进行了一番细致的检查。最后能产生稳定的方波。
4.3 测试结果分析
全部调试结果出来,首先上电,7279显示器上默认显示“good050”,而在示波器上显示出来的也是50%的方波。接着按下“设置/确认” 键后,由于“good”占了5个数码管故显示器上第6个数码管开始闪烁,即提示可以修改此数值。接下来按键数值只能选择“0”,因为占空比数值范围为“0%—99%”百位上不会有数值出现,若选择了“1-9”的任意数值,则会继续闪烁直到你选择0才会变为第七个数码管闪烁选好“0”接下来第七个数码管闪烁,选择“0-9”的任意数值,选好之后第八个数码管闪烁,也选择“0-9”的任意数值。选择好之后,再次按下“设置/确认”键后,修改完成。例如你想输出PWM占空比为45%的方波,你要依次输入“0”、“4”、“5”三个数值,示波器上就会显示出来,满足我们所想要的实验效果。
结论
单片机这门课程需要硬件和软件两方面的能力,在硬件方面,需要对各类芯片管脚以及不同的器件的性质十分的熟悉,懂得器件之间如何搭配,使得电路效率最大化,价格最优化。此外硬件还需要过硬的焊接技术和排版能力,这个是保证电路不出错误的基本要素。在软件方面,需要较强的思维逻辑性,对于一个设计要求,在程序设计时要有连贯性,能够巧妙的用较简洁的程序来解决问题,这个需要平时多加的训练以提高编程能力。不管怎样硬件与软件都是十分重要的,只有两方面都重视,才能在单片机领域上有所前进,为以后自己的工作学习带来便捷。
虽然三周的课设时间说长不长说短不短,但是却是让人收获颇多的,首先在选题时,觉得这个题目既熟悉又陌生,熟悉的是用到了书本上用到的芯片,陌生的是不懂得如何编程来达到所需的要求。但是凭借着一股谦虚好学的劲头,问同学问老师,自己再回去钻研看书本,终于在编程上有多突破,自己也品尝到了些许成功的喜悦。但是不能放松心态,因为真正的实验调试结果还没有出来,需要我们理论到实验的过程了。在焊接时就遇到问题,常常因为自己焊接技术的不熟练会犯焊错、虚焊的错误。但是自己定下心来,在多次失败之后逐渐掌握了焊接的技巧,于是接下来很顺利的完成了实验版的制作。
总之不管怎么样,这次课程设计是对我们专业课程学习的一种检验,更是一种激励,它在一定程度上表明了光学书本上的知识是远远达不到真正掌握单片机的程度的,只有不断的自我学习,请教他人,吸取别人的优秀经验,自己敢于创新,才能在单片机领域中立于不败之地,这对于我们即将毕业的大三学子有着巨大的启示和鞭策。
参考文献
[1] 江世明和黄同成编著的《单片机原理及应用》.出版社,2010
[2] 赖麒文 8051单片机C语言开发环境实务与设计.出版社,2002
[3] 杨欣 51单片机应用从零开始清华大学出版社,2008
[4] 唐继贤 51单片机工程应用实例北京航天航空大学出版社 ,2009
[5] 冯文旭 单片机原理及应用 机械工业出版社,2008
[6] 苏家健、曹柏荣、汪志锋 单片机原理及应用技术 高等教育出版社,2004
[7] 李朝青 单片机原理与接口技术 北京航空航天大学出版社出版,2008
[8] 蔡明文、冯先成. 单片机课程设计. 武汉:华中科技大学出版社 , 2007
[9] 房小翠、王金凤. 单片机实用系统设计技术.北京:国防工业出版社,1996
附录A
芯片引脚图:
AT89C51单片机:
可编程的8253定时/计数器:
HD7279:
74LS373:
附录B
系统设计程序代码如下:
ORG 0000H
LJMP MAIN
MAIN:MOV SP,#67H
ACALL INIT_7279 ;7279初始化
L1:ACALL PWM_DEAL ;PWM的占空比数据处理
ACALL PWM_OUT ;PWM输出
ACALL DIS_DEAL ;显示处理
L2:ACALL DISPLAY ;7279显示子程序
ACALL KEY
CJNE A,#0FFH,L4 ;判断有无键按下
LJMP L2
L4:CJNE A,#0AH,L2 ;判断是否按下设置键
ACALL TV4
SJMP L1
;PWM的占空比数据处理
PWM_DEAL:MOV R7,#02H
MOV R0,#4AH
MOV A,@R0
L6:MOV B,#0AH
MUL AB ;十进制占空比转化为二进制
DEC R0
ADD A,@R0
DJNZ R7,L6
MOV B,#25H
MUL AB
MOV 50H,A
MOV A,B
MOV 51H,A
RET
;PWM的输出
PWM_OUT:MOV DPTR,#0DFFFH
MOV A,#74H ;计数器1,方式2,二进制计数
MOVX @DPTR,A
MOV DPTR,#0DFFDH;
MOV A,#74H ;OUT1 输出 500HZ的方波,计数器1的初值为0E74H
MOVX @DPTR,A
MOV A,#0EH
MOVX @DPTR,A
MOV DPTR,#0DFFFH
MOV A,#32H ;计数器0,方式1,二进制计数
MOVX @DPTR,A
MOV DPTR,#0DFFCH
MOV A,50H ;OUT0 输出脉宽可调的频率为500HZ的脉冲,计数器0的初值为键入值,存在50H,51H单元里
MOVX @DPTR,A
MOV A,51H
MOVX @DPTR,A
RET
;初始化显示处理
DIS_DEAL:MOV 40H,#09H ;上电后,前五个数码管显示"good"
MOV 41H,#10H
MOV 42H,#10H
MOV 43H,#11H
MOV 44H,#0BH
MOV 45H,4AH ;最后三个数码管所显示的占空比值存于48H-4AH单元中
MOV 46H,49H
MOV 47H,48H
RET
;修改后显示处理
DIS_DEAL1:MOV 40H,#0CH ;按下确认键后,前五个数码管显示"nice"
MOV 41H,#0DH
MOV 42H,#0EH
MOV 43H,#0fH
MOV 44H,#0BH
MOV 45H,4AH ;最后三个数码管所显示的占空比值存于48H-4AH单元中
MOV 46H,49H
MOV 47H,48H
RET
;键入占空比
TV4:MOV B,A
CLR P1.0
MOV A,#88H ;7279闪烁指令
ACALL STFS
MOV A,#0FBH ;第六个数码管闪烁
ACALL STFS
SETB P1.0
MOV A,B
ACALL DIS_DEAL1 ;显示结果处理
ACALL DISPLAY ;7279显示子程序
ACALL KEY ;键入第一个值
CJNE A,#01H,M1 ;与1比较,不能大于等于1
M1:JC M2
LJMP TV4
M2:MOV 4AH,A ;将第一个值存于4AH单元中
MOV B,A
CLR P1.0
MOV A,#88H
ACALL STFS
MOV A,#0FDH ;第七个数码管闪烁
ACALL STFS
SETB P1.0
MOV A,B
L12:ACALL DIS_DEAL1 ;显示结果处理
ACALL DISPLAY ;7279显示子程序
ACALL KEY ;键入第二个值
CJNE A,#0AH,L11 ;与10比较,不能大于等于10
L11:JNC L12
MOV 49H,A ;将第二个值存于49H单元中
MOV B,A
CLR P1.0
MOV A,#88H
ACALL STFS
MOV A,#0FEH ;第八个数码管闪烁
ACALL STFS
SETB P1.0
MOV A,B
L13:ACALL DIS_DEAL1
ACALL DISPLAY
ACALL KEY ;键入第三个值
CJNE A,#0AH,L14 ;与10比较,不能大于等于10
L14:JNC L13
MOV 48H,A ;将第三个值存于48H单元中
L15:ACALL DIS_DEAL1
ACALL DISPLAY
ACALL KEY
CJNE A,#0AH,L16 ;判断确认键是否按下
MOV B,A
CLR P1.0
MOV A,#88H
ACALL STFS
MOV A,#0FFH ;取消闪烁
ACALL STFS
SETB P1.0
MOV A,B
ACALL DIS_DEAL1 ;修改后的最终结果显示处理
ACALL DISPLAY ;7279显示最终结果
SJMP L18
L16:SJMP L15
L18:RET
;显示部分
DISPLAY:MOV R5,#08H ;显示子程序,显示8个字符,显缓区40H-47H
MOV R0,#40H ;显缓区首址
MOV R1,#97H ;命令字控制显示的数码管
DL1:CLR P1.0
MOV R6,#0CH
DL2:DJNZ R6,DL2
MOV A,R1 ;发送命令字
ACALL STFS;
MOV R6,#06H
DL3:DJNZ R6,DL3 ;延时
MOV A,@R0
ADD A,#0DH
MOVC A,@A+PC ;查表
ACALL STFS ;发送显示内容
MOV R6,#02H
DL4:DJNZ R6,DL4 ;延时
SETB P1.0
INC R0
DEC R1
DJNZ R5,DL1 ; 循环次数
RET
TAB: DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H,7FH
DB 7BH,00H,01H,76h,30h,4Eh,6Fh,1Dh,3Dh ;字型码
;发送一字节
STFS:MOV R7,#08H ;与7279串行发送子程序
SL1:RLC A
MOV P1.2,C
SETB P1.1
MOV R6,#02H
SL2: DJNZ R6,SL2
CLR P1.1
MOV R6,#02H
SL3: DJNZ R6,SL3
DJNZ R7,SL1
RET
;键扫
KEY:ACALL KEY1
CJNE A,#0FFH,KL1
CLR 00H
RET
KL1:JB 00H,KL2
SETB 00H
ACALL KEY2
RET
KL2:MOV A,#0FFH
RET
KEY1:CLR P1.0 ;读键值子程序
MOV R6,#0CH
L01:DJNZ R6,L01
MOV A,#15H
ACALL STFS
MOV R6,#06H
L02:DJNZ R6,L02
ACALL STJS
SETB P1.0
RET
STJS:MOV R7,#08H ;与7279串行接收子程序
L21:SETB P1.1
SETB P1.2
MOV R6,#02H
L22:DJNZ R6,L22
MOV C,P1.2
RLC A
CLR P1.1
MOV R6,#02H
L23:DJNZ R6,L23
DJNZ R7,L21
RET
KEY2:MOV B,A
MOV R2,#00H
MOV R7,#0FH
L31:MOV A,R2
ADD A,#0AH
MOVC A,@A+PC
CJNE A,B,L32
SJMP L33
L32:INC R2
DJNZ R7,L31
L33:MOV A,R2
RET
TAB0: DB 1CH,1DH,1EH,1FH,14H ;7279键值表
DB 15H,16H,17H,0CH,0DH
DB 0EH,0FH,04H,05H,06H
DB 07H
;7279初始化
INIT_7279:CLR P1.0 ;7279初始化
MOV R6,#0CH
NL0:DJNZ R6,NL0
MOV A,#0A4H
ACALL STFS
MOV R6,#02H
NL1:DJNZ R6,NL1
SETB P1.0
MOV 4AH,#00H ;上电后,数码管显示初始值050,即占空比50%
MOV 49H,#05H
MOV 48H,#00H
RET
END