1、完整版基于8051单片机的简易数字电压表毕业设计论文 基于8051单片机的简易数字电压表设计姓名:吴建亮 班级:电信1202 学号: 摘要电压表应用十分广泛,但大部分是模拟电压表,而由于其特性,反应速度慢,读数麻烦并且误差较大,所以为适应不断快速发展的高速信号领域,已经广泛使用数字电压表。本实验设计是基于51单片机开发板ESDM-3A实现的一种数字电压表系统。该设计采用8051单片机作为控制核心,以ADC0为模数转换数据采样,实现被测电压的数据采样,外部采用LCD12864液晶显示电压表的电压值。1.设计任务和要求1.1 设计任务设计制作一个简易直流电压表,该直流电压表能测量直流电压。各硬件模
2、块如图1.1所示。图1.1硬件框图1.2 设计要求(1)ADC0的工作方式设置如下:采用单端输入,模拟输入电压从P2.0输入;选择作为参考电压源;转换时钟频率设置为2MHz;采用写“AD0BUSY”启动AD转换。(2)采用定时器中断每隔0.5s启动一次AD转换;通过ADC0中断服务程序读取转换值。2.设计方案2.1 硬件电路 硬件模块如上图1.1所示。输入电压由开发板上J8接口的第2脚05.0V接跳线至单片机扩展接口J7的第4脚P2.0,调节电位器RP3实现不同电压的输入。AD转换器、单片机、液晶屏在开发板已经连接好。下面简单介绍所用的器件。C8051F360单片机主要模拟和数字资源包括:(1
3、)高速8051微控制器内核。(2)10位逐次逼近型AD转换器。(3)10位电流输出DA转换器。(4)两个模拟电压比较器CP1和CP0。(5)片内锁相环PLL。(6)扩充中断处理系统。(7)存储器,256字节内部RAM;1024字节XRAML;32字节闪存存储器。(8)数字资源,多达39个IO引脚,全部为三态双向口,允许与5V系统接口。(9)时钟源,2个内部振荡器;80kHz低频低功耗振荡器。(10)片内调试电路。液晶屏HGB功能和接口。1:VSS接地端2:VDD电源正,接+5V3:VO对比度调整,接电位器4:DI(CS*)片选,也叫使能,接+5V5:RW(SID*)数据输入端6:E(SCLK*
4、)时钟输入端714:DB0 DB7并行数据总线15:PSB串并模式选择,串行模式下接地,并行模式下接+5V16:NC空引脚,不需要连接17:RSTB复位端,低电平有效,一般接+5V18:VEE对比度调整,接电位器19:BLA背光正极,接+5V20:BLK背光负极,接地表2.1 液晶屏引脚接法12864液晶屏引脚按表2.1所示与单片机连接,在开发板上已经连接好,只需要配置好相应的寄存器即可。HGB内部有三种不同RAM,DDRAM,CGRAM和GDRAM,其自带汉字字库,提供8192个中文字形,这些字可以字符串的形式直接显示。2.2程序设计程序的编写使用C语言,利用Keil Vision4进行程序
5、的编写和烧录。程序执行时所对应的流程如下图2.1所示。图2.1 程序执行流程图下面简单介绍各模块的设计思路。(1)时钟和定时器:选用内部24MHz振荡器,频率除2作为SYSCLK;定时器选择定时器1工作方式1,TMOD=0X10,采用循环的方法,定时器定时50ms,循环10次得0.5s,装入初值TH1=()256,TL1=()%256。 (2)ADC0:通过置“AD0BUSY”启动AD转换,采用10位采集通道,电压的最大值为3.3V,通过转换器的到的数值为AD_data=ADC0H256+ADC0L,得到的实际电压为volt=AD_data3.31023,通过AD0INT位,判断AD转换是否结
6、束。(3)液晶屏LCD12864:液晶屏操作分指令操作和数据操作,每次写指令或数据前先确认内部动作是否完成,通过读取忙碌状态进行确认。读、写指令或数据通过读或写4个内部寄存器WCOMADDR,WDATADDR,RCOMADDR和RDATADDR来完成。详细代码请见附录。3.测试结果分析组数电压表显示(V)单片机显示(V)误差10.4490.4450.89%21.0801.0740.56%31.6531.6510.12%42.5702.5670.12%53.1003.0960.13%表3.1测试结果根据表3.1的分析看,本次设计的数字电压表的符合要求,误差控制在1%内。4.总结本次的设计和实验采
7、用了Keil Vision4进行C语言的编写和烧录,熟悉了Keil的操作,对8051单片机的定时器、AD转换器、LCD12864液晶屏等模块有了一定的了解和认识。在程序的编写的过程和实际电路操作时遇到了种种问题,通过查阅大量的资料解决了问题,为以后的学习和实际应用奠定了基础。附录:本次设计实验的C语言代码:#include #define uchar unsigned char#define uint unsigned int#define LEDENCS 0xC004 LCD模块背光控制片选信号#define WCOMADDR 0xC008 写命令寄存器的地址#define WDATADDR
8、 0xC009 写数据寄存器的地址#define RCOMADDR 0xC00A 读命令寄存器的地址#define RDATADDR 0xC00B 读数据寄存器的地址uint num=0; uchar LEDCON=0x00; *LCD模块背光控制字,最低位为0时关LED背光,最低位为1时开启LED背光,*sbit START=P30;sbit SW0=P31;sbit SW1=P33;uchar code ); Lcd写指令子程序void WriteData(uchar m); Lcd写数据子程序void InsitiLcd(); Lcd初始化子程序void DispHan( uchar c
9、ode *a,uchar m,uchar k);显示汉字子程序void DispShu( uint a,uchar m); 数字显示程序* 主函数*void main() uchar xdata *addr; InitDevice(); InsitiLcd(); addr=LEDENCS; LEDCON=LEDCON; *addr=LEDCON; DispHan(; void XramInit(void) 外部数据储存器初始化 SFRPAGE=0x0f; EMI0CF=0x07; 引脚复用方式 SFRPAGE=0x00; return; void SmbInit(void) I2C总线初始化
10、SMB0CF=0xc1; 定时器T1溢出作为时钟 return; void UartInit(void) 异步串口通信接口初始化 SCON0=0x00; 10位UART return; void DacInit(void) DA转化器初始化 IDA0CN=0xf2; IDA0使能,写IDA0H触发DAC输出更新,2mA满度输出 return; void AdcInit(void) AD初始化 ADC0CN=0X80; adc0一直跟踪 ,AD0BUSY写“1”启动 ADC0CF=0x28; 转换率2Mhz,右对齐 REF0CN=0X08; 选择Vdd做基准电压 AMX0P=0X08; 单端输入
11、 P2.0 AMX0N=0X1F; EIE1=0x08; 允许ADC中断 return; void Int0Init(void) 外部中断初始化 IT01CF=0x05; 选择P0.5为INT0 IT0=1; INT0下降沿触发 return; void PcaInit(void) PCA初始化 PCA0CN=0x40; 允许PCA计数器定时器 PCA0MD=0x00; 禁止看门狗定时器 return; void InterruptsInit(void) 中断系统初始化 IE0=0; 清INT0中断标志 EX0=1; PX0=0; ET0=1; ET1=1; EA=1; return; voi
12、d InitDevice(void) OscInit(); PortIoInit(); XramInit(); SmbInit(); UartInit(); DacInit(); AdcInit(); Int0Init(); PcaInit(); InterruptsInit(); TimeInit(); return; * 检查LCD是否空闲子程序*void CheckLcd() uchar temp = 0x00; uchar xdata *addr; while (1) addr=RCOMADDR; temp=*addr; temp &= 0x80; if(temp = 0x00) break; * Lcd写指令子程序*void WriteCom(uchar n) uchar xdata *addr; CheckLcd(); addr=WCOMADDR; *addr=n; * Lcd写数据子程序*void WriteData(uchar m) uchar xdata *addr; CheckLcd(); addr=WDATADDR; *addr = m; * Lcd初始化子程序*void InsitiLcd() WriteCom(0x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1