8051照明灯智能控制器

更新时间:2024-06-21 16:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

本科目录

毕业论文(设计) 本科毕业论文(设计)

目 录

摘 要 ................................................................... I Abstract ................................................................ II 1 绪论 .................................................................. 1

1.1课题研究的背景 .................................................... 1 1.2 开发的意义 ........................................................ 1 1.3 课题研究的方案 .................................................... 1 2 芯片选用说明 ........................................................... 1 2.1 AT89S52 .............................................................. 1

2.1.1 相关芯片及其引脚分析 ........................................ 1 2.1.2 引脚功能说明 ................................................ 2

2.2 AT89C2051 ........................................................ 4 2.2.1 相关芯片及其引脚分析 ........................................ 4 2.3 LCD1602 ........................................................... 5

2.3.1相关芯片及其引脚分析 ......................................... 5 2.3 SMC1602A参考连接: ............................................... 7 3.系统硬/软件设计 ........................................................ 8

3.1 夜用照明系统的设计 ................................................ 8 3.2 标准时钟显示部分设计: ........................................... 10 3.3 光敏接收电路 ..................................................... 12 3.4 接键可调部分 ..................................................... 12 3.5 系统照明和报警部分 ............................................... 13 3.6 系统复位与晶振电路 ............................................... 13 3.7 软件设计部分 ..................................................... 13 3.8 程序源程序:见附页1 .............................................. 14 4 调 试 ................................................................ 14

4.1 硬件调试 ......................................................... 14 4.2 软件的调试 ...................................................... 14 5.总结与展望 ............................................................ 16

5. 1工作总结 ........................................................ 16 5. 2展望 ............................................................ 16 参考文献: ............................................................... 17 致 谢 .................................................................. 18 附页1: 程序清单 ........................................................ 19

本科毕业论文(设计) 中文摘要

单片机照明灯智能控制器

电子信息科学科学与技术专业 2002级 马培 指导教师 邓于

摘 要

该夜用照明灯系统采用AT89S52单片机为核心,利用单片机的端口分别控制LCD1602标准时钟系统、可控硅和电铃,达到智能操控照明系统。我们常见的路灯、过道灯、草坪灯、广告箱灯、霓虹灯和厕所等公共场所用的一些照明灯往往彻夜通明,这不仅浪费能源,在某种程度上也造成了光污染。在今天电力能源供应比较紧张的情况下,在没有人员活动的深夜让这些灯关掉一些,不仅可以节约能源,也能够节约一些开支。本文主要介绍系统的开发背景,意义,并重点介绍了硬件设计和软件设计的过程。在硬件方面,从元件,模块,系统逐级阐述,特别是系统的核心部分AT89C52,并用PROTEL 99SE软件对原理图和电路板的制作。软件方面,用现阶段比较流行的单片机C语言编程,利用定时器中断控制标准时钟。最后是软硬件的调试,其中介绍了单片机仿真软件KEIL C51的使用。

关键词 AT89S52 可控硅 AT89c2051 LCD1602 光敏电阻 keil c51 PROTEL 99SE

I

本科毕业论文(设计) 英文摘要

Abstract

This night flare system is an system based on the AT89S52 monolithic integrated circuit, it makes use of the port of monolithic integrated to control the LCD1602 standard clock system, the silicon-controlled rectifier and the electric bell separately and then the lighting system was controlled by intelligence. Some common streets which are in public places ,such as: the aisle way light, the lawn lamp, the advertisement box lamp, the neon light and the restroom and so on the public place uses some flares often all night are brightly lit, this is not only wasting of energy, but also make the ray pollution in some kind of procedure. Nowaday , the electric power energy is in short supply, so if we turn off some when there is no people, it is not expenses. In this article,it introduces the systematic development background, the significance and especially the process of the hardware design and the software design .In the hardware aspect, this article elaborates the part, the module, the system one by one, especially the core of the system AT89C52,and uses the PROTEL 99SE. Software to the schematic diagram and the electric circuit board manufacture. In the software aspect with the present stage quite popular monolithic integrated circuit C language programming, uses the timer interrupt control standard clock. Finally it was the software and hardware debugging, in which introduced the in statons of the stations of monolithic integrated circuit simulation software KEIL C51 use.

Keyword AT89S52 silicon-controlled rectifier AT89c2051 LCD1602 photoresistance keil c51 PROTEL 99SE

II

1 绪论

1.1课题研究的背景

随着现代科技的飞速发展,单片机已经在各个领域得到越来越广泛的应用。单片机由于体积小,功耗低两个基本特征,在通讯,家电,工业控制,仪器仪表,汽车等产品中都可以看到单片机的身影。单片机技术也随着集成电路技术的进步在近几年飞速的发展,这种发展可以分为两方面

[1]:一

方面在硬件上单片机内部集成了越来越多的功能部件,如A/D,D/A,PWM,WATCHDOG,LCD驱动,串行口,大容量FLASH存储器等;另一方面在开发手段上从汇编语言向高级C语言过度,计算机仿真调试,IAP,ISP技术的应用使单片机开发周期大大的缩短,为各类产品更新,软件的升级提供了可靠的技术保障。在设计单片机应用系统时,由于历史的原因,目前在国内仍然以8051系列单片机为主。

