题目:基于单片机的简易数控电源
参赛选手:*** *** ***
系别:电子信息工程
指导教师:******
时间:2011年4月24日
基于单片机的简易数控电源
摘 要:本次设计采用51单片机进行控制,在对单片机系统、喇叭装置和显示电路做了深入的研究之后,拟出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用C语言设计了具体软件程序后,用Proteus软件进行了仿真和调试,结果证明了该设计系统的可行性。由于51系列单片机的控制器运算能力强,处理速度快,可以精确计时,很好地解决了实际生产生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的适用性。
关键字:51单片机 LCD1602液晶显示 数控电源 Proteus仿真
一、功能介绍
本次设计电路主要由主体电路与扩展电路组成,采用单片机控制设计,使LCD液晶显示器显示设定的电压值和从外部读入的实际电压值。设定的电压值经过数据处理可直接送LCD液晶显示器显示。将输入的信号经过51单片机处理在LCD液晶显示器上输出;用控制电路和调节开关对LCD显示的时间进行调节,以上两部分组成主体电路。通过单片机的信号控制音乐芯片电路在报警电路上实现报警功能,设计通过51单片机采集ADC0808模数转换器上的电压信号实现在LCD上显示实际输出电压的值,以上两部分构成扩展电路。经过设计、Proteus仿真、Protel布线制板、焊接调试等工作后设计电路成形。功能总结如下:
1)输出电压范围0~+9.9V。
2)电压步进0.1V可调。
3)使用液晶显示器LCD1602作为显示,最小分辨率可达到0.1V。
4)可利用电路上的滑动变阻器进行微调校准。
5)用自动扫描代替人工按键,实现输出电压变化。
6)设计4个按键,输出电压可预置在0~9.9V之间的任意一个值。
7)设计模数转换电路,实现输出电压的实时监控。
8)设计报警电路实现超量程报警。
9)设计直流电源电路,可直接提供±15V、±5V电压。
二、硬件设计
本设计包括:单片机系统电路、显示电路、电源电路、报警电路、电压采集电路
1、单片机系统电路
本设计采用51单片机作为整个电路的控制芯片,用最小系统功能电路实现各种控制。
单片机最小系统功能电路如附录所示:
(1)51单片机的引脚图、逻辑图见图2-1
图2-1 51单片机的引脚图、逻辑图
(2)引脚功能说明
Vcc:电源电压
GND:接地
P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位以吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用,要求外接上拉电阻。
P1口:P1口是一个带内部上拉电阻的8位双向I/O口,P1口的输出缓冲级可驱动4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。另外,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),参见表2-2。
表2-2 P1.0和P1.1的第二功能
引脚号 功能特性
P1.0 T2(定时/计数器2外部计数脉冲输入),时钟输出
P1.1 T2EX(定时/计数2捕获/重装载触发和方向控制)
P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P2端口写“1”,通过内部的上拉电阻把端口拉到高电平,可作输入口。
P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当ATC52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次RSEN信号。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。
XTAL1:振荡器反相放大器及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
(3)复位电路
本次设计在单片机最小系统功能电路上设置复位开关,用以实现系统的复位。复位电路如下图所示:
2、显示电路
为了获得更好的效果本设计并没有采用常见的LED,而是采用了型号为1602的 LCD。用以显示预置输出的电压值和实际输出的电压值。LCD有LED数码显示更好的更的直观效果,也更加经久耐用。液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。本LCD是2行16列液晶 可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V,有背光。1602引脚说明,见表2-1。
表2-1 LCD显示屏引脚说明
VDD:电源正极,4.5-5.5V,通常使用5V电压;
VL:LCD对比度调节端,电压调节范围为0-5V。接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地;
RS:MCU写入数据或者指令选择端。MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平;
R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据;
E:LCD模块使能信号控制端。写数据时,需要下降沿触发模块。
D0-D7:8位数据总线,三态双向。如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4-D7接口传送数据。本充电器就是采用4位数据传送方式;
BLA: LED背光正极。需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;
BLK: LED背光地端。
设计电路如下:
3、数模转换电路
本次设计采用DAC0832数模转换器对预置的电压值进行转换。DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。其主要参数如下:分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压为(+10~-10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。数模转换电路原理图如下:
4、电源电路
本电路为±15V、±5V直流稳压电源,它由变压器输出12V交流电到输出端,再经过电源转化成±15V、±5V直流电,电路主要功能是为整个设计电路供电。7805、7815、7905、7915是个三端稳压管,+5V、+15V、-5V、-15V电压输出,有稳压取样放大电路,保护电路过流、过压、过热,辅助电路,电流源等功能。电路如图所示:
5、预置按键电路
当重新接通电源或走时出现误差时都需要进行电压预置,通常,预置的方法是:根据选择需要预置的位,再进行加减预置,然后按确认键转入正常输出状态即可。本次电路设计4位连接式非编码键盘,用来控制‘设置’‘+’‘-’‘电压采集’。并且在采集的同时更新电压显示,确保器正确性。下图所示即为预置电路:
6、电压采集电路
本次设计采用ADC0808采集电压信号,由单片机进行相应的计算、转换,最后显示在LCD数码管上。ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。电压采集电路如下:
三、软件设计
1、主函数的设计
这里用C语言的单片机程序构成了本次设计电路的软件系统。 该程序实现,本次设计电路的主程序流程图如下图所示:
主函数流程图
2、D/A转换子程序
由原理图可知,片选信号CS和数据传送控制信号XFER都与51单片机的P口相连,WR1、WR2均与P2.2口相连。CPU对DAC1208执行一次写操作,则将一个数据直接写入DAC寄存器,DAC1208的输出模拟量随之变化。由于DAC1208具有数字量的输入锁存功能,故数字量可以直接从51的P0单片机口送入。D/A转换子程序流程图如下图:
D/A转换子流程图
3、A/D的软件设计
本设计电路中,CE/LOAD引脚接地址引脚,使芯片有效状态可以控制。RUN/HOLD(运行/保持)引脚P口,使A/D转换连续进行。A/D转换正在进行时,STA引脚输出高电平,STA引脚降为低电平时,由P0.2输出低电平信号到ICL7109的HBEN,读高4位数据、极性和溢出位;由P口输出低电平信号到LBEN,读低8位数据。不需要采集数据时,不会影响C51的工作,因此这种方法可简化设计,节省硬件和软件。A/D转换子流程图如下图:
A/D转换子流程图
4、显示程序
显示程序包括预置电压显示和实际输出电压显示程序。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,下表是LCD1602液晶模块的内部显示地址。
LCD1602内部显示地址
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 4A | 4B | 4C | 4D | 4E | 4F |
类别 | 型号 | 数量(单位) |
IC芯片 | STCC52 | 1片 |
MAX232 | 1片 | |
12V变压器 | 1个 | |
DAC0832 | 1个 | |
ADC0808 | 1个 | |
LM324 | 1个 | |
LCD | 共阴8段数码显示 | 7只 |
按钮开关 | 自锁/自动复位 | 8个 |
电容 | 30pF | 2个 |
10μF | 1个 | |
47μF | 2个 | |
22μF | 1个 | |
晶振 | 11.0592MHz | 1支 |
32.768KHz | 1支 | |
电阻 | 1K | 1个 |
10KΩ | 6个 | |
滑动变阻器50k | 2个 | |
三极管 | S9013 | 1个 |
蜂鸣器 | 74F378 | 1个 |
万能板 | 焊接型 | 2块 |
二极管 | 发光二极管 | 10个 |
1N4007 | 8个 | |
1N4148 | 10个 |
单片机是计算机技术发展的产物,是经济实用开发简便的高科技产品,在当今工业控制、家电等领域占据广泛的市场。通过此次单片机课程设计来设计个简单的数字闹钟,我巩固了自己学习的单片机知识,来初步了解了小型单片机系统的设计和运用,并提高自己实际动手能力。
设计过程也使我了解了自己能力的不足,不过通过资料收集和文献查询等方法,找出了设计过程中的一些问题以及解决问题的方法,从而比较顺利的完成了这个设计任务。这次自己所做的设计取得了一些宝贵的经验,提高了自己的动手能力,为将来的学习和工作很有好处。
总之,理论必须和实际结合才有威力,知识必须通过应用才能实现其价值!所学的东西最终是要面向社会,是在以后的工作能够更好的应用,此时的知识积累是为以后的工作做好坚实的基础。这个设计总体上不算完美,但是这个设计经历的好处是不可估量的。许多的问题,再加上能力与精力,还有时间的关系,对系统的设计中的每一个细节不能做到完全的完美。该系统还需要以后进行完善,而我所做的也仅供以后设计该系统时作为参考。
六、致谢
附录一:单片机最小系统电路及PCB
附二:程序
#include #define uchar unsigned char #define uint unsigned int sbit key1=P1^0; //“设置” //端口定义 sbit key2=P1^1; //“+” sbit key3=P1^2; //“-” sbit key4=P1^3; //“确认输出” sbit RS=P3^4; sbit EN=P3^5; //LCD1602控制 sbit BJ=P3^3; sbit DAC_CS=P3^7; sbit DAC_WR=P3^6; //DAC0832控制 sbit ADC_STA=P1^4; sbit ADC_OE=P1^5; sbit ADC_SCL=P1^6; uchar code table1[]="08_XTT-IN_V:0.0V"; uchar code table2[]=" DACOUT_V:0.0V"; uchar ge,shifen,keynum,volt,volt1,ge1,shifen1,a; void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delay1() {;;} void write_com(uchar com) //写指令到1602 { RS=0; EN=0; P2=com; delay(1); EN=1; delay(1); EN=0; } void write_date(uchar date) //写数据到1602 { RS=1; EN=0; P2=date; delay(1); EN=1; delay(1); EN=0; } void Init() //初始化 { uchar num; EN=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<16;num++) { write_date(table1[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<16;num++) { write_date(table2[num]); delay(5); } } void write_voltage(uchar add,uchar dat) //写电压到1602 { write_com(0x80+0x40+add); write_date(0x30+dat); } void write_voltage1(uchar add,uchar dat) //写电压到1602 { write_com(0x80+add); write_date(0x30+dat); } //void ADC0808_STA() //ADC0808开始信号 //{ //ADC_STA=0; // delay1(); //ADC_STA=1; //} void ADC0808_RD() { //P0=0xff; //ADC_OE=1; //volt1=P0; //ADC_OE=0; //ge1=volt1/21; //a=volt1%21; //shifen1=(a-2)/2; write_voltage1(12,ge); write_voltage1(14,shifen); } void DAC0830_OUT(uchar dadata) //写电压数据到DAC0832 { DAC_CS=0; P0=dadata; DAC_WR=0; delay(1); DAC_WR=1; DAC_CS=1; } void keyscan() //键盘扫描 { if(key1==0) { delay(10); if(key1==0) { keynum++; while(!key1); if(keynum==1) { write_com(0x80+0x40+14); write_com(0x0e); } } if(keynum==2) { write_com(0x80+0x40+12); write_com(0x0e); } if(keynum==3) { keynum=0; write_com(0x0c); } } if(keynum!=0) { if(key2==0) { delay(300); if(key2==0) { if(keynum==1) { shifen++; if(shifen>=10) { shifen=0; BJ=0; delay(200); BJ=1; ge++; if(ge>=10) { ge=9; BJ=0; delay(200); BJ=1; } } write_voltage(14,shifen); write_voltage(12,ge); } if(keynum==2) { ge++; if(ge>=10) { ge=9; BJ=0; delay(200); BJ=1; } write_voltage(12,ge); } } } if(key3==0) { delay(300); if(key3==0) { if(keynum==1) { shifen--; if(shifen==-1) { shifen=9; BJ=0; delay(200); BJ=1; ge--; if(ge==-1) { ge=0; BJ=0; delay(200); BJ=1; } } write_voltage(14,shifen); write_voltage(12,ge); } if(keynum==2) { ge--; if(ge==-1) { ge=0; BJ=0; delay(200); BJ=1; } write_voltage(12,ge); } } } } } void keyscan4() { if(key4==0) { delay(10); if(key4==0) { while(!key4); //ADC0808_STA(); //delay(10); ADC0808_RD(); } } } void main() //主函数 { keynum=0; //ADC_SCL=0; //ADC_OE=0; ge=0; shifen=0; Init(); while(1) { //ADC_SCL=~ADC_SCL; keyscan(); keyscan4(); volt=ge*10+shifen; DAC0830_OUT(volt); } }下载本文