小区自动售水机课计报告Word文件下载.docx
《小区自动售水机课计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《小区自动售水机课计报告Word文件下载.docx(38页珍藏版)》请在冰豆网上搜索。
1.3.AD转换单元
通过光敏电阻RD1和AD转换芯片PCF8591组成的亮度检测电路(亮度值转换为PCF8591通道1的电压)检测环境亮度;
当PCF8591通道1输入的电压小于1.25V时,L1灯点亮,大于1.25V时L1熄灭。
二总体设计方案
本系统在实验平台CT107D基础上进行设计,设定按键S7为出水控制按键,当S7按下后,售水机持续出水(继电器接通,指示灯L10点亮)。
通过4位数码管DS2显示当前出水量(出水时,单位为升)和总价(停止时,单位为元):
通过光敏电阻RD1和AD转换芯片PCF8591组成的亮度检测电路(亮度值转换为PCF8591通道1的电压)检测环境亮度;
系统整体框图如下:
三硬件电路设计及原理分析
3.1系统整体电路图
该系统主要由单片机最小系统、数码管显示模块、AD转换模块、按键模块组成。
因P0口所连接的设备较多(数码管,LED,继电器,蜂鸣器等),采用38译码器和锁存器进行对P0端口进行了扩展,单片机选取12M晶振。
3.2单片机的工作原理
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
该单片机具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构
(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
其引脚图如下
引脚说明:
VCC(40引脚):
电源电压
VSS(20引脚):
接地
P0端口(P0.0~P0.7P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入每个引脚能驱动写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashROM编在程时,P0端口接收指令字节端口接收指令字节;
而在校验程序时,则输出指令字节则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),在对FlashROM编程和程序校验时,P1接收低8位地址。
P2端口(P2.0~P2.7,21~28引脚):
P2口是一个带内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流I。
在访问外部程序存储器和16位地址的外部数据存储器时,P2送出高8位地址。
在访问8位地址的外部数据存储器时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。
在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。
P3端口(P3.0~P3.7,10~17引脚):
P3是一个带内部上拉电阻的8位双向I/O端口。
P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。
P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。
在对FlashROM编程或程序校验时,P3还接收一些控制信号。
P3口除作为一般I/O口外,还有其他一些复用功能.
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。
看门狗计时完成后,RST引脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/ROG(30引脚)地址锁存控制信号:
(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚(ROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址位8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOV指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址位8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
外部程序存储器选通信号(SEN)是外部程序存储器选SEN(29引脚)通信号。
当AT89C51RC从外部程序存储器执行外部代码时,SEN在每个机器周期被激活两次,而访问外部数据存储器时,SEN将不被激活。
A/VPP(31引脚)访问外部程序存储器控制信号:
为使能从0000H到FFFFH的外部程序存储器读取指令,A必须接GND。
注意加密方式1时,A将内部锁定位RESET。
为了执行内部程序指令,A应该接VCC。
在Flash编程期间,A也接收12伏VPP电压。
XTAL1(19引脚):
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
单片机最小系统介绍:
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。
对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路。
复位电路:
由电容串联电阻构成,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的
51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平。
晶振电路:
典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)特别注意:
对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;
当接低电平时,复位后直接从外部ROM的0000H开始执行。
在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。
所以可以通过按键的断开和闭合在运行的系统中控制其复位。
在电路图中,电容的的大小是10uF,电阻的大小是10k。
所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。
也就是说在单片机启动瞬间,电容两端的电压时在0~3.5V增加。
这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。
所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。
在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。
所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。
在单片机启动后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。
当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。
随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。
根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。
单片机系统自动复位。
3.3数码管的工作原理
数码管由8个发光二极管(以下简称字段)构成,通过不同的组合可用来显示数字
0~
9,字符
A~F、H、L、P、R、U、Y
等符号及小数点“.”。
数码管又分为共阴极和共阳极两种类型。
共阳极数码管中8个发光二极管的阳极(二极管正端)连接一起,即为共阳极接法,简称共阳数码管。
通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。
当某段驱动电路的输入端为低电平时,该端所连接的字段导通并点亮。
根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管中8个发光二极管的阴极(二极管负端)连接在一起,即为共阴极接法,简称共阴数码管。
通常,共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。
当某段驱动电路的输出端为高电平时,该端所连接的字符导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。
同样,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
单片机系统扩展LED数码管时多用共阳LED:
共阳数码管每个段笔画是用低电平(“0”)点亮的,要求驱动功率很小;
而共阴数码管段笔画是用高电平(“0”)点亮的,要求驱动功率较大。
通常每个段笔画要串一个数百欧姆的降压电阻。
八段LED数码管段代码编码表(连线不同可有多种表):
字形0123456789黑
共阳C0F9A4B0999282F88090FF
共阴3F065B4F666D7D077F6F00
3.4译码器的工作原理
74LS138为3线-8线译码器
工作原理
1、当一个选通端(E1)为高电平,另两个选通端((/E2))和(/E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。
比如:
A2A1A0=110时,则Y6输出端输出低电平信号。
2、利用E1、E2和E3可级联扩展成24线译码器;
若外接一个反相器还可级联扩展成32线译码器。
3、若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
4、可用在8086的译码电路中,扩展内存。
引脚功能
A0~A2:
地址输入端
STA(E1):
选通端
/STB(/E2)、/STC(/E3):
选通端(低电平有效)
/Y0~/Y7:
输出端(低电平有效)
VCC:
电源正
GND:
地
A0~A2对应Y0--Y7;
A0,A1,A2以二进制形式输入,然后转换成十进制,对应相应Y的序号输出低电平,其他均为高电平;
3.5AD转换器的工作原理
概述:
AD转换器采用集AD与DA于一体的PCF8591芯片,该芯片具有如下特点:
单电源供电
工作电压:
2.5V~6V
待机电流低
I2C总线串行输入/输出
通过3个硬件地址引脚编址
采样速率取决于I2C总线速度
4个模拟输入可编程为单端或差分输入
自动增量通道选择
模拟电压范围:
VSS~VDD
片上跟踪与保持电路
8位逐次逼近式A/D转换
带一个模拟输出的乘法DAC
引脚图:
AIN0~AIN3:
模拟信号输入端。
A0~A3:
引脚地址端。
VDD、VSS:
电源端。
(2.5~6V)
SDA、SCL:
I2C总线的数据线、时钟线。
OSC:
外部时钟输入端,内部时钟输出端。
EXT:
内部、外部时钟选择线,使用内部时钟时EXT接地。
AGND:
模拟信号地。
PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。
器件的地址、控制和数据通过两线双向I2C总线传输。
器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。
最大转换速率取决于I2C总线的最高速率。
A/D转换的基本原理是:
将参考电平按最大的转换值量化,再利用输入模拟电平与参考电平的比例来求得输入电平的测量值(V测=V参*(AD量化值/AD转换的最大值))。
有些MCU
A/D转换的参考电平可以选择由一个外部引脚输入,这样使得用户可以对A/D转换进行更好的控制。
值得注意的一点就是A/D转换的输入电平必须比参考电平低或相等,不然测试的结果就会有很大的偏差。
下面以参考电平为5V,转换的精度为8位为例来说明如何取得实际的测量值是多少。
如果AD量化值为128,则V测=
5*128/256=2.5V。
因为V测=V参*(AD量化值/AD转换的最大值)=AD量化值*(V参/AD转换的最大值),而针对具体的硬件电路,“V参/AD转化的最大值”是一个固定的系数。
而这个系数,就相当于测试的精度了。
对于10位的A/D,5V的参考电压的测试精度约5毫伏,而用2.048伏的参考电压,精度就可以达到2毫伏。
当然测试的电压范围相应的也减小了。
我曾经就用这种减小测量范围来提高精度,使用PIC16F76做A/D测量,使得正负误差不超过5毫伏的高精度测试电源。
当误差超过5毫伏时,电路发出报警声,提示操作员,重新调解电压到规定范围内。
器件寻址:
PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。
由PHILIPS公司规定AD器件地址为1001,引脚地址为A2A1A0,其值由用户选择因此系统中最多可接8个具有I2C接口的器件,地址的最后一位为方向为R/W,当单片机对A/D器件进行读操作时为1,进行写操作时为0,总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。
3.6LED灯工作原理
LED(LightEmittingDiode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。
LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。
半导体晶片由两部分组成,一部分是P型半导体大功率LED灯珠,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。
但这两种半导体连接起来的时候,它们之间就形成一个P-N结。
当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。
而光的波长也就是光的颜色,是由形成P-N结的材料决定的。
3.7按键的工作原理
⑴独立式按键
独立式按键是每个按键占用一根I/O端线。
特点:
①各按键相互独立,电路配置灵活;
②按键数量较多时,I/O端线耗费较多,电路结构繁杂;
③软件结构简单。
适用于按键数量较少的场合。
⑵矩阵式键盘
I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。
①占用I/O端线较少;
②软件结构教复杂。
适用于按键较多的场合。
键盘扫描控制方式:
⑴程序控制扫描方式
键处理程序固定在主程序的某个程序段。
对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。
⑵定时控制扫描方式
利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。
与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。
定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。
⑶中断控制方式
中断控制方式是利用外部中断源,响应键输入信号。
克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。
按键开关去抖动问题:
键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。
消除抖动不良后果的方法:
⑴硬件去抖动
其中RC滤波电路去抖动电路简单实用,效果较好。
⑵软件去抖动
检测到按键按下后,执行延时10ms子程序后再确认该键是否确实按下,消除抖动影响。
考虑到本系统使用按键较少,仅使用了2个按键,为简化程序,因此使用短路冒将2和3短接在一起,将第一列按键当做独立按键来使用。
3.8光照检测
光敏电阻具有在特定波长的光照射下,其阻值迅速减小的特性。
这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。
四软件部分设计
4.1主程序流程图:
主程序主要完成各模块子程序的调用,在这里先初始化定时器,以100ml/s的速度来模拟流量的增加,然后不断扫描按键信息和采集AD值,当按下响应的按键时即进行相应动作,对于AD的设定值,由于系统设计要求以1.25V作为一个阀值,因PCF8591为一个8位AD转换芯片,通过计算公式1.25/5*255=64,可得对应的数字信号为64,将采集到的AD值与64进行比较即可确定LED灯的亮灭状态。
程序清单如下:
#include<
reg52.h>
intrins.h>
#include"
SMG.h"
ULN2003.H"
//继电器蜂鸣器
TIMER.h"
KEY.h"
PCF8591.h"
//ad转换模块
charshow[8]={11,13,5,0,0,0,0,0};
//给数码管显示
longintwater_ml;
//多少毫升水
bitneed_clear=0;
//是否需要清零
bitsuanqian=0;
//是否需要算钱
ucharlight=0;
//定义光照强度(范围0-255)
voidmain(void)
{
buzz=0;
//关闭蜂鸣器
relay=0;
//关闭继电器
ULN2003_Latch();
//锁存
t0_init();
//初始化T0
t1_init();
//初始化T1
while
(1)
{
key_fun();
//按键作用函数
if(suanqian==0)
{
need_clear=0;
//水量不用清零
show[4]=water_ml/10000;
show[5]=water_ml%10000/1000;
show[6]=water_ml%1000/100;
show[7]=water_ml%100/10;
}
if(suanqian==1)
{
need_clear=1;
//算钱了,当下一次放水时,水量清0show[4]=water_ml/2/10000;
show[5]=water_ml/2%10000/1000;
show[6]=water_ml/2%1000/100;
show[7]=water_ml/2%100/10;
}
display(show);
/********************
任务要求:
输入电压小于1.25
也就是对应的数字量小于
1,25/5*254=254/4=63;
********************/
if(flag_1s==1)//1s到了
flag_1s=0;
init_pcf8591(0x01);
//初始化通道1,所以下面采集的AD值就是通道1的
light=adc_pcf8591();
//前一次的数据,抛弃//启动ad