作为电子专业的学生,非常有必要通过实际产品的设计和制作,了解现代IT产品的开发全流程。全面提高机,电,光,算知识的综合应用能力,掌握从系统级,电路级,到芯片级各个层次的设计和实现手段。基于上述原因,选择此设计课题,在此设计过程中,我们将会用到多门学科的理论知识,将对以前所学的知识做一个全面的复习和巩固,更重要的是培养了发现问题,分析问题,解决问题的能力,还有动手能力,也是一次很好的实践,对以后的学习和工作也会有所帮助。

1.2 开发的意义

科技的进步带动了产品的智能化,单片机的应用更是加快了发展的步伐,它的应用范围日益广泛,已远远超出了计算机科学的领域。小到玩具、信用卡,大到航天器、机器人,从实现数据采集、过程控制、模糊控制等智能系统到人类的日常生活,到处都离不开单片机,此设计正是单片机的一个典型应用。而此设计可以通过实现智能照明控制,通过对路面的检测,由单片机来控制其反应情况,使其变得智能化,使人的手解放出来,此系统还可以应用到道路检测,安全巡逻中,能满足社会的需要。

1.3 课题研究的方案

本选题是用单片机介绍一种使用AT89C2051单片机联合AT89S52制作的夜用照明灯智能控制器,采用两开两关的工作模式,即在天黑后自动开灯,过4小时后关灯;在天亮前1小时开灯,天亮后自动关灯。天黑后开灯的持续时间和天亮前提前开灯的时间可通过程序进行调整。由于本系统采用单片机对环境照度进行测试判断并进行计算,因此电路能随着季节的变化自动调节每天的开关灯的时间,从而达到自动节约电能的目的。

2 芯片选用说明[15]

2.1 AT89S52

2.1.1 相关芯片及其引脚分析

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编

第 1 页 共 27 页

马培:单片机照明灯智能控制器

程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

2.1.2 引脚功能说明

图1 51系列单片机40引脚图

VCC : 电源 GND: 地

P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。

P1口:P1口是一个具有内部上拉电阻的8位双向I/O 口,P1 输出缓冲器能驱动4个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX)具体如下表所示。 在flash编程和校验时,P1口接收低8位地址字节。

表1 P1口的第二功能

引脚号 P1.0 P1.1 P1.5 P1.6 P1.7 第二功能 T2(定时器/计数器T2的外部计数输入),时钟输出 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) MOSI(在系统编程用) MISO(在系统编程用) SCK(在系统编程用) P2口:P2 口是一个具有内部上拉电阻的8位双向I/O 口,P2输出缓冲器能驱动4个TTL逻辑 电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用

第 2 页 共 27 页

时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2输出缓冲器能驱动4个TTL逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表(2)所示。在flash编程和校验时,P3口也接收一些控制信号。

表2 P3口第二功能

引脚号 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD(串行输入) TXD(串行输出) INT0(外部中断0) INT0(外部中断0) T0(定时器0外部输入) T1(定时器1外部输入) WR(外部数据存储器写选通) RD(外部数据存储器写选通) RST: 复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。

ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置 “1”,ALE操作将无效。这一位置 “1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。

EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端

特殊功能寄存器:特殊功能寄存器(SFR)的地址空间映象所示。并不是所有的地址都被定义了。 片上没有定义的地址是不能用的。读这些地址,一般将得到一个随机数据;写入的数据将会无效。用户不应该给这些未定义的地址写入数据“1”。由于这些寄存器在将来可能被赋予新的功能,复位后,这些位都为“0”。

第 3 页 共 27 页

马培:单片机照明灯智能控制器

定时器2 寄存器:寄存器T2CON和T2MOD包含定时器2的控制位和状态位(如表2和表3所示),寄存器对RCAP2H和RCAP2L是定时器2的捕捉/自动重载寄存器。

中断寄存器:各中断允许位在IE寄存器中,六个中断源的两个优先级也可在IE中设置。 T2CON:定时器/计数器2控制寄存器 T2CON 地址为0C8H 复位值:0000 0000B 位可寻址:

表3 中断寄存器

TF2 EXF2 RLCLK TCLK EXEN2 7

6

5

4

3

TR2 2

C/T2 CP/RL21 0

2.2 AT89C2051[18]

2.2.1 相关芯片及其引脚分析

先介绍本系统中的核心器件AT89C2051。它是一带有2K字节闪速可编程可擦除只读存储器的低压、高性能8位CMOS微型计算机。它采用ATMEL的高密非易失存储技术制造并和工业标准MCS-51指令集和引脚结构兼容。ATMEL AT89C2051是一强劲的微型计算机,它对许多嵌入式控制应用提供一高度灵活和成本低的解决办法。

AT89C2051提供以下标准功能:2K字节闪速存储器,128字节RAM,15根I/O引线,两个16位定时器/计数器,六个中断源,一个全双工串行口,一精密模拟比较器以及片内振荡器和时钟电路。此外,AT89C2051是用可降到0频率的静态逻辑操作设计的并支持两种可选的软件节电工作方式。空闲方式停止CPU工作但允许RAM,定时器/计数器,串行口和中断系统继续工作。掉电方式保存RAM内容但振荡器停止工作并禁止所有其它部件的工作直到下一个硬件复位。

AT89C2051共有20条引脚,详见下图2:

图2 AT89C2051引脚图

各引脚功能如下:

