单片机课程设计--节日彩灯控制器设计
课程设计报告
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目: 节日彩灯控制器设计 课 程: 单片机原理及应用课程设计 专 业: 电气工程及其自动化
- 1 -
第 一 部 分
任
务
书
- 2 -
《单片机原理及应用》课程设计任务书
一、课题名称
详见《单片机课程设计题目(一)》:主要是软件仿真,利用Proteus软件进行仿真设计并调试;
《单片机课程设计题目(二)》:主要是硬件设计,利用单片机周立功实验箱进行设计并调试。
二、课程设计目的
课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。
《单片机原理及应用》是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。通过单片机硬件和软件设计、调试、整理资料等环节的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。
三、课程设计内容
设计以89C51单片机和外围元器件构成的单片机应用系统,并完成相应的软硬件调试。
1. 系统
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
设计:综合运用单片机课程中所学到的理论知识,学生根据所选课题的任务、要求和条件进行总体方案的设计。
2. 硬件电路设计:对方案中以单片机为核心的电路进行设计计算,包括元器件的选择和电路参数的计算,并画出总体电路图。
3. 软件设计:根据已设计出的软件系统框图,用汇编语言或C51编制出各功能模块的子程序和整机软件系统的主程序。
4. 调试:在单片机EDA仿真软件环境Proteus下进行仿真设计并调试;或在单片机周立功实验箱上进行相关设计并调试。
- 3 -
四、课程设计要求
以单片机为核心,设计一个节日彩灯控制器:
P1.0—开始,按此键则灯开始流动(由上而下)并将第几个灯亮送给液晶显示和LED
数码管。
P1.4—停止,按此键则灯停止流动,液晶显示和LED数码管停止工作。 P1.4—停止,按此键则停止流动,所有灯为暗并清屏。
P1.2—上,按此键则灯由左向右下流动并将第几个灯亮送给液晶显示和LED数码管。
P1.3—下,按此键则灯由右向左流动并将第几个灯亮送给液晶显示和LED数码管
五、进度安排
序号 内容 天数 1 布置任务,熟悉课题要求 0.5 2 总体方案确定,硬件电路设计 1.5 3 软件编程 1.5 4 Proteus仿真,或在周立功实验箱上调试 2 5 总结,撰写课程设计报告 1.5
七、课程设计报告内容:
总结设计过程,写出设计报告,设计报告具体内容要求如下:
1(课程设计的目和设计的内容。
2(课程设计的要求。
3(控制系统总框图及系统工作原理。
4(控制系统的硬件电路连接图,电路的原理。
5(软件设计流程图及其
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
。
6(电路设计,软件编程、调试中遇到的问题及分析解决方法。
7(实验结果及其分析。
8(体会。
- 4 -
第 二 部 分
课
程
设
计
报
告
- 5 -
目 录
1、课题简介.......................................... - 7 - 1.1、设计需求分析 .................................... - 7 - 2、方案设计.......................................... - 8 - 2.1、控制系统总体框图 ................................ - 8 - 2.2、工作原理 ........................................ - 8 - 3、硬件电路设计 ...................................... - 8 - 3.1、 AT89C51单片机硬件结构 .......................... - 9 - 3.2、1602字符型液晶显示 ............................. - 12 - 3.3、 AT89C51最小系统 ............................... - 15 - 3. 3、电路设计 ...................................... - 15 - 4、软件设计原理 ..................................... - 16 - 3.1 程序设计 ........................................ - 16 - 3.2 主程序设计 ...................................... - 17 - 4.1、系统程序: ..................................... - 19 - 5、电路仿真......................................... - 25 - 5.1、仿真结果 ....................................... - 25 - 3.2、仿真结果分析 ................................... - 28 - 6、小结 ............................................ - 29 - 参 考 文 献......................................... - 30 - 附录 ............................................... - 31 -
- 6 -
1、课题简介
1.1、设计需求分析
节日彩灯使生活中常常用到的装饰物品。它集中地运用了单片机、LED、,自动控制等技术,是典型的基于单片机的电子产品。
本文以AT89C51单片机为控制核心,采用模块化的
设计方案
关于薪酬设计方案通用技术作品设计方案停车场设计方案多媒体教室设计方案农贸市场设计方案
,运用LED彩灯、按键等组成电路,实现彩灯在开启时满足不一样的闪亮方法。按键可以在彩灯使用的时候选择不同的亮法,使彩灯变化多样,键一可以使彩灯依次循环点亮,健二可以使彩灯从左到又从右到左循环点亮,三号键使两端灭,中间亮,再对半交替亮,然后再奇偶亮。通过按键能方便使用者选择不同样的亮法
随着计算机、微电子、信息技术的快速进步,智能化技术的开发速度越来越快 ,智能度越来越高 ,应用范围也得到了极大的扩展。在海洋开发、宇宙探测、工农业生产、军事、社会服务、娱乐等各个领域。在娱乐方面,场地的装饰离不开彩灯。在建筑方面也采用彩灯来装饰高楼大厦。彩灯又灵活多变的点亮方式,装饰效果非常好,特别时晚上使得高楼大厦更加漂亮。是彩灯的应用才使得城市的夜景非常迷人。
在国内外,微控制系统主要采用单片机作为控制核心。因此,单片机的发展将有助于简单实用电子产品的开发。在本设计中,采用比较先进的AT89C51单片机为控制核心,它的功耗很低。
单片机技术发展至今,掌握最先进技术的仍然是国外的几大公司。如Intel公司发展的MCS-51系列的新一代产品,如8,C152、80C51FA/FB、80C51GA/GB、8,C451、8,C452,还包括了Philips、Siemens、ADM、Fujutsu、OKI、Harria-Metra、ATMEL等公司以80C51为核心推出的大量各具特色)与80C51兼容的单片机。新一代的单片机的最主要的技术特点是向外部接口电路扩展,以实现Microcomputer完善的控制功能为己任,可连接一些外部接口功能单元如A/D、PWM、PCA(可编程计数器阵列))WDT(监视定时器))高速I/O口、计数器的捕获/比较逻辑等。这一代单片机中,在总线方面最重要的进展是为单片机配置了芯片间的串行总线,为单片机应用系统设计提供了更加灵活的方式。Philips公司还为这一代单片机80C51系列8,C592单片机引入了具有较强功能的设备间网络系统总线
---CAN(Controller Area Network BUS)。
- 7 -
2、方案设计
2.1、控制系统总体框图
晶体显示 P 晶震器及0 复位发生8
器 位P2
L E
8D控AT89C51 个数制 PPL码按3 1 E管 键 D
灯
2.2、工作原理
如流程图示,P1口读控制按键的状态,AT89C51根据P1口的信号的不同给P3口不同的信号使8个LED工作,在这同时给P0、P2口发送相应的信号以显示8个LED中哪个灯正在亮。
晶震器及复位发生器是用以给AT89C51提供时钟信号;复位发生器是当系统异常工作时用以复位初始化。
3、硬件电路设计
一个单片机应用系统的硬件电路设计包含有两部分内容:一是系统扩展,即单片机内部
- 8 -
的功能单元,如ROM)RAM)I/O口)定时/记数器)中断系统等能量不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统配置,既要按照系统功能要求配置外围设备,如键盘显示器)打印机)A/D)D/A转换器等,又要设计合适的接口电路。
本系统采用AT89C51单片机作为中央处理器。其主要任务收集按键的信息,判断按键时否按下来执行相应彩灯的点亮方式
在本系统中,AT89C51单片机的P1口用于接按键,方便使用者选择方式。P0口接的时LED彩灯。
3.1、 AT89C51单片机硬件结构
AT89C51是一种低功耗/低电压、高性能的八位CMOS单片机,片内有一个4KB的FLASH可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory),它采用了CMOS工艺和ATMEL公司的高密度非易失性存储器技术,而且其输出引脚和指令系统都与MSC—51兼容。片内置通用8位中央处理器(CPU)和FLASH存储单元,片内的存储器允许在系统内改编程序或用常规的非易失性存储器编程。因此,AT89C51是一种功能强、
[11]灵活性高且价格合理的单片机,可方便的应用于各种控制领域。
3.1.1 、主要特性
(1)与MCS-51产品指令系统兼容
(2)4K字节可编程闪烁存储器
擦循环 (3)寿命:1000写/
(4)数据保留时间:10年
(5)全静态工作:0Hz-24Hz
(6)三级程序存储器锁定
(7)128*8位内部RAM
(8)32可编程I/O线
(9)两个16位定时器/计数器
(10)6个中断源
(11)可编程串行通道
(12)低功耗的闲置和掉电模式
(13)片内振荡器和时钟电路
另外,AT89C51是用静态逻辑来设计的,其工作频率可下降到零并提供两种软件的省电方式-空闲方式和掉电方式。在空闲方式中,CPU停止工作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下次硬件复位为止。
3.1.2、 管脚说明
VCC(40):供电电压,其工作电压为5V。
GND(20):接地。
P0端口(P0.0-P0.7):P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
- 9 -
P1端口(P1.0-P1.7):P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2端口(P2.0-P2.7):P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3端口(P3.0-P3.7):P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入端时,由于外部下拉为低电平,P3口将输出电流(I)。 LL
P3口也可作为AT89C51的一些特殊功能口,如表3.1所示。
表2.1 P3端口引脚兼用功能表
- 10 -
端口引脚第二功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
______P3.2 (外中断0)INT0
______P3.3 (外中断1)INT1
P3.4T0(定时/计数0)
P3.5T1(定时/计数1)
_____P3.6 (外部数据存储器写选通)WR
____P3.7 (外部数据存储器读选通)RD
P3口同时为闪烁编程和编程校验接收一些控制信号。
复位RST(9):复位输入。在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P3.0-P3.7口均置1,引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。复位操作不会对内部RAM有所影响。
ALE/PROG(30):当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
(29):外部程序存储器的选通信号。在由外部程序存储器取指令期间,每个机PSEN
器周期两次有效。但在访问外部数据存储器时,这两次有效的信号将不出现。 PSENPSEN____
EA/VPP(31):当保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),EAEA____不管是否有内部程序存储器。注意加密方式1时,将内部锁定为RESET;当端保EAEA持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源
- 11 -
(VPP)。
XTAL1(19):反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2(18):来自反向振荡器的输出。其引脚图如图3.1所示。
图2.2 AT89C51引脚图
3.1.3、 振荡器特性
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
3.1.4、 芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦除操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.2、1602字符型液晶显示
液晶显示器以其微功耗、小体积、使用灵活等诸多优点在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。液晶显示器通常可分为两大类,一类是点阵型,另一类是字符型。点阵型液晶通常面积较大,可以显示图形;而一般的字符型液晶只有两行,面积小,只能显示字符和一些很简单的图形,简单易控制且成本低。目前市面上的字符型液晶绝大多数是
- 12 -
基于HD44780液晶芯片的,所以控制原理是完全相同的,为HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
字符型LCD通常有14条引脚线(市面上也有很多16条引脚线的LCD,多出来的2条线是电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样),定义如下表所示:
字符型LCD的引脚定义
???????????????????????????????????? ㄧ 引脚号 ㄧ 引脚名 ㄧ 电平 ㄧ 输入/输出 ㄧ 作用 ㄧ ???????????????????????????????????? ㄧ 1 ㄧ Vss ㄧ ㄧ ㄧ 电源地 ㄧ ???????????????????????????????????? ㄧ 2 ㄧ Vcc ㄧ ㄧ ㄧ 电源(+5V) ㄧ ???????????????????????????????????? ㄧ 3 ㄧ Vee ㄧ ㄧ ㄧ 对比调整电压 ㄧ ???????????????????????????????????? ㄧ 4 ㄧ RS ㄧ 0/1 ㄧ 输入 ㄧ 0=输入指令 ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ 1=输入数据 ㄧ ????????????????????????????????????
0/1 ㄧ 输入 ㄧ 0=向LCD写入指令或数据 ㄧ ㄧ 5 ㄧ R/W ㄧ
ㄧ ㄧ ㄧ ㄧ ㄧ 1=从LCD读取信息 ㄧ ???????????????????????????????????? ㄧ 6 ㄧ E ㄧ 1,1?0 ㄧ 输入 ㄧ 使能信号,1时读取信息, ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ 1?0(下降沿)执行指令 ㄧ ???????????????????????????????????? ㄧ 7 ㄧ DB0 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line0(最低位) ㄧ ???????????????????????????????????? ㄧ 8 ㄧ DB1 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line1 ㄧ ???????????????????????????????????? ㄧ 9 ㄧ DB2 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line2 ㄧ ???????????????????????????????????? ㄧ 10 ㄧ DB3 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line3 ㄧ ???????????????????????????????????? ㄧ 11 ㄧ DB4 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line4 ㄧ ???????????????????????????????????? ㄧ 12 ㄧ DB5 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line5 ㄧ ???????????????????????????????????? ㄧ 13 ㄧ DB6 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line6 ㄧ ???????????????????????????????????? ㄧ 14 ㄧ DB7 ㄧ 0/1 ㄧ 输入/输出 ㄧ 数据总线line7(最高位) ㄧ ????????????????????????????????????
HD44780内置了192个常用字符,存于字符产生器CGROM(Character Generator ROM)中,
- 13 -
另外还有几个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图说明了CGROM和CGRAM与字符的对应关系(由于本书中未用到自定义特殊字符的功能,所以本节不对CGRAM作详细介绍。以下如未特别说明,则"字符码"指CGROM的字符号,"地址"指DDRAM的地址)。
字符码0x00,0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),0x20,0x7F为
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的ASCII码,0xA0,0xFF为日文字符和希腊文字符,其余字符码(0x10,0x1F及0x80,0x9F)没有定义。
- 14 -
3.3、 AT89C51最小系统
AT89C51最小系统接线如图3.2所示,在XTAL1、XTAL2端接上晶振及两个谐振电容,在RESET端接上相应的电阻、电容,如需要按键复位,加上按键即可组成一个最小系统,按要求通电后,系统就可以工作了。
图2.3 AT89C51最小系统
3. 3、电路设计
将MUC、LED和按键进行PROTEUS设计。
打开PROTEUS的ISIS编辑环境,从PROTEUS中选取该电路所需要的元器件,放置元器件、放置电源和地、连线得到如图3.7所示的电气原理图,再点菜单栏工具下拉的电气规则检查,当规则检查出现:“NETLIST GENERATED OK NO ERC ERRORD FOUND”,表示通过检查。电路设计完成。
- 15 -
图2.4 系统电气原理图
4、软件设计原理
3.1 程序设计
程序设计(Programming)是指设计、编制、调试程序的方法和过程。它是目标明确的智力活动。在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件也占有重要的地位。
在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。数据处理包括:数据的采集、数字滤波、标度变换等。过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便控制生产。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接在一起形成一个完整的程序,这样的程序设计方法称为模块化程序设计。所谓“模块”,实质上就是能完成一定功能,并相对独立的程序段,这种程序设计方法称为模块程序设计法[14]。
模块程序设计法的主要优点是:
(1)单个模块比起一个完整的程序易编写、调试及修改。
(2)程序的易读性好。
- 16 -
(3)程序的修改可局部化。
(4)模块可以共存,一个模块可以被多个任务在不同条件下调用。
(5)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。
本系统软件采用模块化结构,由主程序)方式一,方式二,方式三,方式四和延时等子程序构成。
3.2 主程序设计
在系统的程序设计中,主控模块只负责根据消息调用相应模块的处理函数,具体如何处理这些消息由各功能模块中的对应程序决定。
当收到按键一按下使P1.0的电平有高电平变成低电平时,主程序就跳到方式一的子函数执行,这样就实现了方式一的点亮。
当收到按键二按下使P1.1的电平有高电平变成低电平时,主程序就跳到方式二的子函数执行,这样就实现了方式二的点亮。
当收到按键三按下使P1.2的电平有高电平变成低电平时,主程序就跳到方式三的子函数执行,这样就实现了方式三的点亮。
当收到按键四按下使P1.3的电平有高电平变成低电平时,主程序就跳到方式四的子函数执行,这样就实现了方式四的点亮。
主程序就跳到方式四的子函数当收到按键四按下使P1.4的电平有高电平变成低电平时,
执行,这样就实现了方式五的点亮
软件设计原理流程图
- 17 -
开
始
长跳转到
Start
初始化液晶显示
P1.方式0亮灯
0=?
P1.1方式一亮灯
=0?
方式二亮灯 P1.2= 0,
方式三亮灯 P1.3 =0?
方式四亮灯 P1.4
=0?
- 18 -
4.1、系统程序:
预命令
#include
#include
定义端口
sbit rs= P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
sbit p10=0x90;
sbit p11=0x91;
sbit p12=0x92;
sbit p13=0x93;
sbit p24=0xA4;
sbit p14=0x94;
sbit p25=0xA5;
sbit p26=0xA6;
sbit p27=0xA7;
定义三个数组(用以赋值液晶显示)
unsigned char code dis1[8] = {"12345678"};
unsigned char code dis2[8] = {"18273645"};
unsigned char code dis3[8] = {"87654321"};
延时子程序
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
判断LCD是否忙碌,忙碌则返回“1”;否则为“0”
bit lcd_bz()
{
bit result;
rs = 0;
rw = 1;
- 19 -
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_(); result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
给液晶显示写控制命令
void lcd_wcmd(unsigned char cmd) //写指令
{
while(lcd_bz());//判断LCD是否忙碌
rs = 0;
rw = 0; //re=0,rw=1 ;e为正脉冲
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_pos(unsigned char pos) //显示位置转换程序
{
lcd_wcmd(pos | 0x80); //显示第一行的地址是0x08,第二行的是0xc0。
}
给液晶显示数据显示内容
void lcd_wdat(unsigned char dat) //写数据
{
while(lcd_bz());//判断LCD是否忙碌
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
- 20 -
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
初始化液晶显示
void lcd_init() //初始化lcd
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
//清屏 lcd_wcmd(0x01);
delay(1);
}
主程序
void main(void)
{
unsigned char i;
lcd_init();// 初始化LCD
delay(10);
i=0; p27=0;p26=0;p25=0;p24=0;
开始按键按下时,执行下程序
if(p10==0)
{while(1)
{ if(p12==1&&p13==1)
{ switch(i)
{case(0):P3=0x01;p27=0;p26=0;p25=0;p24=1; break; case(1):P3=0x02;p27=0;p26=0;p25=1;p24=0;break; case(2):P3=0x04;p27=0;p26=0;p25=1;p24=1;break; case(3):P3=0x08;p27=0;p26=1;p25=0;p24=0;break; case(4):P3=0x10;p27=0;p26=1;p25=0;p24=1;break; case(5):P3=0x20;p27=0;p26=1;p25=1;p24=0;break; case(6):P3=0x40;p27=0;p26=1;p25=1;p24=1;break; case(7):P3=0x80;p27=1;p26=0;p25=0;p24=0;break;}
lcd_pos(0x01);
- 21 -
lcd_wdat(dis1[i]);
i++;
}
开
始
N
开始按键按 下 Y
赋值P3口和数码
管
数组1给液晶
显示
I++
当显只有示1按键按下时,执行下程序
if (p12==0&&p13==1)
{ switch(i)
{case(0):P3=0x01;p27=0;p26=0;p25=0;p24=1;break; case(1):P3=0x80;p27=1;p26=0;p25=0;p24=0;break; case(2):P3=0x02;p27=0;p26=0;p25=1;p24=0;break; case(3):P3=0x40;p27=0;p26=1;p25=1;p24=1;break; case(4):P3=0x04;p27=0;p26=0;p25=1;p24=1;break; case(5):P3=0x20;p27=0;p26=1;p25=1;p24=0;break; case(6):P3=0x08;p27=0;p26=1;p25=0;p24=0;break; case(7):P3=0x10;p27=0;p26=1;p25=0;p24=1;break;}
lcd_pos(0x01);
lcd_wdat(dis2[i]);
i++;
}
- 22 -
N
N
当显只有示1按键按
下
Y
赋值P3口和数码 管
数组2给液晶
显示
I++
当只有显示2按键按下时,执行下程序
if (p12==1&&p13==0)
{ switch(i)
{case(0):P3=0x80;p27=1;p26=0;p25=0;p24=0;break; case(1):P3=0x40;p27=0;p26=0;p25=1;p24=1;break; case(2):P3=0x20;p27=0;p26=1;p25=1;p24=0;break; case(3):P3=0x10;p27=0;p26=1;p25=0;p24=1;break; case(4):P3=0x08;p27=0;p26=1;p25=0;p24=0;break; case(5):P3=0x04;p27=0;p26=0;p25=1;p24=1;break; case(6):P3=0x02;p27=0;p26=0;p25=1;p24=0;break; case(7):P3=0x01;p27=0;p26=0;p25=0;p24=1;break;}
lcd_pos(0x01);
lcd_wdat(dis3[i]);
i++;
}
- 23 -
N
Y
只有显示2按键按下
Y
赋值P3口和数码 管
数组3给液晶
显示
I++
delay(150);
当暂停按键按下时,不做任何处理
while(p11==0){;}//暂停语句
N
N
暂停按键按下
Y
当停止按键按下时
while(p14==0){P3=0x00; p27=0;p26=0;p25=0;p24=0;
lcd_wcmd(0x01); //清屏
delay(1);
}
if(i==8)
i=0;
}
}
}
- 24 -
N
Y
停止按键按下
Y
赋0值P3口和数码管
清屏液晶显示
延时
5、电路仿真
5.1、仿真结果
PROTEUS软件自带编辑器,可以实现对汇编程序的编译,其操作步骤是: 1.新建源文件:点菜单Source?Add/Remove source Files在出现的对话框中,选择ASEM51编辑器,新建NOMAME1.asm 源文件。
2.程序设计:点菜单Source?NAMAME1.asm打开源文件编辑器,将将附录程序输入到文本中。
3.源程序编译:点菜单Source?Build ALL编译汇编源程序,生成目标代码文件PMD.HEX,若编译失败,可对程序进行修改调试直至编译成功。
4.目标代码加载:在PROTEUS编辑环境双击AT89C51,弹出如图4.6所示的对话框,在PROGRAM FILE一栏中单击打开按钮,选中NOMAME1.HEX文件。在CLOCK FREQUENCY栏中设置系统工作频率为12MHZ,单击OK完成目标代码加载。
- 25 -
图3.8 程序代码加载
1.最后,点击运行按钮,启动系统仿真.
2.仿真结果如图所示。当按开始键时
- 26 -
3.当按停止键按下时仿真结果如图所示。
4.当显示1键按下时仿真结果如图
5.当显示2键按下时仿真结果如图
- 27 -
6.当暂停键按下时仿真结果如图
3.2、仿真结果分析
通过对上述模块的仿真,可以看出基于单片机控制的节日彩灯在PROTEUS软件上可以很好的实现各种变换花样的仿真。
当仿真开始运行时,各个模块处于初始状态。当有按键触发后,主程序跳到相应的彩灯闪亮方式循环闪亮。因此,从仿真结果可以看出,本设计可以得到预期的仿真效果。
- 28 -
6、小结
通过这次单片机课程设计,我了解到自己在单片机方面还有很多不足,特别是单片机指令系统及AT89C51各引脚的第二功能等等知识不够了解.因此我在设计中遇到不懂的东西就马上查资料或请教同学.这不仅加深了我对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
这个设计过程中,我们要实现彩灯的多功能化,老师平时指导我们将程序模块化,首先实现一个功能,接着逐个地添加功能,最后达到多功能化.有了明确的方向后,我们开始认真的搞我们的课程设计.这个过程中,我们花费了大量的时间和精力,同时还懂得合作精神的重要性,学会了与他人合作,不懂的不明白的就要和同学们交流,这样学习才更有乐趣。 在课程设计过程中,不断调试程序和修改程序,提高了对单片机的应用能力,分析问题和解决问题的能力。在和同学们交流的同时也明白了做任何事情都要有团结合作的精神,只有这样才能更快更好的掌握好要学习的知识。
- 29 -
参 考 文 献
(列出你所利用的参考文献。格式参见下。)
[1] 张毅刚主编,单片机原理及应用,北京:高等教育出版社,2004 [2] 陈涛编著,单片机应用及C51程序设计,北京:机械工业出版社,2008 [3] 周润景主编,PROTEUS入门实用教程,北京:机械工业出版社,2007 [4] 皮大能主编,单片机课程设计指导书,北京:北京理工大学出版社,2010 [5] 楼然苗主编, 单片机实验与课程设计(Proteus仿真版),浙江:浙江大学出版社, 2010
[7] 控制、电子技术类杂志、报刊
- 30 -
附录
#include
#include
sbit rs= P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
sbit p10=0x90;
sbit p11=0x91;
sbit p12=0x92;
sbit p13=0x93;
sbit p24=0xA4;
sbit p14=0x94;
sbit p25=0xA5;
sbit p26=0xA6;
sbit p27=0xA7;
unsigned char code dis1[8] = {"12345678"};
unsigned char code dis2[8] = {"18273645"};
unsigned char code dis3[8] = {"87654321"};
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_bz()
{
bit result;
rs = 0;
- 31 -
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
void lcd_wcmd(unsigned char cmd) //写指令 {
while(lcd_bz());//判断LCD是否忙碌 rs = 0;
rw = 0; //re=0,rw=1 ;e为正脉冲 ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_pos(unsigned char pos) //显示位置转换程序
{
lcd_wcmd(pos | 0x80); //显示第一行的地址是0x08,第二行的是0xc0。
}
void lcd_wdat(unsigned char dat) //写数据 {
while(lcd_bz());//判断LCD是否忙碌 rs = 1;
rw = 0;
ep = 0;
P0 = dat;
- 32 -
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init() //初始化lcd
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01); //清屏
delay(1);
}
void main(void)
{
unsigned char i;
lcd_init();// 初始化LCD
delay(10);
i=0; p27=0;p26=0;p25=0;p24=0;
if(p10==0)
{while(1)
{ if(p12==1&&p13==1)
{ switch(i)
{case(0):P3=0x01;p27=0;p26=0;p25=0;p24=1; break;
case(1):P3=0x02;p27=0;p26=0;p25=1;p24=0;break;
case(2):P3=0x04;p27=0;p26=0;p25=1;p24=1;break;
case(3):P3=0x08;p27=0;p26=1;p25=0;p24=0;break;
case(4):P3=0x10;p27=0;p26=1;p25=0;p24=1;break;
case(5):P3=0x20;p27=0;p26=1;p25=1;p24=0;break;
case(6):P3=0x40;p27=0;p26=1;p25=1;p24=1;break;
case(7):P3=0x80;p27=1;p26=0;p25=0;p24=0;break;}
lcd_pos(0x01);
- 33 -
lcd_wdat(dis1[i]);
i++;
}
if (p12==0&&p13==1)
{ switch(i)
{case(0):P3=0x01;p27=0;p26=0;p25=0;p24=1;break;
case(1):P3=0x80;p27=1;p26=0;p25=0;p24=0;break;
case(2):P3=0x02;p27=0;p26=0;p25=1;p24=0;break;
case(3):P3=0x40;p27=0;p26=1;p25=1;p24=1;break;
case(4):P3=0x04;p27=0;p26=0;p25=1;p24=1;break;
case(5):P3=0x20;p27=0;p26=1;p25=1;p24=0;break;
case(6):P3=0x08;p27=0;p26=1;p25=0;p24=0;break;
case(7):P3=0x10;p27=0;p26=1;p25=0;p24=1;break;}
lcd_pos(0x01);
lcd_wdat(dis2[i]);
i++;
}
if (p12==1&&p13==0)
{ switch(i)
{case(0):P3=0x80;p27=1;p26=0;p25=0;p24=0;break;
case(1):P3=0x40;p27=0;p26=0;p25=1;p24=1;break;
case(2):P3=0x20;p27=0;p26=1;p25=1;p24=0;break;
case(3):P3=0x10;p27=0;p26=1;p25=0;p24=1;break;
case(4):P3=0x08;p27=0;p26=1;p25=0;p24=0;break;
case(5):P3=0x04;p27=0;p26=0;p25=1;p24=1;break;
case(6):P3=0x02;p27=0;p26=0;p25=1;p24=0;break;
case(7):P3=0x01;p27=0;p26=0;p25=0;p24=1;break;}
lcd_pos(0x01);
lcd_wdat(dis3[i]);
i++;
}
delay(150);
while(p11==0){;}//暂停语句
while(p14==0){P3=0x00; p27=0;p26=0;p25=0;p24=0;
lcd_wcmd(0x01); //清屏
delay(1);
}
if(i==8)
i=0;
} //w
}//if
} //m
- 34 -