编号4 单位代码
学 号 分 类 号 密 级
课程设计
彩灯控制器的设计
院(系)名称 工学院机械系
专业名称 机械设计制造及其自动化 学生姓名 指导教师
朱煜钰
2014 年 11 月 15日
黄河科技学院课程设计任务书
工 学院 机械 系 机械设计制造及其自动化 专业 11 级 3 班 学号 15 姓名 指导教师 朱煜钰
题目: 彩灯控制器的设计 课程: 单片机应用技术课程设计 课程设计时间 2014年 10月27 日 至2014年11 月 10 日 共 2 周 课程设计工作内容与基本要求(设计要求、设计任务、工作计划、所需相关资料)(纸张不够可加页) 1.设计要求
利用AT89C51单片机作为微控制器,用16盏以上的LED小灯,实现至少4种彩灯灯光效果(不含全部点亮,全部熄灭);可以用输入按钮在几种灯光效果间切换;可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果。 2. 设计任务与要求 2.1系统硬件电路设计
根据该系统设计的功能要求选择所用元器件,设计硬件电路。要求用Proteus绘制整个系统电路原理图。 2.2软件设计
根据该系统要求的功能进行软件设计,绘制整个系统的软件流程图;根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求逐条加以注释。 2.3 Proteus仿真
用Proteus对系统软硬件进行仿真调试并通过。 2.4 编写设计说明书
内容包括任务书、设计方案分析、硬件部分设计、软件部分设计、调试结
黄河科技学院
果整理分析、设计调试的心得体会等,字数不少于5000字;硬件部分设计要绘制整个系统电路原理图,对各部分电路设计原理做出说明;软件设计部分要(用visio2003画图软件)绘制整个系统框图及各部分的软件流程图,列出程序清单,逐条加以注释,并注明各程序功能块的功能。 3.工作计划
序号 1 3 4 4.主要参考资料 单片机课程设计指导书 8051单片机实践与应用 单片机原理及应用 2007.7 „
指导老师签字: 日 期:
皮大能 北京理工大学出版社 2012.7 吴金戎 清华大学出版社
2003.8
设计内容 布置任务及调研 制作与调试 撰写设计报告书 合 计 所用时间 4天 8天 2天 14天 单片机技术基础教程与实践 夏路易 电子工业出版社 2008.1
张毅刚 高等教育出版社 2012.11
基于Proteus的单片机系统设计与仿真实例 蒋辉平 机械工业出版社
黄河科技学院 摘 要
单片微型计算机简称单片机,又称为微控制器(MCU),它的出现是计算机发展史上的一个重要里程碑,它以体积小、功能全、性价比高等诸多优点而独具特色。随着社会的发展、科技的进步,各种方便于生活的自动控制系统开始进入了人们的生活,以单片机为核心的控制系统就是其中之一。
本论文着重阐述了LED彩灯控制器的设计方法,以AT89C51单片机作为主控核心,按键、数码管等较少的辅助硬件电路相结合,采用模块设计,利用软件实现对LED彩灯进行控制。本系统具有体积小、硬件少、电路结构简单、软件功能完善,控制系统可靠,性价比较高等优点。
论文主要论述了基于单片机的LED彩灯控制器的设计过程。主要工作如下:重点论证了系统方案的选择及其实现方法;全文详细论述了系统的软、硬件电路,其中硬件部分重点介绍了单片机的基本结构和各引脚以及晶振电路、复位电路的工作原理,软件部分重点叙述主程序和子程序的C语言实现;硬件、软件电路调试过程;所有源程序均采用C语言编译,并在Keil uVision2软件里编译、调试;在Proteus环境下实现软、硬件电路仿真。实验结果证明了设计方案的正确性与可行性,以此为理论基础,对我们设计彩灯电路具有很强的使用和参考价值。
关键词:LED彩灯;AT89C51单片机;彩灯控制器;模块设计
黄河科技学院
目录
1 基本内容和技术方案 .................................................... 1 2 系统硬件设计 ......................................................... 1
2.1 主控模块电路设计 ................................................ 2 2.2 受控模块电路设计 ................................................ 2 2.3 主要元器件介绍 .................................................. 3
2.3.1 单片机AT89C51 ............................................ 3 2.3.2 LED彩灯限流电阻的确定 .................................... 6 2.3.3 数码管结构及工作原理 ...................................... 6
3 系统软件设计 .......................................................... 8
3.1 综述 ............................................................ 8 3.2 主程序与中断程序 ................................................ 9
3.2.1 主程序及流程图 ............................................ 9 3.2.2 中断程序及流程图 ......................................... 11 3.3 子程序的编程思路 ............................................... 12
3.3.1 频率增减按钮查询子程序 ................................... 12 3.3.2 延迟子程序 ............................................... 12 3.3.4 数码管显示子程序 ......................................... 12 3.3.3 计数初值的设定 ........................................... 12 4.1 硬件选材及电路制作 ............................................. 13 4.2 硬件调试 ....................................................... 13 4.3 软件调试 ....................................................... 14
4.3.1 单片机C语言 ............................................. 14 4.3.2 Keil uVision2 ............................................ 14
黄河科技学院
4.4.3 Proteus .................................................. 15 4.4 软件仿真结果及分析 ............................................. 15 5 结束语 ............................................................... 18 参考文献 ............................................................... 19 附 录 .................................................................. 20
附录1 元器件清单 .................................................. 20 附录2 总电路图 .................................................... 21 附录3 程序 ........................................................ 22
黄河科技学院
1基本内容和技术方案
1. 采用AT89C52单片机作为主控制器,彩灯控制器包括缺省模式和用户模式,通过键盘可以切换模式,用户模式下可以随意设定亮灯时间和闪烁频率参数,要求每种模式下都能实时的在数码管显示出模式号,时间和频率,合理选择系统方案,简述其工作原理;
2. 完成系统硬件设计,画出电路原理图;
3. 完成系统软件设计,可采用C语言和汇编语言混合编程;
4. 完成LED彩灯控制器的设计与制作,要求初始化后运行在缺省模式下,需要此模式下循环运行四种以上预设的彩灯闪烁方案;
技术方案:本方案以AT89C52单片机作为主控核心,与键盘、显示等模块组成核心主控制模块。在主控模块上设有3个按键和1位七段码LED显示器,根据用户需要可以编写若干种亮灯模式,利用其内部定时器T0实现一个基本单位时间为1 ms的定时中断,根据各种亮灯时间的不同需要,在不同时刻输出灯亮或灯灭的控制信号,然后驱动各种颜色的灯亮或灭。该方案的优点是系统体积小、功耗小、可靠性高、调节灵活、多功能、多花案、使用灵活方便。用户模式下可以随意设定亮灯的闪烁频率参数,并且每种模式下都能实现在数码管上显示出模式号。初始化后运行在缺省模式下,在此模式下可以循环运行9种预设的彩灯闪烁方案。
主程序中默认执行左右来回闪烁,在中断服务程序中,首先读取按键状态,然后延时10ms,再次读取按键状态。把两次获得的按键状态比较,如果不同,就表示是抖动,退出中断;否则,就去判断是哪个按键按下。如果是K1,就执行下一个闪烁方案;如果是K2,就执行加速;如果是K3,就执行减速。采用置标志位的方法,即在主程序中设定两个标志位,一个闪烁模式标志位,一个闪烁速度标志位。不断的对这两个标志进行查询:如果模式标志为状态0,就执行方案0, Mode_0;如果是状态1,就执行方案1, Mode_1,依次类推。闪烁速度标志默认值为500,对应延时值为500ms。而在中断服务程序中,只需要进行如下工作:去抖动,键盘识别,改变标志位。
2 系统硬件设计
整个系统包括AT89C51主控模块和受控模块,即发光二极管LED。以下就分别介绍一下这两个模块的主要功能。
1
黄河科技学院
2.1 主控模块电路设计
主控模块电路见【图1】。主控模块主要设计器件有AT89C51,1个数码管显示器,3个按钮。通过软件设计,使单片机P0和P1作为LED驱动信号输出口,P2口与三位按钮相接作为按钮输入口,P3口与二极管LED相接作为显示器的输出口。
图1 主控模块硬件图
2.2 受控模块电路设计
LED板模块设计主要器件有LED彩灯(红,绿,蓝,黄)、限流电阻。根据实际应用彩灯长度需要,可将不同数量的LED模块实现级连,组成一个完整的LED彩灯。考虑到视觉效果,可以将不同颜色的LED混合搭配,即将LED发光管按顺序L0(红)、L1(绿)、L2(蓝)、L3(黄)、L4(红)、L5(绿)、L6(蓝)„„依次均匀摆放在一条直线上。通过软件设计的各种方案,运行起来就会具有很好的动感视觉效果。
2
黄河科技学院
2.3 主要元器件介绍
2.3.1 单片机AT89C51
AT89C51是主控模块的核心控制器,其芯片内含4KB ROM和128Byte RAM;系统的振荡周期为12MHz。AT89C51具有如下特征(Features):
① 与Intel MCS-51产品兼容; ② 内部含有4KB EEPROM,可重复擦写1000次; ③ 支持晶振频率从0Hz到24MHz; ④ 内部含有128*8bit的RAM; ⑤ 32位可编程的I/O线; ⑥ 2个16位的定时/计数器, ⑦ 6个中断源; ⑧ 可编程的串行口;
AT89C51有40个引脚,是双列直插式芯片(DIP)[8],引脚定义及功能见【图3】。
图3 AT89C51引脚图
⑴ 振荡电路
单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,接18、19号引脚(XTAL1和XTAL2)[9]。AT89C51使用12MHz晶振,两电容的电容大小均为22pF。引脚XTAL1和XTAL2见【图4】。
3
黄河科技学院
图4 晶振电路 图5 复位电路
⑵ 控制信号引脚RST、EA/VPP
RST(9号引脚):单片机上电时,其内部各寄存器处于随机状态,在该引脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET)[10],见【图4】。
EA=0,单片机只访问外部程序存储器。对8031此引脚必须接地。EA=1,单片机访问内部程序存储器。对内部有程序存储器的8XX51单片机,此引脚应接高电平,但若地址值超过4KB(0FFFH),单片机将自动访问外部程序存储器。在8751单片机片内EPROM编程期间,此引脚引入21V编程电源VPP。 ⑶ 输入输出引脚(P0、P1、P2和P3端口引脚)
P0~P3是89C51与外界联系的4个8位双向并行I/O口。
本设计中P0和P1口作为LED驱动信号输出口,P2口与三位按钮连接作为按钮输入口,P3口与七段码LED相接作为显示器的输出口。 ⑷ AT89C51单片机的基本结构见【图5】
外时钟源外部事件计数振荡器和时序OSC程序存储器4KB EPROM数据存储器256B RAM/SFR2×16位定时器/计数器 89C51OSC 64KB 总线扩展控制器可编程I/O可编程全双工串行口内中断 控制并行口串行通信外中断
图5 AT89C51基本结构
4
黄河科技学院
⑸ 单片机89C51的定时器/计数器:
在彩灯控制系统中需要有某种方式来控制彩灯的亮灯时间、频率等,那就必须使用到定时器。在AT89C51单片机内部设有两个16位可编程定时器/计数器,简称定时器T0和定时器T1。提供给定时器的是计数源(见【图6】)即是单片机的晶振经过12分频后获得的一个脉冲源。晶振的频率相当准,所以这个计数脉冲的时间间隔也很准。一个12M的晶振,它提供给计数器的脉冲时间间隔就是12M/12等于1M,也就是1个微秒。
结论:计数脉冲的间隔与晶振有关,12M的晶振,计数脉冲的间隔是1微秒[11]。
图6 计数器工作方式
定时器有四种工作方式,方式0至方式3,本设计中使用方式1。
方式1是16位的定时/计数方式,定时器以全16位二进制数参与操作,且定时时间为:
在AT89C51中还有两个特殊功能寄存器与定时/计数有关,那就是TMOD和TCON。 TMOD格式如下表所示:
表1 TMOD格式
用于T1 GATE C/T M1 M2 GATE C/T 用于T0 M1 M0 t=(216-T0初值)×时钟周期×12[12] (1)
可以看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0。
其中:C/T为功能选择位,C/T=0为定时器,C/T=1为计数器。GATE为门控位,GATE=1硬件启动;GATE=0软件启动。
M1M0工作方式选择位如下表所示:
5
黄河科技学院
表2 M1M0工作方式选择位
M0 0 0 M1 0 1 功能说明 方式0 方式1 M0 1 1 M1 0 1 功能说明 方式2 方式3 TCON格式如下表所示:
表3 M1M0工作方式选择位
用于定时器/计数器 TF1 TR1 TF0 TR0 IE1 用于中断 IT1 IE0 IT0
可以看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断。而TF1(0),当计数溢出后TF1(0)就由0变为1。同时计数脉冲要进入计数器有层层关要通过,最起码,就是TR0(1)要为1,开关才能合上,脉冲才能过来。因此,TR0(1)称之为运行控制位,可用指令SETB来置位以启动计数器/定时器运行,用指令CLR来清0[13]。
2.3.2 LED彩灯限流电阻的确定
设计管内LED板模块时还需注意彩灯限流电阻的确定。限流电阻过小会导致彩灯烧坏。红绿蓝三色灯,它们的额定电流相同,都为20mA,而额定电压有差异,红灯与黄灯为2V,绿灯与蓝灯为2.2V。所有彩灯的正极都与+5V工作电源相连接,于是它们的限流电阻可根据如下计算得到: 红灯与黄灯:R=
= 150 (2)
蓝灯与绿灯:R=
=140 (3)
2.3.3 数码管结构及工作原理
数码管由七个发光二极管组成,此外,还有一个圆点型发光二极管(在图中以dp表示),用于显示小数点。通过七段发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符号。数码管中的发光二极管共有两种连接方法:
6
黄河科技学院
图7 数码管模型及实物图
① 共阴极接法:把发光二极管的阴极连在一起构成公共阴极。使用时公共阴极接地, 这样阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的则不点亮。
② 共阳极接法:把发光二极管的阳极连在一起构成公共阳极。使用时公共阳极接+5V。这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不点亮。本次设计显示器采用共阳极接法[14]。
为了显示数字或符号,要为显示器提供代码,因为这些代码是为显示字形的,因此称之为字形代码。七段发光二极管,再加上一个小数点位,共计八段。因此提供给显示器的字形代码正好一个字节。若a、b、c、d、e、f、g、dp 8个显示段依次对应一个字节的低位到高位,即D0、D1、D2、D3、D4、D5、D6、D7,则用共阳极数码管显示十六进制数时所需的字形代码如【表4】所示[15]。
表4 共阳极数码管字形代码
字形 0 1 2 3 4 5 共阳极代码 0xC0 0xF9 0xA4 0xB0 0x99 0x92 字形 6 7 8 9 A B 共阳极代码 0x82 0xF8 0x80 0x90 0x88 0x83 字形 C D E F 灭 共阳极代码 0xC6 0xA1 0x86 0x8E 0xFF 7
黄河科技学院
3 系统软件设计
3.1 综述
本次的任务是设计一个基于单片机的LED彩灯控制器,需要循环运行四种以上预设的彩灯闪烁方案,这里的各种的方案还有显示方式都是由单片机内部的程序控制。在这里我将16个发光二极管分别接在P0和P1口,通过程序控制这两个端口的电平高低,将16个发光二极管的正极接P0和P1口,负极接地,即P0和P1口的相应端口为高电平时LED就能被点亮。再通过程序循环的让各个端口以不同的方式点亮来达到各种花样的效果,并且当中要有一定的延时,延时时间小于人眼视觉暂留时间,否则人眼看上去每个灯都是亮的也就没有实际效果。
设计的LED彩灯系统分为两部分,即AT89C51主控模块和发光二极管LED受控模块。整个系统工作由软件程序控制运行,同时根据不同的需要,用户可以在LED彩灯工作时通过主控模块上的按钮来设定亮灯模式和灯光闪动频率。
模块功能:该部分主要涉及功能的实现方式,即程序编写。程序要实现的功能包括读按键,通过对读入按键的值控制LED点亮方式和数码管显示。键盘有三个按键K1、K2、K3,K1控制LED点亮模式,K2、K3键控制彩灯闪烁速度,K2加速,K3减速。不论K1被按下多少次,LED九种点亮模式是循环的,K2、K3键控制速度分别有上限和下限,多按无效。
程序设计思路:主程序中默认执行左右来回闪烁,在中断服务程序中,首先读取按键状态,然后延时10ms,再次读取按键状态。把两次获得的按键状态比较,如果不同,就表示是抖动,退出中断;否则,就去判断是哪个按键按下。如果是K1,就执行下一个闪烁方案;如果是K2,就执行加速;如果是K3,就执行减速。采用置标志位的方法,即在主程序中设定两个标志位,一个闪烁模式标志位,一个闪烁速度标志位。不断的对这两个标志进行查询:如果模式标志为状态0,就执行方案0, Mode_0;如果是状态1,就执行方案1, Mode_1,依次类推。闪烁速度标志默认值为500,对应延时值为500ms。而在中断服务程序中,只需要进行如下工作:去抖动,键盘识别,改变标志位。
本次设计的LED彩灯控制器另一特点是所有亮灯模式均由软件控制完成。系统中软件分为主程序和中断服务程序。这里以顺序调用Mode_i花样亮灯模式流程为主程序,以一个单位时间1ms的T0定时为中断服务程序。在这个1ms的T0定时基础上,我们可以根据需要来确定各亮灯模式Mode_i内点亮和熄灭各种颜色LED灯的时刻。整个系统软件由主程序(Main)、各模式子程序(Mode_i)、1ms中断服务子程序(T0 Interrupt)、按键扫描处理子程序、显示子程序等程序组成。利用T0定时器作为定时基本单位,根据模式需要计算好各控制信号的发生时刻,根据不同的模式Mode_i可以设定不同的脉
8
黄河科技学院
冲翻转频率Fi通过P0和P1口输出,使各色LED灯的驱动时刻与移位触发的翻转时刻步调一致,使LED彩灯按照设计的模式工作。
因此在LED彩灯上电工作后,用户可以很方便地通过主控模块上的显示器随时知道LED彩灯当前工作模式Mode_i。若实际应用需要根据不同场合和时间来改变彩灯闪亮效果,用户可以通过主控模块上的按钮来设定LED 不同的闪烁频率Fi ,以便符合实际需要。此外如果用户对某一种模式感兴趣需要仔细观看该亮灯花样,也可以通过键盘选定任意第Mode_i模式使系统循环重复工作在该花样模式下。
3.2 主程序与中断程序
3.2.1 主程序及流程图
AT89C51通过编写程序应完成以下功能:
通过P0口和P1口控制发光二极管LED的亮与灭,从而实现多种闪烁方案; 通过P2口查询三个按钮的情况以作出相应的操作;
P3口的P3.0~P3.7为七段码显示器的位控,显示当前亮灯的模式。
主程序需完成的任务主要是三个:切换彩灯亮灯模式,以及实现频率加速和频率减速的功能。按照上述绘制出主程序流程图。
9
黄河科技学院
两次按键相同? N N K3按下? N 调数码管显示子程序 结束
图8 主程序流程图
N K2按下? 再读按键 K1按下? 延时10ms去抖动 读按键保存 Y 调按键扫描子程序 Y 置模式标志 开中断初始化 初始化 主程序 Y 速度加1 Y 速度减1 10
黄河科技学院
3.2.2 中断程序及流程图
所谓中断就是指当中央处理器CPU正在处理某件事情的时候,外部发成了一件事(如这里是定时器计数溢出),请求CPU迅速去处理,CPU暂时中断当前的工作,转入处理所发生的事件,处理完以后,再回到原来的地方,继续原来的工作,这个过程就称为中断[16]。
调Mode_0子函数 调Mode_1子函数 置模式标识号 调数码管显示子程序 图9 中断程序流程图 Y Y „ 调Mode_8子函数 模式8? Y 模式1? „ N N
Y 模式0? N 返回主函数中断次数≥systemSpeed? 开中断 保护现场 恢复现场 重装初值 关闭中断 N 11
黄河科技学院
3.3 子程序的编程思路
虽然大致的流程图已经绘制完毕,但编程过程中会遇到更加具体的问题,需要编制一些子程序来解决,以下是一些主要子程序的流程图绘制思路。
3.3.1 频率增减按钮查询子程序
频率增减功能:所谓频率增减功能就是加快或者减慢彩灯的闪动频率。本设计中每按一次频率增按钮,每种亮灯模式就按预先设置好的频率加1;相反每按一次频率减按钮,频率减1,可以一键按多次。
实现方法是通过设置一个计数单元CLOCK,其初值设定为10,然后另设计器单元计时,该计时单元每进入一次中断服务程序就加1,然后把其计时结果不断与CLOCK比较从而确定什么时候要翻转。如果查询到频率减按钮按下CLOCK加1,相反查询到频率增按钮按下CLOCK减1。
3.3.2 延迟子程序
数码管的显示必须有足够长的时间长到肉眼能够察觉到,因此在点亮数码管时要给予其一个适当的延迟。一个机器周期包括12个时钟周期。单片机AT89C51工作于12M晶振,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。一共执行1000次,正好1000微秒,也就是1毫秒。
3.3.4数码管显示子程序
数码管完成的主要功能是:显示当前工作模式的序号Mode_i,它其实是对系统工作状态起到了一个很好的实时监控作用。本设计采用静态显示,位选线 同时选通,每位的段选线分别与一个8位锁存器输出相连(设计中接P3口,并外接一个8×1KΩ排阻限流),各位相互独立,各位显示一经输出,则相应显示将维持不变,直至显示下一字符为止。静态显示方式有较高的亮度和简单的软件编程,缺点是占用口线资源太多。
3.3.3 计数初值的设定
本设计采用定时中断的方式,因此必须首先确定TMOD与计数初值,然后设置TCON来启动T0。计数初值可按照以下公式计算,假定计数初值为a,晶振频率为fOSC赫兹,希望得到一个时间为T秒的中断则:
a=216-
fOSCT (4) 1212
本设计中fOSC=12MHz,T=1ms,
黄河科技学院
于是a=216-
16fOSCT 12121061103 =2-
12 =64536
即 FC18(转换为十六进制),因此TH2(置高八位)初值为0xFC,TL2(置低八位)初值为0x18。
4 系统调试与仿真分析
4.1 硬件选材及电路制作
首先要对整个任务进行分析,基本确定该彩灯控制系统可分为两大模块:主控模块以及管内LED板模块。
然后进一步确定应该采用哪些元器件。比如:主控模块首选就是由单片机作为主控核心,其成本很低,且功能很完善。除此以外当然还需要一些按钮、七段码显示器等辅助器件。在确定完所需何种功能的元器件后,就可以进行实物确定,主要通过上网搜索(比如21中国电子网),以及一些元器件手册。其要求是元器件报价较低,且能够实际购买的到。
确定完这些元器件后通过Protel99绘制原理图及印刷板电路图。其绘制印刷板电路的过程中必须注意元器件的尺寸及布线的合理性,尽可能减小板的体积。随后就是通过自己动手将这些元器件焊接到印刷板上。
4.2 硬件调试
硬件的调试主要是吧电路各种参数调整到符合设计要求。先排除硬件电路故障,包括设计性错误和工艺性故障。一般原则是先静态后动态。硬件静态调试主要是检测电路是否有短路、断路、虚焊等,检测芯片引脚焊接是否有错误,数码管段位是否焊接正确单片机的硬件调试和软件调试是分不开的。
调试方法:
在上电前,首先用万能表、示波器根据硬件图和印刷板电路图仔细检查其连线是否正确。核对各元器件的型号、规格以及安装的方向是否正确。其中重点检查电源走线,以避免电源之间短路。
单片机AT89C51是系统的核心,利用万用表检测单片机电源VCC(40脚)是否为+5V、晶振是否正常工作(可用示波器测试,也可以用万用表检测,两引脚电压一般为
13
黄河科技学院
1.8V~2.3V之间)、复位引脚RST(复位时为高电平,工作时为低电平)。尤其要注意单片机插座上的电位,由于单片机电源仅5V,因此如果有高电压,联机时会损坏模拟器。
4.3 软件调试
本次所有软体程序均采用C51语言编写,程序写完后要对其编译,在Proteus软件里实现硬件电路仿真。下面分别简单介绍单片机C语言和这两款软件。
4.3.1 单片机C语言
单片机C语言程序设计不同于通用计算机应用程序设计,它必须针对具体的微控制器及外围电路来完成,为了便于学习单片机应用程序设计和系统开发,很多公司退出了单片机实验箱、仿真器和开发板等,这些硬件设备可用于验证单片机程序,开发和调试单片机应用系统。开发8051单片机系统时,使用C语言会使开发周期大为缩短,开发效率大幅提高,程序可读性好且易于移植,所以使用C语言开发单片机系统已经成为必然趋势。
C语言在单片机系统开发中的优势: ⑴ 用C语言编写的程序可读性强;
⑵ 在不了解单片机指令系统而仅熟悉8051单片机存储结构时就可以开发单片机程序;
⑶ 寄存器分配和不同存储器寻址及数据类型等细节可由编译器管理; ⑷ 程序可分为多个不同的函数,这使程序设计结构化; ⑸ 函数库丰富,数据处理能力强;
⑹ 程序编写及调试时间大大缩短,开发效率远高于汇编语言;
⑺ C语言具有模块化编程技术,已编写好的通用程序模块很容易植入新程序,这进一步提高了程序开发效率。
4.3.2 Keil uVision2
C51单片机支持HEX文件,我采用的编译器是Keil uVision2软件,该软件是美国Keil Software 公司开发的,关于8051系列MCU的开发工具,是目前世界上最好的51单片机开发工具之一。软件本身支持数百种51系列单片机芯片,可以用来编译C源码,汇编源程序以及两者的混合编程代码,连接重定位目标文件和库文件,创建HEX文件,调试目标程序等,是一种集成化的文件管理编译环境。
使用步骤如下:
⑴ 建立一个项目,启动Keil,单击“Project菜单/New”选项,从弹出的窗口中选择要保存的路径,并输入项目文件名“彩灯.uv2”,然后保存。这时会弹出一个选择CPU
14
黄河科技学院
型号的对话框,根据所使用的单片机来选择,我用的单片机是AT89C51。
⑵ 创建程序文件,单击“File菜单/New”选项,输入C51语言源程序,单击“File菜单/Save”并输入程序文件名“彩灯.C”,保存。
⑶ 程序文件添加到项目中,右键点击“Target 1”前面的“+”,展开里面的内容“Source Group 1”,右键单击“Source Group 1”弹出一个右键菜单,单击“Add File to Group’s Source Group 1”,从弹出的窗口中选择之前保存的文件“彩灯.C”添加到项目中去。
⑷ 设置当前项目的目标选项,右键单击“Target 1”,从弹出的右键菜单中单击“Option for Target”选项,从弹出的“Options”窗口中选择“Target”标签栏,在“Create HEX File”前面打钩。
⑸ 运行编译,右键单击“Target 1”,从弹出的右键菜单中单击“Build target”选项,此时若源程序没有语法错误,Keil就会生成HEX文件,并自动保存在之前设置的路径里。
4.4.3 Proteus
Proteus是英国Labenter electronics公司开发的电路分析与实物仿真软件,是目前最好的模拟单片机外围器件的工具,它可以仿真、分析各种模拟电路与集成电路,软件提供了大量模拟与数字元器件及外部设备,各种虚拟仪表(如电压表、电流表、示波器、逻辑分析仪、信号发生器等),特别是它具有对单片机及其外围电路组成的综合系统的交互仿真功能。
Proteus操作非常简单,启动“ISIS.exe”。在设计原理图时,根据当前电路复杂程度和特定要求,选择恰当的模块进行设计,打开模块式需要单击“文件/新建设计”(File/New Design)菜单,打开“创建新设计”(Create New Design)对话框,然后选择相应模块。
创建空白文件后,先将DSN文件保存到指定位置,接下来就可以开始在图纸中添加元件了,单击模式工具上的元件模式(Component Mode)图标,对象选择窗口上会出设备(Device),这时单击“P”按钮,打开元件选择窗口,在元件库选择硬件电路所需要的元器,合理摆放位置,然后按要求连接好电路图。
4.4 软件仿真结果及分析
完成单片机系统仿真电路图设计后,即可开始仿真运行单片机绑定的程序文件,双击单片机,打开单片机属性窗口(也可以先在单片机上单击右键,再单击左键,或者选中单片机后按下(Ctrl+E组合键),在“Program Files”项中选择对应的HEX文件。
在仿真电路和程序都没有问题时,直接单击Proteus主窗口下的“运行”(Play)按钮,即可仿真运行单片机系统, 在运行过程中如果希望观察内存、24C0X、温度寄存器、时钟芯片等内部数据可在运行时单击“单步”(Step)或“暂停”(Pause)按钮,然后再
15
黄河科技学院
“调试”(Debug)菜单中打开相应设备。
如果要观察仿真电路中某些位置的电压或波形等,可向电路中添加相应的虚拟仪器,例如,电压表、示波器等。
Mode_0模式0(一个灯亮从左到右跑)程序及仿真结果:
图10 模式0仿真图
Mode_3模式3(一个灯灭先从左到右再从右到左跑)程序及仿真结果:
图11 模式3仿真图
16
黄河科技学院
Mode_5模式5(四个亮左右来回跑)程序及仿真结果:
图12 模式5仿真图
17
黄河科技学院
5 结束语
个管脚功能的理解和掌握。实现了软件和硬件的有效结合,缺一不可。设计让我把单片机的理论知识用在实践中,实现了理论和实践相结合,从中更懂得理论的是实践的基础,实践有能检验理论的正确性,更激发了我对专业知识的渴求,这些对我以后参加工作或者继续学习都会有很大的帮助和影响。
通过本文的论述从而为实际中生产各种亮灯模式的彩灯打下理论基础,与市面上大多数的LED彩灯相比,我设计的彩灯具有更好的灯光装饰经过一学期的课程设计,我对单片机的使用有了不同于以往的认识。从书本上的理论到现实中的硬件电路制作、软件编制以及软硬件调试,难度大大地增加。但是通过这一过程我对单片机的认识更加深刻。这对我今后从事该方面的学习工作是一个很好的基础。通过这次的毕业设计,让我受益匪浅,让我了解和掌握了一些编程思想和对I/O口的使用和应用的条件的思考,对单片机的各效果,性价比更高,与普通的全硬件LED彩灯相比具有较好的经济效益。应用主控模块输出的控制信号去控制灯管内的LED板模块工作,使的产品性能稳定,便以安装容易操作。由于控制程序存储在89C51单片机的电可擦除Flash闪存EPROM中,如果用户需要更改系统的亮灯模式Mode_i,无须改变系统硬件电路,只需修改其中程序即可,是一种很有发展前途的彩灯控制器。
.
18
黄河科技学院
参考文献
单片机课程设计指导书 皮大能 8051单片机实践与应用
北京理工大学出版社 2012.7
清华大学出版社
2003.8
电子工业出版社 2008.1
吴金戎
单片机技术基础教程与实践 夏路易
单片机原理及应用 张毅刚 高等教育出版社 2012.11 基于Proteus的单片机系统设计与仿真实例 蒋辉平 机械工业出版社 2007.7
19
黄河科技学院
附 录
附录1 元器件清单
表5 元器件清单
所用器材 51单片机 发光二极管 电阻 排阻 电容 电容 晶振 按键 七段数码管 型号 AT89C51 普通 1/8W 1KΩ 3KΩ×8 25V 22uF 电解电容 瓷片 30pF 12MHz 普通 共阳极 数量/只 1 16 1 1 1 2 1 3 1
20
黄河科技学院
附录2 总电路图
图13 总电路图
21
黄河科技学院
附录3 程序
#include void Delay1ms(unsigned int count) //延时子程序 { unsigned int i,j; for(i=0;i { P3 = LEDDisplayCode[Value]; } void LEDFlash(unsigned char Count) { unsigned char i; bit Flag; for(i = 0; i Display(RunMode); else Display(0x10); Delay1ms(100); } Display(RunMode); 22 0x80 }; //七段共阳极数码管0到8字形码 void Display(unsigned char Value) //七段数码管显示子程序 黄河科技学院 } unsigned char GetKey(void) //按键读入函数 { unsigned char KeyTemp,CheckValue,Key = 0x00; CheckValue = P2&0x32; if(CheckValue==0x32) //第一次读按键值 return 0x00; Delay1ms(10); KeyTemp = P2&0x32; //第二次读按键值 if(KeyTemp==CheckValue) //若两次值相同,无键按下,返回0值 return 0x00; if(!(CheckValue&0x02)) //K1键被按下 Key|=0x01; if(!(CheckValue&0x10)) //K2键被按下 Key|=0x02; if(!(CheckValue&0x20)) //K3键被按下 Key|=0x04; return Key; //返回键值 } unsigned int TimerCount, SystemSpeed, SystemSpeedIndex; void InitialTimer2(void) { TMOD = 0x01; //定时器1 TH2 = RCAP2H = 0xFC; //重装值,初始值 TL2 = RCAP2L = 0x18; ET2=1; TR2 = 1; EA=1; } unsigned int code SpeedCode[]={ 1, 2, 3, 5, 8, 10, 12,14, 17, 20,25, 30,40, 50,60};//15个 预设置频率速度 void SetSpeed(unsigned char Speed) { SystemSpeed =SpeedCode[Speed]; } 23 //定时器 2 中断允许 //定时器 2 启动 黄河科技学院 void LEDShow(unsigned int LEDStatus) { P1 = ~(LEDStatus&0x00FF); P0 = ~((LEDStatus>>8)&0x00FF); } void InitialCPU(void) { RunMode = 0x00; TimerCount = 0; SystemSpeedIndex = 8; //初始速度取值 P1 = 0x00; P0 = 0x00; P2 = 0xFF; P3 = 0x00; Delay1ms(1000); //延时1000ms P1 = 0xFF; P0 = 0xFF; P2 = 0xFF; P3 = 0xFF; SetSpeed(SystemSpeedIndex); Display(RunMode); } //Mode 0 模式0:一个灯亮从左到右跑 unsigned int LEDIndex = 0; bit LEDDirection = 1,LEDFlag = 1; void Mode_0(void) { LEDShow(0x0001< LEDShow(0x8000>>LEDIndex); LEDIndex = (LEDIndex+1)%16; 24 黄河科技学院 } //Mode 2 模式2:一个灯亮先从左到右再从右到左跑 void Mode_2(void) { if(LEDDirection) LEDShow(0x0001< LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16; } //Mode 3 模式3:一个灯灭先从左到右再从右到左跑 void Mode_3(void) { if(LEDDirection) LEDShow(~(0x0001< LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16; } //Mode 4 模式4:全亮后逐个灭,先左右、后右左,然后全灭逐个亮,先右左、后左右 void Mode_4(void) { if(LEDDirection) { if(LEDFlag) LEDShow(0xFFFE< 25 黄河科技学院 { if(LEDFlag) LEDShow(0x7FFF>>LEDIndex); else LEDShow(~(0xFFFE< LEDDirection = !LEDDirection; if(LEDDirection) LEDFlag = !LEDFlag; } LEDIndex = (LEDIndex+1)%16; } //Mode 5 模式5:四个亮左右来回跑void Mode_5(void) { if(LEDDirection) LEDShow(0x000F< LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16; } //Mode 6 模式6:四个灭左右来回跑void Mode_6(void) { if(LEDDirection) LEDShow(~(0x000F< LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%16; 26 黄河科技学院 } //Mode 7 模式7:六个亮左右来回跑 void Mode_7(void) { if(LEDDirection) LEDShow(0x003F< LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%10; } //Mode 8 模式8:礼花式点亮,群闪三下 void Mode_8(void) { LEDShow(++LEDIndex); } void TimerEventRun(void) { if(RunMode==0x00) { Mode_0(); } else if(RunMode ==0x01) { Mode_1(); } else if(RunMode ==0x02) { Mode_2(); } else if(RunMode ==0x03) { Mode_3(); } 27 黄河科技学院 else if(RunMode ==0x04) { Mode_4(); } else if(RunMode ==0x05) { Mode_5(); } else if(RunMode ==0x06) { Mode_6(); } else if(RunMode ==0x07) { Mode_7(); } else if(RunMode ==0x08) { Mode_8(); } } void Timer2(void) interrupt 5 using 3 { TF2 = 0; { TimerCount = 0; TimerEventRun(); } } unsigned char MusicIndex = 0; void KeyDispose(unsigned char Key) { if(Key&0x01) { 28 //中断标志清除 if(++TimerCount>=SystemSpeed) 黄河科技学院 LEDDirection = 1; LEDIndex = 0; LEDFlag = 1; RunMode = (RunMode+1)%9; Display(RunMode); if(Key!=0x00) } if(Key&0x02) { if(SystemSpeedIndex>0) { --SystemSpeedIndex; SetSpeed(SystemSpeedIndex); } else { LEDFlash(6); } } if(Key&0x04) { if(SystemSpeedIndex<15) { ++SystemSpeedIndex; SetSpeed(SystemSpeedIndex); } else { LEDFlash(6); } } } main() { unsigned char Key; InitialCPU(); 29 黄河科技学院 InitialTimer2(); while(1) { Key = GetKey(); { KeyDispose(Key); } } } 30 黄河科技学院 31 因篇幅问题不能全部显示,请点此查看更多更全内容