RST(Pin1):复位输入。RST一旦变成高电平所有的I/O引脚就复位到“1”。当振荡器正在运行时,持续给出RST引脚两个机器周期的高电平便可完成复位。

OSC2(Pin4):作为振荡器反相放大器的输出。 OSC1(Pin5):作为振荡器反相放大器的输入和内部时钟发生器的输入。

第 4 页 共 27 页

GND(Pin10):地。 VCC(Pin20):电源电压。 P1口(Pin12~Pin19):P1口是一8位双向I/O口。口引脚P1.2~P1.7提供内部上拉电阻。P1.0 和P1.1还分别作为片内精密模拟比较器的同相输入(AIN0)和反相输入(AIN1)。

P3口:是带有内部上拉电阻的双向I/O口。它还用于实现AT89C2051的其它特殊功能。 P3.0为串行输入端口 P3.1为串行输出端口 P3.2为外中断0 P3.3为外中断1

P3.4为定时器0外部输入 P3.5为定时器1外部输入

2.3 LCD1602[19]

2.3.1相关芯片及其引脚分析 ◆主要技术参数: 显示容量: 芯片工作电压: 工作电流: 模块最佳工作电压: 字符尺寸: 16×2个字符 4.5~5.5V 20mA(5.0V) 5.0V 2.×4.35(WXH)mm 引脚说明 电压地 电源正极 液晶显示偏压信号 数据/命令选择端(H/L) 读/写选择端(H/L) 使能信号 Data I/O Data I/O 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 Data I/O Data I/O Data I/O Data I/O Data I/O Data I/O 背光源正极 背光源负极 ◆接口信号说明: 编号 1 2 3 4 5 6 7 8 符号 VSS VDD VL RS R/W E D0 D1 ◆外形尺寸:

◆控制器接口说明(HD44780及兼容芯片):

1 基本操作时序:

读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字 写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:无

读数据:输入:RS=L,RW=H,E=H 输出:D0~D7=数据

第 5 页 共 27 页

马培:单片机照明灯智能控制器

写数据:输入:RS=L,RW=H,D0~D7=数据,E=高脉冲 输出:无 2 状态说明字

STA7 STA6 STA5 STA4 D7

STA0-6 STA7 当前数据地址指针的数值 读写操作使能 1:禁止 0:允许 D6

D5

D4

STA3 D3

STA2 STA1 STA0 D2

D1

D0

注:对控制器每次进行读写操作之前,都必

须进行写控制,确保STA7为0 RAM地址映射图 LCD 控制器内部带有808位(80 16字×2行 字节)的RAM缓冲区,对应 关系如右图所示: 3 指令说明 初始化设置: 显示模式设置 指令码 0 0 1 1 1 0 0 0 显示开/关及光标设置 指令码 0 0 0 0 1 D C B 功能 D=1 开显示 D=0 关显示 C=1 显示光标 C=0 不显示光标 B=1 光标闪烁 B=0 光标不显示 N=1 当读或写一个字符后地址指针加 一,且光标加一 N=0当读或写一个字符后地址指针减 一,且光标减一 S=1 当写一个字符,整屏显示左移(N=1) 或右移(N=0),以得到光标不移动而屏幕移动的效果。 S=0 当写一个字符,整屏显示不移动 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 功能 设置16×2显示,5×7点阵,8位数据接口 0 0 0 0 0 1 N S 数据控制:

控制器内部 设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM 数据指针设置 指令码 80H+地址码(0-27H,40H-67H)

其他设置 指令码 01H 02H 4 初始化过程 第 6 页 共 27 页

功能 设置数据地址指针 功能 显示清屏:1数据指针清零 2所有显示清零 显示回车:1数据指针清零

延时15ms

写指令38H(不检测忙信号) 延时5ms

写指令38H(不检测忙信号) 延时5ms

写指令38H(不检测忙信号)

(以后每次写指令、读/写数据操作之前均需检测忙信号) 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏

写指令06H:显示光标移动设置 写指令06H:显示开及光标设置 2.3 SMC1602A参考连接:

1 8051系列总路线方式

2 8051系列模拟口线方式

◆ 控制器接口时序说明(HD44780及兼容芯片)

1 读操作时序

第 7 页 共 27 页

马培:单片机照明灯智能控制器

2 写操作时序

3 时序参数

极限值 最小值 400 150 - 30 10 - 20 40 10 典型值 - - - - - - - - - 最大值 - - 25 - - 100 - - - 时序参数 E信号周期 E脉冲宽度 E上升/下降沿时间 地址建立时间 地址保持时间 数据建立时间(读操作) 符号 tc Tpw Tr,tf Tsp1 Thd1 Td 单位 ns ns ns ns ns ns ns ns ns 测试条件 引脚E 引脚E、RS、R/w 引脚D0~D7 数据保持时间(读操作) Thd2 数据建立时间(写操作) Tsp2 数据保持时间(写操作) Thd2 3.系统硬/软件设计

3.1 夜用照明系统的设计

3.1.1方案论证和比较

第 8 页 共 27 页

1 采用NE555时基电路来进行定时,以便控制开关的时间,其他各系统单元分别用相应独立的电路来完成,其方框图如图3所示:

光敏电阻 接收电路 NE555定时电路 系统标准时钟电路 系统处理 电路 (LED)发光二极管 (照明电路) (BELL) 哄鸣器部分 图3

