完整版基于8051单片机的简易数字电压表毕业设计论文.docx
《完整版基于8051单片机的简易数字电压表毕业设计论文.docx》由会员分享,可在线阅读,更多相关《完整版基于8051单片机的简易数字电压表毕业设计论文.docx(10页珍藏版)》请在冰豆网上搜索。
![完整版基于8051单片机的简易数字电压表毕业设计论文.docx](https://file1.bdocx.com/fileroot1/2022-11/16/10268cc4-b4f1-4b80-9bf4-655868be0d34/10268cc4-b4f1-4b80-9bf4-655868be0d341.gif)
完整版基于8051单片机的简易数字电压表毕业设计论文
基于8051单片机的简易数字电压表设计
姓名:
吴建亮班级:
电信1202学号:
摘要
电压表应用十分广泛,但大部分是模拟电压表,而由于其特性,反应速度慢,读数麻烦并且误差较大,所以为适应不断快速发展的高速信号领域,已经广泛使用数字电压表。
本实验设计是基于51单片机开发板ESDM-3A实现的一种数字电压表系统。
该设计采用8051单片机作为控制核心,以ADC0为模数转换数据采样,实现被测电压的数据采样,外部采用LCD12864液晶显示电压表的电压值。
1.设计任务和要求
1.1设计任务
设计制作一个简易直流电压表,该直流电压表能测量直流电压。
各硬件模块如图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脚0~5.0V接跳线至单片机扩展接口J7的第4脚P2.0,调节电位器RP3实现不同电压的输入。
AD转换器、单片机、液晶屏在开发板已经连接好。
下面简单介绍所用的器件。
C8051F360单片机主要模拟和数字资源包括:
(1)高速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
电源正,接+5V
3:
VO
对比度调整,接电位器
4:
DI(CS*)
片选,也叫使能,接+5V
5:
RW(SID*)
数据输入端
6:
E(SCLK*)
时钟输入端
7~14:
DB0~DB7
并行数据总线
15:
PSB
串并模式选择,串行模式下接地,并行模式下接+5V
16:
NC
空引脚,不需要连接
17:
RSTB
复位端,低电平有效,一般接+5V
18:
VEE
对比度调整,接电位器
19:
BLA
背光正极,接+5V
20:
BLK
背光负极,接地
表2.1液晶屏引脚接法
12864液晶屏引脚按表2.1所示与单片机连接,在开发板上已经连接好,只需要配置好相应的寄存器即可。
HGB内部有三种不同RAM,DDRAM,CGRAM和GDRAM,其自带汉字字库,提供8192个中文字形,这些字可以字符串的形式直接显示。
2.2程序设计
程序的编写使用C语言,利用KeilμVision4进行程序的编写和烧录。
程序执行时所对应的流程如下图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=ADC0H×256+ADC0L,得到的实际电压为volt=AD_data×3.31023,通过AD0INT位,判断AD转换是否结束。
(3)液晶屏LCD12864:
液晶屏操作分指令操作和数据操作,每次写指令或数据前先确认内部动作是否完成,通过读取忙碌状态进行确认。
读、写指令或数据通过读或写4个内部寄存器WCOMADDR,WDATADDR,RCOMADDR和RDA
TADDR来完成。
详细代码请见附录。
3.测试结果分析
组数
电压表显示(V)
单片机显示(V)
误差
1
0.449
0.445
0.89%
2
1.080
1.074
0.56%
3
1.653
1.651
0.12%
4
2.570
2.567
0.12%
5
3.100
3.096
0.13%
表3.1测试结果
根据表3.1的分析看,本次设计的数字电压表的符合要求,误差控制在1%内。
4.总结
本次的设计和实验采用了KeilμVision4进行C语言的编写和烧录,熟悉了Keil的操作,对8051单片机的定时器、AD转换器、LCD12864液晶屏等模块有了一定的了解和认识。
在程序的编写的过程和实际电路操作时遇到了种种问题,通过查阅大量的资料解决了问题,为以后的学习和实际应用奠定了基础。
附录:
本次设计实验的C语言代码:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLEDENCS0xC004LCD模块背光控制片选信号
#defineWCOMADDR0xC008写命令寄存器的地址
#defineWDATADDR0xC009写数据寄存器的地址
#defineRCOMADDR0xC00A读命令寄存器的地址
#defineRDATADDR0xC00B读数据寄存器的地址
uintnum=0;
ucharLEDCON=0x00;*LCD模块背光控制字,最低位为0时关LED背光,最低位为1时开启LED背光,*
sbitSTART=P3^0;
sbitSW0=P3^1;
sbitSW1=P3^3;
ucharcode);Lcd写指令子程序
voidWriteData(ucharm);Lcd写数据子程序
voidInsitiLcd();Lcd初始化子程序
voidDispHan(ucharcode*a,ucharm,uchark);显示汉字子程序
voidDispShu(uinta,ucharm);数字显示程序
*********************************************
主函数
**********************************************
voidmain()
{
ucharxdata*addr;
InitDevice();
InsitiLcd();
addr=LEDENCS;
LEDCON=~LEDCON;
*addr=LEDCON;
DispHan(;
}
voidXramInit(void)外部数据储存器初始化
{
SFRPAGE=0x0f;
EMI0CF=0x07;引脚复用方式
SFRPAGE=0x00;
return;
}
voidSmbInit(void)I2C总线初始化
{
SMB0CF=0xc1;定时器T1溢出作为时钟
return;
}
voidUartInit(void)异步串口通信接口初始化
{
SCON0=0x00;10位UART
return;
}
voidDacInit(void)DA转化器初始化
{
IDA0CN=0xf2;IDA0使能,写IDA0H触发DAC输出更新,2mA满度输出
return;
}
voidAdcInit(void)AD初始化
{
ADC0CN=0X80;adc0一直跟踪,AD0BUSY写“1”启动
ADC0CF=0x28;转换率2Mhz,右对齐
REF0CN=0X08;选择Vdd做基准电压
AMX0P=0X08;单端输入P2.0
AMX0N=0X1F;
EIE1=0x08;允许ADC中断
return;
}
voidInt0Init(void)外部中断初始化
{
IT01CF=0x05;选择P0.5为INT0
IT0=1;INT0下降沿触发
return;
}
voidPcaInit(void)PCA初始化
{
PCA0CN=0x40;允许PCA计数器定时器
PCA0MD=0x00;禁止看门狗定时器
return;
}
voidInterruptsInit(void)中断系统初始化
{
IE0=0;清INT0中断标志
EX0=1;
PX0=0;
ET0=1;
ET1=1;
EA=1;
return;
}
voidInitDevice(void)
{
OscInit();
PortIoInit();
XramInit();
SmbInit();
UartInit();
DacInit();
AdcInit();
Int0Init();
PcaInit();
InterruptsInit();
TimeInit();
return;
}
*************************************************
检查LCD是否空闲子程序
*************************************************
voidCheckLcd()
{
uchartemp=0x00;
ucharxdata*addr;
while
(1)
{
addr=RCOMADDR;
temp=*addr;
temp&=0x80;
if(temp==0x00)
break;
}
}
*************************************************
Lcd写指令子程序
*************************************************
voidWriteCom(ucharn)
{
ucharxdata*addr;
CheckLcd();
addr=WCOMADDR;
*addr=n;
}
*************************************************
Lcd写数据子程序
*************************************************
voidWriteData(ucharm)
{
ucharxdata*addr;
CheckLcd();
addr=WDATADDR;
*addr=m;
}
*************************************************
Lcd初始化子程序
*************************************************
voidInsitiLcd()
{
WriteCom(0x