1、广 州 民 航 职 业 技 术 学 院毕 业 论 文基于单片机与 PWM 技术的可调灯光系统作 者 姓 名学 科 专 业指 导 教 师所 在 学 院论 文 提 交 日 期分类号: 学校代号:学 号 : 秘密 五年 广州民航职业技术学院毕业论文基于单片机与 PWM 技术的可调灯光系统作者姓名: 指导教师姓名、职称:申请学位级别: 学科专业名称:研究方向:论文提交日期: 年 月 日 论文答辩日期: 年 月 日学位授予单位: 学位授予日期: 年 月 日答辩委员会成员:主席: 委员: 广州民航职业技术学院学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了
2、文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名: 日期: 年 月 日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:本人在校攻读学位期间论文工作的知识产权单位属广州民航职业技术学院。学校有权保存并向国家有关部门或机构送交论文的复印件和电子版,允许学位论文被查阅(除在保密期内的保密论文外);学校可以公布学位论文的全部或部分内容,可以允许采用影印、缩印或其它复制手段保存、汇编学位论文。本人电子文档的内容和纸质论文
3、的内容相一致。本学位论文属于:保密,在 年解密后适用本授权书。不保密。学位论文全文电子版提交后:同意在校园网上发布,供校内师生和与学校有共享协议的单位浏览。(请在以上相应方框内打“”)作者签名: 日期:指导教师签名: 日期:目录第一章 系统总体设计 .1第一节 概述 1第二节 功能设计 1第三节 功能实现 2第二章 硬件电路分析 .4第三章 软件系统设计 .5第一节 程序流程图 5第二节 程序源代码 6第四章 系统调试 .13第一节 单元及系统测试 13第二节 易用性测试及参数整定 15毕业设计体会 .16参考文献 .171基于单片机与 PWM 技术的可调灯光系统第一章 系统总体设计第一节 概
4、述PWM(Pulse Width Modulation) ,即脉冲宽度调制,简称脉宽调制,是一种对模拟信号电平进行数字编码的方法。PWM 技术通过使用较高的调制频率,对方波的占空比实行调制,从而实现对一个模拟信号的电平进行编码。其最大的优点是从处理器到被控对象之间的所有信号都是数字形式的,无需再进行数模转换过程,而且对噪声的抗干扰能力也大大增强。因此 PWM 在通讯等信号传输行业得到广泛应用。本毕业设计作品是一个基于单片机与 PWM 技术的可调灯光系统。即通过单片机以 PWM 方法控制实现 LED 无级调光,同时具有良好的交互设计方便用户设定亮度级别,硬件部分基于学院单片机实验平台。第二节 功
5、能设计本系统在实验平台上利用 6 个按钮实现亮度输入及开关灯功能,4 个数码管用于亮度级别显示和开关灯提示,通过单片机 I/O 口输出调制脉冲控制 LED 亮度。各器件在实验箱上的布局及其功能如下图所示:图 1 系统布局及其功能操作时,用户通过“开/关”按钮开关 LED,不论灯处于亮灭时都可以用其2它的调节按钮调节亮度值,按放“亮度+(亮度-) ”按钮可以加 1 级(减 1 级)亮度,长按则会重复加(减)亮度。当前亮度级别及开关灯情况将显示在数码管组,亮度值有三位,以十进制数显示,从“001”到“999”共 999 级亮度,开关灯标志位以“P”表示开灯(意为 Processing) , “H”
6、表示关灯(意为 Halting) 。例如,数码管显示“P520”即当前亮度设定 520 级,开灯,若显示“ H886”即当前亮度设定 886级,关灯。图 2 数码管显示方式示例按放“低亮” 、 “中亮”或“高亮”可设定为预设的亮度, “低亮”为 250 级,“中亮”为 500 级, “高亮”为“750”级。在三个预设亮度的跳转下,再配合“亮度+/-”按钮的延迟重复功能,用户可以很方便地设定所要的亮度。在功能上我以下面三个标准来设计:1、提供足够多的 PWM 亮度级别,并使系统有足够的调节精度 ;2、按钮功能应使用户感到方便易用;3、数码管应能以易于理解的方式向用户反馈所需的信息。当前功能基本能
7、体现设计标准。第三节 功能实现PWM 输出利用 I/O 口直接输出到 LED,由于 LED 功率不大,AT89S51 单片机端口的负载能力满足要求,可以直接驱动。而 PWM 脉波的产生使用定时器中断控制,使两个定时期 T0、T1 均工作于方式 1,T0 中断产生 PWM 基波,T1 中断控制占空比,简要分析定时器与 PWM 脉波时序如下:图 3 PWM 输出的简单时序分析分析可知,T0 中断T0 重载定时常数,复位输出,并使 T1 也重载常数,启动 T1T1 中断时,置位输出,停止 T1T0 中断,如此循环。使用中断方式能获得准确的定时周期以保证 PWM 的调制精度, T0 作为 PWM 基波
8、,为避免闪烁,应达到较高频率,本系统取 500Hz。T1 要有效地控制占空比,其定时周期应比 T0 小,通过调节 T1 的定时周期就能调节 PWM 输出脉波的占空比,从而改变亮度等级,其对应关系如图 3 所示:3图 4 定时常数、占空比、亮度等级的对应关系按钮输入采用查询方式实现,并对按键进行防抖动处理,对“亮度+/-”按钮加入延时重复功能。延时重复功能通过对一延时变量在按下按钮时进行减计数,在减至触发值前按钮弹起则视为短按,执行相关代码 1 次,当减至触发值后仍保持按下,则快速执行代码,起到重复按下的效果。图 5 延时重复功能原理数码管输出的亮度级数需要经过一系列的编码转换,按钮控制亮度调节
9、变量,调节变量变换成相应的 BCD 码放入数码管输出缓冲区,调节变量也变换成相应的 T1 定时常数以备加载。数码管采用 74LS164 锁存驱动,单片机通过串行口输出显示码到 4 片 74LS164,显示码通过查表算法实现。4第二章 硬件电路分析本系统基于学院单片机实验平台实现,无需专门作硬件设计,在此分析系统涉及的实验箱模块的电路原理图,以便了解编程细节。图 6 单片机 PWM 调光系统原理图各元件规格如下:单片机型号为 AT89S51,晶振 6MHz;输入按钮 K1K6 分别接至 P2.0P2.5,按下时输入低电平;4 数码管使用共阴接法;端口 P1.2 接受控 LED。5第三章 软件系统
10、设计第一节 程序流程图主程序流程图如下:开始初始化键扫描有无键按下?T1 定时值计算程序显示 BCD 码计算程序显示程序亮度值加 1K1?亮度值减 1K2?低亮 250 级K3?中亮 500 级K4?高亮 750 级K5?开/关灯K6?YesNoYesYesYesYesYesNoNoNoNoNoYesNo图 7 主程序流程图程序初始化时设定定时器工作方式,赋定时初值,并对一系列配置变量进行初始化;按键扫描程序实现对亮度调节变量及开关灯变量的修改,其中,亮度调节变量将通过定时值计算程序计算出 T1 的定时值,通过显示 BCD 码计算程序计算出显示缓冲区的显示码。显示程序将显示缓冲区的内容输出到数
11、码管显示。按键检测采用扫描方式,并有防抖动和延时重复功能。定时期 T0、T1 工作于方式 1,以中断方式输出 PWM 脉波。定时期中断服务程序流程图:6重载 T0 定时值T0 中断服务子程序关灯?设定 T1 定时值启动 T1关灯返回返回关闭 T1开灯NoYesT1 中断服务子程序图 8 定时器中断服务程序流程图通过 T0 中断产生 PWM 基波,T1 中断调节占空比,从而实现 PWM。第二节 程序源代码DIRLOP EQU 38H ;显示字节数T2H EQU 59H ;T1 高 8 位定时值存储器T2D EQU 5AH ;T1 低 8 位定时值存储器LAMP EQU P1.2 ;电灯控制位NU
12、MCH EQU 40H ;亮度调节变量,高位NUMCL EQU 41H ;亮度调节变量,低位TEMPC1 EQU 42H ;临时变量,用于 BCD 转换子程序TEMPC2 EQU 43H ;临时变量,用于 BCD 转换子程序TEMPC3 EQU 44H ;临时变量,用于 BCD 转换子程序SWITCH0 EQU 45H ;电灯开关KEYD EQU 46H ;按键重复延时变量NOTEB EQU 3CH ;数码管电灯开关标志DIGI000 EQU 3DH ;数码管百位 BCDDIGI00 EQU 3EH ;数码管十位 BCDDIGI0 EQU 3FH ;数码管个位 BCD7ORG 0000HAJM
13、P STARTORG 000BHLJMP TIME1 ;T0 中断程序(产生 PWM 基频)ORG 001BHLJMP TIME2 ;T1 中断程序(控制脉冲宽度)ORG 0030HSTART: SETB LAMP ;程序初始化MOV A,#0MOV SWITCH0,AMOV TMOD,#11H ;设定两定时器为 16 位定时器MOV IE,#10001010B ;开启两定时器的中断请求MOV TH0,#0FCH ;设定 PWM 基频(500Hz)MOV TL0,#18HMOV T2H,#0FEHMOV T2D,#89HMOV NOTEB,#10H ;数码管千位开灯显“P“关灯显“H“SETB
14、 TR0 ;启动计数器 T0MAIN: ACALL KEY ;调用键扫描子程序ACALL CHANGET ;时间常数计算子程序ACALL NUM2BCD ;BCD 码转换子程序ACALL DISP ;数码管显示子程序ACALL DLYK ;调动 20ms 延时程序NOPNOPSJMP MAINKEY: MOV P2,#0FFH ;向 P2 口写“1“,准备读取数据NOPNOPKEY1: JNB P2.0,K1 ;按键扫描JNB P2.1,K2JNB P2.2,K3JNB P2.3,K4JNB P2.4,K5JNB P2.5,K6MOV KEYD,#15 ;按键延时重复变量初始化BACK: RE
15、T8K1: ACALL DLYK ;按键去抖动JB P2.0,BACKJ1: ACALL KEY_SW ;调用延时重复子程序ACALL CHECKMAX ;调用最大值限制子程序MOV A,NUMCLADD A,#1 ;调节值加 1MOV NUMCL,AJC HPLUS ;进位处理SJMP BACKHPLUS: ;处理进位INC NUMCHSJMP BACKK2: ACALL DLYKJB P2.1,BACKJ2: ACALL KEY_SWACALL CHECKMINMOV A,NUMCLCLR CYSUBB A,#1 ;调节值减 1MOV NUMCL,AJC HMINUS ;借位处理SJMP
16、BACKHMINUS: ;处理借位DEC NUMCHSJMP BACKK3: ACALL DLYKJB P2.2,BACKJ3: JNB P2.2,J3MOV NUMCH,#00H ;亮度预设,低亮 250 级MOV NUMCL,#0FAHSJMP BACKK4: ACALL DLYKJB P2.3,BACKJ4: JNB P2.3,J4MOV NUMCH,#01H ;亮度预设,中亮 500 级MOV NUMCL,#0F4HSJMP BACKK5: ACALL DLYK9JB P2.4,BACKJ5: JNB P2.4,J5MOV NUMCH,#02H ;亮度预设,高亮 750 级MOV NU
17、MCL,#0EEHSJMP BACKK6: ACALL DLYKJB P2.5,BACKJ6: JNB P2.5,J6MOV A,SWITCH0CPL A ;电灯亮灭控制MOV SWITCH0,ACJNE A,#0,NEXT_J6MOV NOTEB,#10H ;电灯亮数码管显示SJMP BACKNEXT_J6:MOV NOTEB,#11H ;电灯灭数码管显示SJMP BACKCHECKMAX: ;最大调节值限制子程序MOV A,NUMCHCJNE A,#03H,OUT1 ;最大调节值为 3E7H=999MOV A,NUMCLCJNE A,#0E7H,OUT1DEC NUMCLOUT1: RET
18、CHECKMIN: ;最小调节值限制子程序MOV A,NUMCHCJNE A,#0,OUT2MOV A,NUMCL ;最小调节值为 1CJNE A,#1,OUT2INC NUMCLOUT2: RETKEY_SW: MOV A,KEYD ;延时重复子程序CJNE A,#0,KEYSW_NTRETKEYSW_NT:ACALL DLYKDJNZ KEYD,KEYSW_NTRETCHANGET: ;将调节值转换为定时常数10MOV A,NUMCHCPL AMOV T2H,AMOV A,NUMCLCPL AMOV T2D,ARETDLYK: MOV R4,#4AH ;20ms 定时子程序DLYK1: M
19、OV R5,#62HDLYK2: DJNZ R5,DLYK2DJNZ R4,DLYK1RET TIME1: MOV TH0,#0FCH ;定时中断 0MOV TL0,#18HPUSH ACCPUSH PSWMOV A,SWITCH0CJNE A,#0,OUT_T1 ;开关变量判断CLR LAMP ;开灯MOV TH1,T2H ;输入 T2 定时值控制脉冲宽度MOV TL1,T2DSETB TR1 ;启动定时器 1OUT_T1: POP PSW POP ACCRETITIME2: SETB LAMP ;关掉电灯CLR TR1 ;关闭定时器 1RETINUM2BCD: ;将调节值转换为对应的 BC
20、D 码BCDL: MOV A,NUMCL ;低位处理MOV B,#100DIV ABMOV DIGI000,AMOV B,#100MUL ABMOV TEMPC1,AMOV A,NUMCLCLR CYSUBB A,TEMPC111MOV TEMPC2,AMOV B,#10DIV ABMOV DIGI00,AMOV B,#10MUL ABMOV TEMPC1,AMOV A,TEMPC2CLR CYSUBB A,TEMPC1MOV DIGI0,AMOV A,DIGI00SWAP AADD A,DIGI0MOV TEMPC1,ABCDH0: MOV A,NUMCH ;高位处理CJNE A,#0,BC
21、DH1RETBCDH1: CJNE A,#1,BCDH2MOV TEMPC3,#56HACALL BCDHMOV A,DIGI000ADD A,#2MOV DIGI000,ARETBCDH2: CJNE A,#2,BCDH3MOV TEMPC3,#12HACALL BCDHMOV A,DIGI000ADD A,#5MOV DIGI000,ARETBCDH3: MOV TEMPC3,#68HACALL BCDHMOV A,DIGI000ADD A,#7MOV DIGI000,ARETBCDH: MOV A,TEMPC112ADD A,TEMPC3DA AMOV TEMPC1,AMOV A,#0A
22、DDC A,DIGI000MOV DIGI000,AMOV A,TEMPC1ANL A,#0F0HSWAP AMOV DIGI00,AMOV A,TEMPC1ANL A,#0FHMOV DIGI0,ARETDISP: MOV DIRLOP,#4 ;串行显示程序(4 位数码管)MOV R0,#3CH ;3CH 到 3FH 是显示缓冲区DL0: MOV A,R0MOV DPTR,#TABMOVC A,A+DPTR ;查得相应的七段代码MOV SBUF,A ;串行发送DL1: JNB TI,DL1CLR TIINC R0DJNZ DIRLOP,DL0RET;共阴七段数码管代码表TAB: DB 0FC
23、H,60H,0DAH,0F2H,66H,0B6H DB 0BEH,0E0H,0FEH,0E6H,0EEH,03EH,9CHDB 7AH,9EH,8EH,0CEH,06EHEND13第四章 系统调试第一节 单元及系统测试为确保程序按预期结果运行,对系统进行一系列功能测试,同时为减少相互影响,便于找出问题所在,先进行某个功能的测试。按钮是为系统提供输入条件的模块,按钮必须保证稳定可靠地工作,单元测试先测试按钮功能,再利用按钮输入来做子程序测试。表格 1 按钮功能测试测试对象 测试方法 预期结果 实测结果 结果分析按放 1 次 亮度+1 亮度+1快速重复按放亮度慢速重复递增亮度慢速重复递增亮度+长按
24、 亮度快速重复递增亮度快速重复递增按放 1 次 亮度-1 亮度-1快速重复按放亮度慢速重复递减亮度慢速重复递减亮度-长按 亮度快速重复递减亮度快速重复递减按钮防抖及延时重复功能正常按钮老化令按放操作时有不灵敏数码管显示正常亮度在调节幅度大时变化明显按放 弹起时作用亮度设 250弹起时作用亮度设 250低亮长按 弹起时作用亮度设 250弹起时作用亮度设 250按放 弹起时作用亮度设 500弹起时作用亮度设 500中亮长按 弹起时作用亮度设 500弹起时作用亮度设 500按放 弹起时作用亮度设 750弹起时作用亮度设 750高亮长按 弹起时作用亮度设 750弹起时作用亮度设 750按钮防抖功能正常
25、偶有不灵敏操作现象数码管显示正常亮度变化明显按放 弹起时作用开关灯切换弹起时作用开关灯切换开/关灯长按 弹起时作用开关灯切换弹起时作用开关灯切换按钮防抖功能正常时有不灵敏操作现象数码管显示正常LED 灯受控开关从测试结果来看,按钮实现了设计的功能,通过按钮可以有效操作调光系统。按钮的防抖设计避免了开关抖动,但由于部分按钮在实验室频繁按放已出现老化,这影响了部分按钮的灵敏度。14完成按钮测试后,利用特定输入控制进行子程序测试,测试下列 5 个关键的子程序/代码段:表格 2 子程序/代码段功能测试测试对象 测试过程 结果及其分析亮度+代码段(含进位处理,最大值限定子程序)I.亮度值=511(对应内
26、部变量 1FFH),按 亮度+,测试进位,亮度值可能是:=512(正确进位,=200H),=256(进位出错,=100H)II.亮度值=999( 对应内部变量 3E7H),按亮度+,测试最值限定,亮度值可能是:=999(有效限定最大值,=3E7H) ,= 其它(限定出错)经反复修改调试后I.亮度值=512II.亮度值=999实现设计的代码功能亮度-代码段(含借位处理,最小值限定子程序)I.亮度值=256(对应内部变量 100H),按亮度-,测试借位,亮度值可能是:=255(正确进位,=0FFH),=511( 进位出错,=1FFH)II.亮度值=001( 对应内部变量 1H),按亮度-,测试最值
27、限定,亮度值可能是:=001(有效限定最小值,=1H),=其它(限定出错)经反复修改调试后I.亮度值=255II.亮度值=001实现设计的代码功能二进制到BCD 码转换子程序观察亮度值全范围是否为十进制数;在 Keil 软件中用调试工具观察转换是否正确。经反复修改调试后实现设计的代码功能开关灯标志显示功能代码段按开/关灯 时,观察开 /关灯标志是否正确显示:开灯是显示“P” ,关灯时显示“H” ;在 Keil 软件中用调试工具观察相关变量作用:开关标志(45H) ,开关显示标志( 3CH) 。实现设计的代码功能定时值计算子程序观察亮度调节时的 LED 明暗变化在 Keil 软件中用调试工具观察
28、转换是否正确。 实现设计的代码功能完成子程序/代码段测试后,进行系统测试,测试方法是反复改变控制输入,观察各独立功能是否正常。测试在特定亮度值(涉及进位借位的,或极值)增减,观察亮度变化和显示是否正常,同时进行开关灯控制,反复调试以验证系统可靠性。特定的亮度值如下表:表格 3 系统测试特定的亮度值调节变量进借位 256、512、768BCD 转换进借位 100、200、256、300、400、500、512、600、700、768、800、900极值 001、999经过反复修改调试,系统最终完全通过上述测试,证明系统的功能设计已经全部实现,并能可靠使用。15第二节 易用性测试及参数整定工业设计
29、应充分考虑人机交互,即控制方式的选择应该符合人的使用习惯,同时让机器的信息反馈易于理解。本调光系统基于学院单片机实验平台,无法更改硬件,但在功能布局及操作细节和显示反馈上可以优化设计改进用户体验。本调光系统的按键功能定义如下:图 9 控制按钮功能定义在调光设置上,用户希望能以简单快捷的操作设定到所需的亮度值,使用三个亮度预设即可立即设为常用的高亮、中亮或低亮,在此基础上,最多只需调节 125250 个亮度即可设定所需度值,配合亮度+/-的延时重复功能,既能以点按精确增减,又能以长按快速调节,按钮的布局也充分考虑用户的逻辑习惯。通过 开/ 关 按钮开关 LED 灯时,数码管上的开 /关灯标志位会
30、在亮灯“P” ,灭灯“H”之间切换,让用户清晰易辩。易用性测试通过测试用户使用调光系统的操作复杂性,以此来分析改进系统功能的易用性。表格 4 用户易用性测试用户行为 最佳操作步骤 复杂性 耗时当前亮度 264设定亮度 354长按亮度+,加至 340 多时,换点按亮度+加至 3541 次长按515 次点按712 秒当前亮度 352设定亮度 732按高亮 设 750,长按 亮度-至 740 左右时,点按亮度-至 7321 次长按515 次点按613 秒当前亮度 001设定亮度 999按高亮 设 750,长按 亮度+至 999 1 次长按1 次点按1214 秒由测试分析可知,用户只需使用 12 个按
31、钮即较快设定到所需的参数。反复调试修改后,系统功能的易用性是优化设计的。反复调试的目的是发现并修补软件错误并优化软件性能,其中部分参数的整定就是调试的重要内容,这些参数及其最终修正值如下:表格 5 参数整定变量 整定值延时子程序参数 R4=4AH ,R5=62H延时重复变量 KEYD=15预设低亮 250预设中亮 50016预设高亮 75017毕业设计体会此次毕业设计综合运用了单片机课程所学知识设计单片机简单系统的软硬件,尽管 PWM 调光系统只做软件设计,但要做好软件设计就必须充分了解硬件细节,这在汇编编程调试中更深有体会。虽然是简单系统的设计,但我也了解到了开发流程,系统的功能规划、逐步整
32、合完善功能的开发方法。犹其是编程调试的技巧,采用结构化,单元化的代码结构,可以简单修改来配置相应功能,这样对于调试某个子程序或代码段而言是十分方便的,高质量的代码也确实需要反复调试修改来改进得到。汇编编程应当格式规范,因为读代码很多时候比写代码还难,犹其在程序多重嵌套和跳转的情况下,规范书写包括运用缩进,变量起有意义的别名,也注意标号的命名。而且汇编指令的作用细节也是需要掌握的,如本次系统编程时对 INC 指令的了解不足(INC 不影响 CY 位) ,曾困扰一时。备有资料以便查阅能有效提高工作效率,一些不常用的规格标准往往需要查找相关资料才知道。对于软件,其帮助文档是优秀的参考资料,毕业设计期
33、间常用 Keil 软件的调试功能,各调试工具的用法在其帮助文档有详细的说明。仿真调试是个很有用的调试手段,虽不能做实时分析,但可以很方便地自建环境独立测试一段代码,单步运行及设置断点、查看内存数据等工具对于了解运行细节,犹其是检测出错时很有帮助。毕业设计是一次难得的动手锻炼机会,设计课题也有很高的自由度,做系统开发的过程很享受,因为“设计”是一种自我实现,而且在开发过程中我有充分考虑用户对系统的需求,力求使功能设计符合易用原则,给用户带来较好的使用体验,这也是当今工业设计的潮流。18参考文献1 吴宁. 80X86/Pentium 微型计算机原理及应用M. 北京:电子工业出版社,2004:1-249.2 蔡美琴. MCS-51 系列单片机系统及其应用M.北京:高等教育出版社,2003:1-169.3 肖金球.单片机原理与接口技术M. 北京: 清华大学出版社, 2004:1-323