2 采用CPLD芯片来完成,其处围电路简单,具体方框图如图4所示:

(BELL) 哄鸣器部分 光敏电阻 接收电路 时钟 显示电路

(ATMEL) ATF1508AS CPLD芯片 (LED)发光二极管 (照明电路) 基本处围 电路 图4

综合以上三种设计方案,第一种精度较低,而且各部分全部采用模拟器件来组成部分,制作复杂;第二种采用CPLD元件来组成,要求对硬件描述语言(VHDL)要求较高,且控制时间准确,电路工作稳定;第三种方案采用单片机(AT89C/S52或者AT89C2051)制作调试方便、控制时间准备,电路工作稳定,而且非常简单(硬件部分)、使用范围广。为此本设计将选用第三种方案。

3 采用AT89S52和AT89C2051微处理芯片,来控制智能照明系统,具体方框图如图5所示: 本系统采用光敏电阻来感应(天亮/灭), 利用AT89C2051在内部构造了一个模拟信号比较器其输入端连到P1.0和P1.1口,P1.0和P1.1口的第二个功能分别为比较器的同相输入端和反相输入端,比

第 9 页 共 27 页

马培:单片机照明灯智能控制器

(LCD1602)显示部分 按键设置部分 (LED)发光二极管 AT89S52 微处理器 AT89C2051 微处理器 (BELL) 哄鸣器部分 基本外围 (晶振和复位) 电路 图5

光敏电阻 接收电路 结果存入P3.6口对应的寄存器,P3.6在AT89C2051外部无引脚。由于AT89C2051的引脚不够,所以多加一块AT89C/S52来扩展系统标准时钟电路,AT89C2051的P3.7脚与AT89S52的P3.7脚相连接,

R6为光敏电阻,其电阻值随着光线的增强而减少,当照度较小时P1.1口的电位小于P1.0口的电位,P3.6口输出高电平,只有在AT89C2051的ROM中写入相应的程序就可以控制P3.7口的电平,从而控制

图 6

AT89C/S52的P3.7口的电平,从而达到控制外围电路(照明与电铃电路),可变电阻的度的控制阈值。

由于本系统处理任务不复杂,所以在标准时钟电路采用模拟口线方式。如图9所示: 电源采用7805稳压集成芯片来提供稳定单片机夜用照明系统的电源,从而能够稳定的工作。 由于本电路比较复杂,采用传统万能板焊接时(要求焊接技术比较高),而且非常麻烦(飞线多),导致焊点大(不美观)所以采取自己做PCB,采用Protel 99 SE软件来画单片机夜用照明系统的原理图(.sch)和印制板(.pcb),最终效果图如图8:

3.2 标准时钟显示部分设计:

在小规模点阵液晶模块上使用液晶显示驱动控制器组成液晶显示驱动控制系统是非常有益的。

第 10 页 共 27 页

这使得液晶显示模块的硬件电路简单化,从而降低模块的成本。但是这也同时提高了对软件功能的

图7 照明灯智能控制器原理图

图8 PCB单面板

要求,也就是说,许多显示功能如光标、字符库、闪烁等都需要由软件编制而成。HD61203和HD61202就是这类液晶显示驱动控制器套件。之所以称它们为套件是因为HD61206和HD61202必须配套使

第 11 页 共 27 页

马培:单片机照明灯智能控制器

用,通常有12864和19264两种规格。 硬件电路部分:

图9 标准时钟显示电路

本液晶显示模块(LCD1602)采用模拟口线方式,该连接方式简单。微处理器AT89C/S52的P0口通过数据锁存器(74HC573)分别与液晶显示模块(LCD1602)的数据端(DB)相连接,数据命令选择端(RS)、读写选择端(R/W)、使能信号端(E)分别与微处理器AT89C/S52的P2.3口、P2.4口、P2.5口相连接。

3.3 光敏接收电路

该部分电路是通过AT89C2051里面的模拟信号比较器,R7为光敏电阻,其电阻值随着光线的增强而减少,当照度较小时P1.0口的电位,P3.6口输出高电平。变可变电阻RP1的1.1口的电位小于P阻值可调整照度的控制阈值,如图7所示。由于微处理器AT89C2051的P3.7口与AT89C/S52的P3.7口相连接,所以只要在AT89C2051的ROM中写入相就的程序,就可以控制到AT89C/S52,从而可以采取一系统的动作(照明和电铃电路)。

图10 光敏接收电路

3.4 接键可调部分

由于本系统设置功能部分要求比较简单(标准系统调时和),所以采用独立式按钮调节,端口用

第 12 页 共 27 页

P1.0、P1.2、P1.1、P1.3,如图11所示:

图11 独立式接键可调电路

3.5 系统照明和报警部分

照明部分由Q1、R11、R10、R12、K、DS组成,当口输出高电平时,三极管Q1截止,双向可控硅DS因没有触发电流处于阻断状态,电灯LAMP关闭;当P1.7口输出低电平时,三极管Q1导通饱和,向双向可控硅DS提供触发电流使其进入导通状态,电灯LAMP点亮。P3.6口的输出状态由程序控制。

报警部分由Q2、U9、R20组成,当P3.5口输出高电平时Q2截止,U9有微电流或者无电流通过,BELL不工作。P3.5口的输出状态由程序控制。

