1、 单 片 机 课 程 设 计 题 目 基于单片机的水位控制器 姓 名 学 号 指导教师 _ 成 绩 摘要本设计是利用AT89C51单片机设计的一种水位控制器。主要是基于单片机的硬件设计以及程序设计。该系统实现了实时水位监测,水位控制,水位显示。在设计中主要采用了传感技术、单片机技术、模数转换、C语言编程等技术。本文还讲述了水位控制器工作的基本原理,介绍了电路接口原理图,给出了相应的设计流程图和C语言程序。本文主要是为了使读者更多的了解单片机,掌握单片机的组成部分和控制原理,了解模数转换的工作原理,以及单片机控制水位是如何工作的。实验证明,单片机控制的水位控制器的硬件电路简单,软件功能完善,控制
2、系统可靠,充分发挥了单片机的性能,可以大大的提高单片机的开发效率。 关键词:AT89C51单片机、模数转换、水位控制目录 摘要i目录- 1 -第一章 系统功能要求- 2 -1.1课程设计题目- 2 -1.2课程设计用材- 2 -第二章 设计方案论证- 3 -2.1设计方案- 3 -第三章 系统硬件电路的设计- 4 -3.1主要芯片简介- 4 -3.1.1AT89C51简介- 4 -3.1.2 AT89C51的引脚功能- 4 -3.2 ATC89C51基本电路- 6 -3.2.1 复位电路- 6 -3.2.2 晶振电路- 6 -3.3 A/D转换器- 7 -3.3.1 ADC0809简介- 7
3、-3.3.2 ADC0809引脚功能- 7 -3.3.3ADC0809应用说明- 9 -3.4数码管显示电路- 9 -3.4.1数码管简介- 9 -3.4.2 数码管工作原理- 9 -3.4.3 数码管显示电路- 10 -第四章 系统程序的设计- 10 -4.1程序设计方案- 11 -第五章 调试及性能分析- 11 -5.1软件调试- 12 -5.2仿真结果- 12 -5.3性能分析- 12 -参考文献- 13 -附件- 14 -附件一 设计总电路图和仿真结果- 15 -附件二 程序- 15 -第一章 系统功能要求1.1课程设计题目设计出一个用单片机控制的水位控制器。1.2课程设计用材电烙铁,
4、锡丝,,PCB板,AT89C51单片机,ADC0809,晶振,数码管,发光LED(红绿各一个),继电器,水位传感器,电机,各种不同阻值电阻,各种型号电容,导线,杜邦线等等。第二章 设计方案论证2.1设计方案硬件选择:选择AT89C51作为单片机芯片、ADC0809实现模数转换、Water Sensor for Arduino水位传感器实现信号采集。软件开发环境: 用Proteus 7 Professional软件画电路图 、Keil uVision4软件进行程序编写。第三章 系统硬件电路的设计3.1主要芯片简介 3.1.1AT89C51简介单片机是将微处理器、一定容量的ROM和RAM以及I/O
5、口、定时器等电路集成在一块芯片上,构成的单片微型计算机。AT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。AT89C51 提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可
6、选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 3.1.2 AT89C51的引脚功能AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。引脚配置如图1.1所示。 图3.1 AT89C51引脚图
7、VSS:接地端。VCC:电源端。P0.0-P0.7:通道0,双向I/O口。第二功能是在访问外部存储器时可分时用作低8位地址线和8位数据线,在编程和检验时,用于数据的输入和输出。P1.0-P1.7:通道1,双向I/O口,在编程和检验是,用于接收地址字节。P2.0-P2.7:通道2,双向I/O口,在第二功能是在访问外部存储器时,输出高8位地址,在编程和检验时,用做高位地址字节和控制信号。P3.0-3.7:双向I/O口,每条线都有自己的功能,如表3.1所示。表3.1 P3口各位的第二功能P3口各位第二功能P3.0RTD(串行口输出)P3.1TXD(串行口输入)P3.2(外部中断0输入)P3.3 (外
8、部中断1输入)P3.4T0(定时器/计数器0的外部输入)P3.5T1(定时器/计数器1的外部输入)P3.6(片外数据存储器写信号)P3.7(片外数据存储器读信号)ALE:地址锁存允许线,在访问外部存储器是,用来锁存P0口送出的低8位地址信号。在不访问外部存储器是,ALE也震荡频率的六分之一的固定速率输出,此时,它可用做外部时钟和外不定时。但若要访问外部存储器,则ALE不是连续周期脉冲,无法用做时钟信号。:片外存储器访问选择线,可以控制89C52使用片内ROM或使用片外ROM,若是=1,则允许使用片内ROM;若是=0,则只使用片外ROM。PSEN:片外ROM的选通线,在访问片外ROM时,89C5
9、2自动在PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。RST:复位线,可以使89C52处于复位(即初始化)工作状态。通常89C51复位有自动上电复位和人工按键复位两种。XTAL1和XTAL2:片内震荡电路输入线,这两个端口用来外接石英晶体和微调电容,即用来连接89C52片内OSC(震荡器)的定时反馈回路。AT89C52 中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1 和XTAL2 分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。3.2 ATC89C51基本电路 3.2.1 复位电路复位是使单片机处于某种确定的初始
10、状态。单片机工作从复位开始。在单片机RST引脚引入高电平并保持2个机器周期,单片机就执行复位操作。复位操作有两种基本方式:一种是上电复位,另一种是上电与按键均有效的复位。复位电路如图3.2所示。开机瞬间RST获得高电平,随着电解电容C3的充电,RST引脚的高电平将逐渐下降。若该高电平能保持足够2个机器周期,就可以实现复位操作。根据经典电路选择参数,选取C3=10F,R1=10K。图3.2 复位电路图 3.2.2 晶振电路单片机的时钟信号通常有两种产生方式:一是内部时钟方式,二是外部时钟方式。内部时钟方式是利用单片机内部的振荡电路产生时钟信号。外部时钟方式是把外部已有的时钟信号引入到单片机内。本
11、次设计中,采用的是12MHz晶振,配上30pF的电容,构成谐振,这样有助于输出稳定的波形。如图3.3所示。 图3.3 晶振电路图在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振),作为单片机内部振荡电路的负载,构成自激振荡器,可在单片机内部产生时钟脉冲信号。C1和C2的作用是稳定振荡频率和快速起振。根据经典电路选择参数,本电路选用晶振12 MHz, C1=C2=30PF。其中晶振周期(或外部时钟信号周期)为最小的时序单位。3.3 A/D转换器 3.3.1 ADC0809简介 ADC0809是8 位逐次逼近型A/D转换器。它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个
12、三态输出锁存器组成。多路开关可选通8个模拟通道,允许8 路模拟量分时输入,共用A/D 转换器进行转换。三态输出锁存器用于锁存A/D 转换完的数字量,当OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。 3.3.2 ADC0809引脚功能图3.4 ADC0809引脚 ADC0809各脚功能如下:D7-D0:8位数字量输出引脚。IN0-IN7:8位模拟量输入引脚。VCC:+5V工作电压。GND:地。REF(+):参考电压正端。REF(-):参考电压负端。START:A/D转换启动信号输入端。ALE:地址锁存允许信号输入端。(以上两种信号用于启动A/D转换)。EOC:转换结束信号输出引脚,
13、开始转换时为低电平,当转换结束时为高电平。OE:输出允许控制端,用以打开三态数据输出锁存器。CLK:时钟信号输入端(一般为500KHz)。B、C:地址输入线。如图3.5选择信号输入通道。图3.5 ADC0809通道选择ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4条ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进入转换器进行转换。A,B和C为地址
14、输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。 3.3.3ADC0809应用说明l ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。l 初始化时,使ST和OE信号全为低电平。l 送要转换的哪一通道的地址到A,B,C端口上。l 在ST端给出一个至少有100ns宽的正脉冲信号。l 是否转换完毕,我们根据EOC信号来判断。l 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。3.4数码管显示电路 3.4.1数码管简介led数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连
15、接完成,只需引出它们的各个笔划,公共电极。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。 3.4.2 数码管工作原理 根据其引脚接线,点亮相应
16、的LED,即可得到想要的显示。图3.6 3.4.3 数码管显示电路 此数码管为共阴极接法,接一个上拉电阻后,接入单片机的P0端口,由P0口控制输出,高电平点亮相应的二极管。图3.7 数码管显示电路第四章 系统程序的设计4.1程序设计方案模拟信号采集转换启动定时器程序准备,定义端口对端口赋初值 控制指示灯亮灭显示实时数据判断按键按下情况控制电机启停4.2 程序 见附件二第五章 调试及性能分析5.1软件调试本设计的调试主要用到keil和protues软件。其中,系统电路图的绘制和仿真采用的是Proteus软件,而C语言程序用Keil软件调试并把程序写入单片机。软件调试结果如图5.1所示。图5.1
17、软件调试5.2仿真结果仿真结果见附件一。5.3性能分析本次课程设计所应用到的软件有:KEIL,PROTEUS这两个软件,两个软件结合起来用对这个设计有着至关重要的作用。软件调试是通过s进行的,此软件不多介绍了,功能强大,是学习电路的好帮手。但进行软件仿真的时候,却一直没有出现结果。这就要我们进行错误的排查,这就包括各个端口的检查和分析。由于网上下载了中文补丁,因此对于我们初学者来说难度降低了不少,仿真软件proteus仿真时按键数码管老是加二,最后发现是个按键的延时太短了,增加延时后才实现加一,不仅要看电路是否有问题,c语言编程也要检查。 在实物的制作过程中遇到的麻烦更大,其中锻炼动手能力还是
18、很好的,首先对于那些硬件都不怎么熟悉,这得就需要我们去查阅书籍资料,一个元器件的接口有什么功能、在哪里,平常我们在书本上只能想象一下,现在拿到硬件了又该如何是好,大部分的硬件只有一个名字,其余的引脚全部要查阅相关资料。还有在焊接的过程中对于东西的使用也是很有讲究和技巧的。了解助焊剂与焊锡丝的关系,如何使用,怎么用得安全对于我们动手少的人来说是很有难度的。因此在第一次做的时候,线路极其混乱,出现了很多错误,没办法只有一次次的检查,重新排版、焊接,找到错误的地方。参考文献1李朝青.单片机原理及接口技术M.4版.北京:北京航空航天大学出版社,2013.72郭天祥.新概念51单片机C语言教程M.北京:
19、电子工业出版社,2009.13康光华.数字电路基础数字部分M.5版.北京:高等教育出版社,2006.1附件附件一 设计总电路图和仿真结果附件二 程序#include /头文件#define uchar unsigned char /宏定义无符号字符型#define uint unsigned int /宏定义无符号整型sbit ST=P31; /A/D启动转换信号sbit OE=P33; /数据输出允许信号sbit EOC=P32; /A/D转换结束信号sbit CLK=P30; /时钟脉冲 sbit b1=P34;sbit b2=P35;sbit b3=P36;sbit b4=P37;sbi
20、t key1=P10;sbit key2=P11;sbit key3=P12;sbit key4=P13;sbit key5=P14;sbit key6=P15;sbit key7=P16;sbit OUT=P17;sbit zsd1=P36;sbit zsd2=P37;uint z,x,c,v,AD0809, date,sw,reng;/定义数据类型unsigned char leddata= 0x3F, /0 0x06, /1 0x5B, /2 0x4F, /3 0x66, /4 0x6D, /5 0x7D, /6 0x07, /7 0x7F, /8 0x6F, /9 0x77, /A 0
21、x7C, /B 0x39, /C 0x5E, /D 0x79, /E 0x71, /F 0x76, /H 0x38, /L 0x37, /n 0x3E, /u 0x73, /P 0x5C, /o 0x40, /- 0x00, /熄灭 0x00 /自定义 ; /* CLK振荡信号*/void timer0( ) interrupt 1 /定时器0工作方式1TH0=(65536-2)/256; /重装计数初值TL0=(65536-2)%256; /重装计数初值CLK=!CLK; /取反void anniu()if(key1=0) sw=8; reng=0;if(key2=0) sw=5; reng
22、=0;if(key3=0) sw=4; reng=0;if(key4=0) sw=3; reng=0;if(key5=0) sw=2; reng=0;if(key6=0) sw=1; reng=0;if(key7=0) reng=1;if(reng=1) OUT=key7; zsd2=key7; void xianshi()P0=leddatadate; if(date=sw&reng=0) OUT=1; zsd2=1; else if(date=251)/电压显示不能超过5VAD0809=250;date=AD0809/30; anniu(); xianshi();if(date=8)zsd1=0;else if(date8)zsd1=1; - 21 -