简易数字电压表 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简易数字电压表设计
实验报告
姓名陈秀秀
学号 201203870404
指导教师贾立新
专业班级电气1202 学院信息工程学院
一.实验要求
采用C8051F360单片机最小系统设计一简易数字电压表,实现对0~3.3V直流电压的测量,原理框图如图3-1所示。模拟输入电压通过一只1 kΩ电位器产生,ADC0将模拟电压转换成数字量后换算成电压值,用十进制的形式在LCD上显示。进一步,将单片机最小系统与PC通过RS-232通信电缆连接,将A/D转换的数字量在PC终端显示。
图3-1
二.实验设计
设计方案:由主程序、T0中断服务程序、ADC0中断服务程序组成。具体流程图如下图3-2所示。
图3-2
三.具体设计
1.简易数字电压表设计F360初始化及LCD初始化(详细程序代码见附录)
①内部振荡器初始化:OscInit()
②I/O端口初始化:PortIoInit()
③外部数据存储器接口初始化:XramInit()
④定时器初始化:TimerInit()
⑤中断系统初始化:Int0Init()
⑥ADC0初始化:ADC_Init()
⑦PCA初始化:PcaInit()
2.电压转换方式(将电压转换为十进制)
ADCDAT=ADC0H*256+ADC0L;
VOLT=ADCDAT*2.4/1024=ADCDAT*0.002344;
VOLTOUT=VOLT*1000;
for(i=0;i<4;i++)
{
VOLTBCD[i]=VOLTOUT%10;
VOLTOUT=VOLTOUT/10;
}
3.LCD显示程序设计
①检查LCD是否空闲子程序
void CheckLcd()
{
uchar temp=0x00;
uchar xdata *addr;
while(1)
{
addr=RCOMADDR;
temp=*addr;
temp&=0x80;
if(temp==0x00)
break;
}
}
②电压值显示
WriteCom(0x9C);
WriteData(VOLTBCD[3]+0x30);
WriteData(0x2E);
WriteData(VOLTBCD[2]+0x30);
WriteData(VOLTBCD[2]+0x30);
WriteData(VOLTBCD[0]+0x30);
WriteData(0x56);
4.实验中AD转换方式选用逐次逼近型,A/D转换完成后得到10位数据分为高低字节存放在寄存器ADCOH和ADC0L中,此处选择右对齐,转换时针为
2MHZ。
5.选择内部参考电压2.4伏为基准(在实际单片机调试中改为3.311伏),正端接P2.0,负端接地。
四.实验数据测量
V(测量) 0.000 0.372 0.523 0.724 0.980 1326 1.792 2.220 V(实际) 0.00 0.38 0.53 .073 0.99 1.33 1.79 2.23 结论:校准后,测量数据与实际电压误差小于0.01,符合实验精度要求.
五.代码附录
#include
#define uchar unsigned char
#define uint unsigned int
#define WCOMADDR 0xC008 //写命令寄存器的地址
#define WDATADDR 0xC009 //写数据寄存器的地址
#define RCOMADDR 0xC00A //读命令寄存器的地址
#define RDATADDR 0xC00B //读数据寄存器的地址
#define KEYCS 0xC00C //读键盘的地址
uchar code hanzi[]=
{0xbc,0xf2,0xd2,0xd7,0xca,0xfd,0xd7,0xd6,0xb5,0xe7,0xd1,0xb9,0xb1,0xed};//“简易数字电压表”
uchar code keynum[]="键值";
uchar code keyc[]="次数";
uchar time=0; //软件计数器
float VOLT;
uint VOLTBCD[4];
uint ADCDAT,VOLTOUT;
uchar keyn,keycode;
void OscInit(); //内部振荡器初始化
void PortIoInit(); //I/O端口初始化
void XramInit(); //外部数据存储器接口初始化
void PcaInit(); //PCA初始化(设置看门狗定时器的工作状态)void InitDevice(); //内部资源初始化
void CheckLcd(); //检查LCD是否空闲子程序
void WriteCom(uchar n); //Lcd写指令子程序
void WriteData(uchar m); //Lcd写数据子程序
void InsitiLcd(); //Lcd初始化子程序
void DispHan( uchar code *a,uchar m,uchar k); //显示汉字子程序
void TimerInit(); //定时器初始化
void InterruptsInit(); //中断系统初始化
void ADC_init(); //ADC0初始化