图12 照明和报警电路

3.6 系统复位与晶振电路

该电路为AT89C2051和AT89C/S52提供时钟基准与复位,如图13所示:

3.7 软件设计部分

第 13 页 共 27 页

马培:单片机照明灯智能控制器

图13 系统复位与晶振电路

3.8 程序源程序:见附页1

4 调 试

4.1 硬件调试

1. 首先是焊接的顺序问题。当初板子做好以后,焊接的顺序很重要,应该是应该按功能划分的 器件进行焊接,顺序是功能部件的焊接--调试--另一功能部件的焊接,这样容易找到问题的所在。

2. 如果在调试按功能划分的器件上出现问题,可以按以下步骤进行: 1)检查原理图连接是否正确 2)检查原理图与PCB图是否一致

3)检查PCB板上的封装引脚是否与实际采购的器件引脚一致 4)用万用表检查是否有虚焊,引脚短路现象

5)检测各器件的电路输出端口的输出是否与理论值相等或者接近。(在测光敏电阻电压的时候,其引脚1,7的输出很小,原来是电位器的调节引起的)。

3. 多观察,多思考。在调试过程中,对于出现的任何现象都不要放过,问题的解决就是从一些小的 现象入手的。

4. 有可能的情况下,最好做两块板子以上,因为焊好的板子不便于查看其导线的走向,这样才好有个比较,硬件上很小的问题有很多时候是很难发现的。

4.2 软件的调试

[11]

源程序编好以后,验证其正确性,MCS-51单片机可以通过常用的仿真软件Keil C51来调试,它可以对汇编或者C语言编的程序进行调试。

1建立工程文件

1)点击菜单project,选择new project:

2)然后选择要保存的路径,输入工程文件的名字,比如保存到论文目录里,工程文件的名字为hjycar.uv2.

3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil

第 14 页 共 27 页

c51几乎支持所有的51核的单片机,这里选AT89S52。

开 始P3_7=0 (At89s52) P3.6=0灯亮 T1开始计时 P3_6=0 ? P3_7=0 (At89c2051) First? Hour=4? 存取时间(天黑) BELL打铃 P3.6=1灯灭 天亮? 12V 5V BELL打铃 存取时间(天亮) BELL打铃 亮-1? P3.6=0灯亮 天亮? P3.6=1灯灭 图14 单片机照明灯智能控制器流程图

4)这时要新建一个源程序文件,建立一个汇编或c文件,输入编写好的程序。

5)保存。选择要保存的路径,在文件名里输入文件名,注意一定要输入扩展名,如果是c程序文件,扩展名为.c,如果是汇编文件,扩展名为.a51,这里有汇编语言,文件名为:hjycar.asm。

2 调试程序

1)点击Target 1前面的+号,展开里面的内容source Group1:

2)用右键点击Sourece Group 1(注意用鼠标的右键,而不是左键),将弹出一个菜单,选择Add Files to Guoup'Source Group 1'.

3)选择刚才的文件hjycar.asm.这时在source group 1 里就有hjycar.asm文件

第 15 页 共 27 页

马培:单片机照明灯智能控制器

4)单击“Project”菜单,再在下拉菜单中单击“Built Target”选项(或者使用快捷键F7),

编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/Stop Debug Session”(或者使用快

捷键Ctrl+F5),

5)单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键F5),然后再单击“Debug”菜单,在下拉菜单中单击“Stop Running”选项(或者使用快捷键Esc);再单击“View”菜单,再在下拉菜单中单击“Serial Windows #1”选项,就可以看到程序运行后的结果.

3 程序的加载

单击“Project”菜单,再在下拉菜单中单击“ ” 在下图中,单击“Output”中单击“Create HEX File” 选项,使程序编译后产生HEX代码,供下载器软件使用。把程序下载到AT89C52单片机中。

5.总结与展望

5. 1工作总结

经过三个多月的努力,我基本上完成了基于AT89C2051和AT89C/S52微处理器控制的单片机夜用照明显示系统。所完成的工作主要包括以下几个方面:

1 准备阶段的工作

准备阶段的工作主要包括:查阅国内外相关文献,了解微控制器的发展过程及发展趋势,了解LCD显示屏的工作原理、主要作用。

2 对显示系统的硬件设计

本文采用单片机与液晶显示模块(LCD1602)模拟口线方式。该模拟口线方式简单,比较容易控制液晶显示模块(LCD1602)。

3 系统软件设计

软件主要包含时钟判断和显示程序,调用不同指令来完成相应的功能。本单片机夜用照明系统 采用单片机C语言来编写,在其编写过程当中比较方便的调用单片机内部的资源,从而比较容易控制与单片机相联系的外围电路。

5. 2展望

尽管本系统能够完成我们所要求的任务来控制照明系统,并且体现出了物优价廉的优越性,但由于本人水平和开发时间有限,离一个完全实用的,能够完全符合市场需求的单片机夜用照明显示系统还有一定的差距。因此,在以后的研制过程中,还需要在系统抗干扰方面、增强显示效果、提高其灵敏度及功能上做大量工作,以满足更高使用要求。

第 16 页 共 27 页

参考文献:

[1] 刘文涛 单片机语言C51典型应用设计[M] 人民邮电出版社2005,1(1):5-8 [2] 求是科技 单片机典型模块设计实例导航[M] 人民邮电出版社 1995,1(4):32-34 [3] 赵亮 侯国锐 单片机C语言编程与实例[M] 人民邮电出版社 1995,1(6):37-38 [4] 稻叶 保[日] 振荡电路的设计与应用[M] 科学出版社 1997,19(3):71-72 [5] 猪饲国夫 本多中二[日] 数字系统设计[M] 科学出版社 1998,1(2):122-124 [6] 铃木雅臣[日] 晶体管电路设计(上)(下)[M]科学出版社 2003,1(6):92-93 [7] 冈村迪夫[日] OP放大电路设计[M] 科学出版社 2003,1(6):92-93

[8] 杨帮文 应用电路百例丛书 新型集成器件实用电路[M] 电子工业出版社 ,2004,1(34):13-14 [9] 求是科技 李现通 串口通信技术与工程实践[M] 人民邮电出版社 2001,3(2):56-58 [10] 杨金岩 8051单片机数据传输接口扩展技术与应用实例[M] 人民邮电出版社 1996,1(2):1-5 [11] keil c51的使用[M] 人民邮电出版社 1998,1(2):122-124 [12] 电子制作工作室 电子制作[J] 电子制作杂志社 2005,2(3):23-24 [13] 吉雷.Protel 99—从入门到精通[M]西安电子科技大学出版社.2000.10 [14] 张友德.单片微型机原理、应用和实验[M] 复旦大学出版社.1996.10 [15] ATMEL公司 AT89S52的技术手册[J]. 2002.3

[16] 深圳市中源单片机发展有限公司[J] AT89C52 Datasheets. 1994.7 [17] http://www.tzdiy.com/Soft_Show.asp?SoftID=25 2005.8

[18] http://www.happycampus.com.cn/pages/2004/06/08/D142698.html 2006.5 [19] http://www.tzdiy.com/Soft_Show.asp?SoftID=14 2006.5

第 17 页 共 27 页

本科生毕业论文(设计) 致谢

致 谢

在毕业设计期间,我得到了许多热心的教师、同学的帮助,在此表示深深的谢意。

首先,我衷心地感谢我的导师邓于实验师。他耐心的教诲和严谨的态度使我受益匪浅,正是他在各方面的精心指导才使我最终完成了课题。

同时,我也要感谢马培、梁成山同学。在整个毕业设计期间,正是我们积极的讨论及他们的全力协助,才使我的课题以较快的速度完成。

最后,我不能不对在百忙之中抽出宝贵时间来参加参加论文评阅的各位教师表示由衷的谢意,他的的指导不但能修正论文中的错误,而且也使我得以真知。

由于本人学识有限,文中必有不妥之处,敬请各位教师批评指正。

第 18 页 共 27 页

张 露

2006年5月于重庆永川

附页1: 程序清单

//************************************ //**********1602-LED or Clock********* //************************************ #include \#include \

//************************************************************

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar bdata flag;

sbit start=flag^0;//设置时间标志位 sbit start1=flag^1; sbit start2=flag^2; sbit start3=flag^3; sbit start4=flag^4; sbit start5=flag^5; sbit start6=flag^6; sbit start7=flag^7; bit casp; sbit rs=P2^3; sbit rw=P2^4; sbit e =P2^5;

uchar code table1[]={'M','C','U',' ','C','l','o','c', 'k',' ','S','y','s','t','e','m'}; uchar code table2[]={' ',' ',' ',' ',' ',':',' ',' ', ':',' ',' ','.',' ',' ',' ',' '};

uchar code table3[]={'0','1','2','3','4','5','6','7','8','9','S','e','t',' ',' ',' '};

uchar second_l,second,minte,hour; uchar count,buffer[7],count1;

uchar tempsecond,tempminte,temphour;

uchar tempdaysecond,tempdayminte,tempdayhour; void display(void); void scankey(void); void delaysecond(void); void delayfirst(void); void write(void); void enable(void); void sys_init2(void); void temptime(void); void checktime(void); void checkdaytime(void);

第 19 页 共 27 页

void tempdaytime(void); void callmusic(void);

void checkled(uchar checkled,uchar checkled1,uchar jnz); //***************************************************** uchar T1count; uchar T1minte;

uchar bdata Tofirst1; sbit Tofirst=Tofirst1^0; sbit firstday=Tofirst1^1; //*************************** //**********main************* //*************************** void main(void) {

uchar i; // P0=0x01;enable(); // P0=0x38;enable(); // P0=0x0c;enable(); // P0=0x80;enable(); // for(i=0;i<16;i++) {

P0=table1[i]; // write(); // }

P0=0xc0;enable(); //for(i=0;i<16;i++) {

P0=table2[i]; // write(); // }

TMOD=0x11; //TH0=(65536-50000)/256; //TL0=(65536-50000)%6; //TH1=(65536-50000)/256; //TL1=(65536-50000)%6; //sys_init2(); //ET1=1; //ET0=1;TR0=1;EA=1; //start2=0;start=0;start1=0; //hour=12;minte=59; //while(1) {

if(Tofirst==0) {

if(P3_7==0)

定义字符变量 i 从液晶显示地址(0x80),开始逐步写入16个字符调用写数据子程序 液晶显示地址(0xc0) 从液晶显示地址(0xc0),开始逐步写入16个字符调用写数据子程序 初始化定时器0/1的状态寄存器 赋初值给定时器0TH0 赋初值给定时器0TL0 赋初值给定时器1TH1 赋初值给定时器1TL1 调用启动定时器2子程序 允许定时器1中断

允许定时器0中断,启动定时器0,允许CPU中断 位寻址区start2,start,start1为0

时缓冲区赋初值为12,分缓冲区赋初值为59 第 20 页 共 27 页

{

P3_6=0; //灯亮

temptime(); //记录天黑后的时间,用于4个小时之后灯灭(P3_6=1) TR1=1; } }

//if(P3_7==0){P1_7=0;TR1=1;Tofisrt=1;}只执行一次

if(P3_7==1) {

P3_6=1; //灯灭 tempdaytime(); } } }

//************************ //******write************* //************************

void write(void) //液晶写数据子程序 {

rs=1; //rs=1; rw=0; //rw=0; e=0; //e=0;

delayfirst(); //调用延时子程序 e=1; //e=1; }

//********************** //*******enable********* //**********************

void enable(void) //液晶使能子程序 {

rs=0; //rs=0; rw=0; //rw=0; e=0; //e=0;

delayfirst(); //调用延时子程序 e=1; //e=1 }

//**************************** //*********timer************** //**************************** void timer0()interrupt 1 using 0 {

TH0=(65536-50000)/256; //赋初值定时器0给TH0

第 21 页 共 27 页

TL0=(65536-50000)%6; //赋初值定时器0给TL0

if((P1&0x0f)!=0x0f) //判断P1.0-P1.4是否有键按下 {

delaysecond(); //调用键盘延时子程序,用于消除干扰 if((P1&0x0f)!=0x0f) //判断P1.0-P1.4是否有键按下 {

scankey(); //调用键盘扫描子程序scankey() } }

count++; //计数单元count自加加 if(count==2) //如果计数单元count为2 {

count=0; //计数单元count清零 second_l++; //second_l缓冲区自加加 if(second_l==10) //如果second_l0缓冲区为10 {

second_l=0; //second_l秒缓冲区赋值为0 second++; //second缓冲区自加加

if(second==60) //如果second缓冲区的内容为24 {

second=0; ///second缓冲区赋值为0 minte++; //minte缓冲区自加加

if(minte==60) //如果minte缓冲区内容为60 {

minte=0; //minte缓冲区赋值为0 hour++; //hour缓冲区自加加

if(hour==24) //如果hour缓冲区的内容为24 {

second=0; //把second缓冲区的内容赋值为0 minte=0; //把minte缓冲区的内容赋值为0 hour=0; //把hour缓冲区的内容赋值为0 } } }

} } }

//******************************** //***********display************** //******************************** void display(void) {

uchar i; //定义字符型变量i

第 22 页 共 27 页

buffer[0]=second/10; //取出秒缓冲区(second)的高位,放入数组缓冲区buffer[0]

buffer[1]=second; //取出秒缓冲区(second)的高位,放入数组缓冲区buffer[1]

buffer[2]=minte/10; //取出分缓冲区(minte)的高位,放入数组缓冲区buffer[2]

buffer[3]=minte; //取出分缓冲区(minte)的高位,放入数组缓冲区buffer[3]

buffer[4]=hour/10; //取出时缓冲区(hour)的高位,放入数组缓冲区buffer[4]

buffer[5]=hour; //buffer[5]

buffer[6]=second_l; //if(start==0) //{

P0=0xc0;enable(); //for(i=13;i<16;i++) {

P0=table3[i]; //P0 write(); //} }

if(start==1) // {

P0=0xc0;enable(); //for(i=10;i<13;i++) {

P0=table3[i]; //P0 write(); //} }

P0=0xc3;enable(); //for(i=4;i<6;i++) {

P0=table3[buffer[i]]; //P0 write(); // }

P0=0xc6;enable(); // for(i=2;i<4;i++) {

P0=table3[buffer[i]]; //P0 write(); // }

P0=0xc9;enable(); //

取出时缓冲区(hour)的高位,放入数组缓冲区取出0.6秒,放入数组缓冲区buffer[6] 判断是否为设置标志位,start==0为假 从液晶地址(0xc0)开始写数据 口输出table3[]数组里面的数据 调用写数据子程序 判断是否为设置标志位,start==1为真 从液晶地址(0xc0)开始写数据 口输出table3[]数组里面的数据 调用写数据子程序 从液晶地址(0xc6)开始写数? 口输出table3[]数组里面的数据 调用写数据子程序 从液晶地址(0xc6)开始写数据 口输出table3[]数组里面的数据 调用写数据子程序 从液晶地址(0xc9)开始写数据

第 23 页 共 27 页

for(i=0;i<2;i++) {

P0=table3[buffer[i]]; //P0口输出table3[]数组里面的数据 write(); //调用写数据子程序 }

P0=0xcc;enable(); //从液晶地址(0xcc)开始写数据 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数

P0=table3[buffer[6]]; //P0口输出table3[]数组里面的数据 write(); //调用写数据子程序 }

//******************************** //******************************** void timer1()interrupt 3 using 1 {

TH1=(65536-50000)/256; //重新赋值给定时器1的TH1 TL1=(65536-50000)%6; //重新赋值给定时器1的TL1 checktime(); checkdaytime(); }

//*************************************************** void sys_init2(void) //初始化定时器2 {

T2CON = 0x04; //*加载定时器2的控制寄存器

T2MOD = 0x00 //*加载定时器2的模式寄存器*/ TH2 = 0xFC; //*加载定时器2的高位字节*/

RCAP2H = 0xFC; //*加载定时器2的重装寄存器的高位字节*/ TL2 = 0x18; //*加载定时器2的低位字节*/

RCAP2L = 0x18; //*加载定时2器2的重装寄存器的低位字节*/ ET2 = 1; //*使能定时2中断*/ TR2 = 1; //*启动定时器2*/ }

//**************************************************** void timer2(void)interrupt 5 using 1 {

display(); //调用显示子程序 }

//********************************** void temptime(void) {

tempsecond=second; //把此时秒(second)缓冲区的值赋给tempsecond tempminte=minte; //把此时分(minte)缓冲区的值赋给tempminte temphour=hour; //把此时时(hour)缓冲区的值赋给tempdayhour temphour=temphour+4; //把此时时(temphour)缓冲区的值加4

第 24 页 共 27 页

}

//**********************************

void tempdaytime(void) {

tempdaysecond=second; //把此时秒(second)缓冲区的值赋给tempdaysecond tempdayminte=minte; //把此时分(minute)缓冲区的值赋给tempdayminte tempdayhour=hour; //把此时秒(hour)缓冲区的值赋给tempdayhour tempdayminte=tempdayminte-1; //把此时秒(second)缓冲区的值赋给tempdaysecond firstday=1; }

//********************************************************************* //********************************

void checkdaytime(void) //用于检测是否是天亮前1个小时到否 {

if(hour==temphour) //如果小时(hour)到,向下检测 {

if(minte==tempminte) //如果分钟(minute)到,再向下检测 {

if(second==tempsecond) //如果秒(second)到,执行下面指令(P3_6=0) {

P3_6=0; //灯亮 Tofirst=0; } } } }

//***************************

void checktime(void) //用于检测是否是天亮前1个小时到否 {

if(hour==temphour) //如果小时(hour)到,向下检测 {

if(minte==tempminte) //如果分钟(minute)到,向下检测 {

if(second==tempsecond) //如果秒(second)到,执行下面指令(P3_6=1) {

P3_6=1; //灯灭 Tofirst=1; } } } }

//***************************

void scankey(void) //键盘扫描程序,用于调整标准时钟的时间

第 25 页 共 27 页

{

uchar key; //定义一个字符变量,用于存放P1口的数据 key=P1; //把P1口的数据传送给key存储单元 switch(key) //应用switch语句,以便判断下面状态 {

case 0xfe: minte++; //当P1口等于0xfe时,minte++

callmusic(); //同时调用callmusic()子程序,以便识别P1.0口按下 if(minte==60) //当minte等于60时,执行minte=0 {

minte=0; //执行minte=0语句 }

break;//退出switch语句

case 0xfd: hour++; //当P1口等于0xfd时,hour++

callmusic(); //同时调用callmusic()子程序,以便识别P1.1口按下 if(hour==24) //当hour等于24时,执行hour=0 {

hour=0; //执行hour=0语句 }

break;//退出switch语句

case 0xfb:callmusic(); break;

} }

//********************** //*******delay********** //**********************

void delayfirst(void) //延时子程序1,用于液晶显示 {

uchar i,j; //定义两个字符变量i,j

for(i=1;i<30;i++) //用两个for循环语句来实现延时 for(j=1;j<19;j++); }

//**********************

void delaysecond(void) //延时子程序2,用于键盘去抖动 {

uchar i,j; //定义两个字符变量i,j for(i=1;i<150;i++)

for(j=1;j<=110;j++); //用两个for循环语句来实现延时 }

void callmusic(void) //响铃子程序,用于驱动器BELL发声 {

uint key; //定义一个整形变量

第 26 页 共 27 页

key=1; //初始化key=1

while(key) //当key值为真时,执行下面语句 { _nop_(); //调用_nop_();函数

P1_7=~P1_7; //P1_7取反,使之高低电平变换 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); // _nop_(); // _nop_(); // _nop_(); // _nop_(); // P1_7=~P1_7; //P1_7 _nop_(); // _nop_(); // _nop_(); // _nop_(); // _nop_(); //key++; //keyif(key==2400) //{

key=0; //key} } }

调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数

取反,使之高低电平变换 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 值++

当key值等于2400时 值再赋于0 第 27 页 共 27 页

key=1; //初始化key=1

while(key) //当key值为真时,执行下面语句 { _nop_(); //调用_nop_();函数

P1_7=~P1_7; //P1_7取反,使之高低电平变换 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); //调用_nop_();函数 _nop_(); // _nop_(); // _nop_(); // _nop_(); // _nop_(); // P1_7=~P1_7; //P1_7 _nop_(); // _nop_(); // _nop_(); // _nop_(); // _nop_(); //key++; //keyif(key==2400) //{

key=0; //key} } }

调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数

取反,使之高低电平变换 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 调用_nop_();函数 值++

当key值等于2400时 值再赋于0 第 27 页 共 27 页

本文来源:https://www.bwwdw.com/article/oxi3.html

Top