有效值检波器.docx

上传人:b****2 文档编号:22805073 上传时间:2023-04-28 格式:DOCX 页数:24 大小:121.27KB
下载 相关 举报
有效值检波器.docx_第1页
第1页 / 共24页
有效值检波器.docx_第2页
第2页 / 共24页
有效值检波器.docx_第3页
第3页 / 共24页
有效值检波器.docx_第4页
第4页 / 共24页
有效值检波器.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

有效值检波器.docx

《有效值检波器.docx》由会员分享,可在线阅读,更多相关《有效值检波器.docx(24页珍藏版)》请在冰豆网上搜索。

有效值检波器.docx

有效值检波器

2011年春季西南交通大学大学生电子设计竞赛

设计报告

 

有效值检波器

 

 

2011年5月27日

 

有效值检波器

引言

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

单片机因为体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,被广泛应用于仪器仪表中。

目前市场上的便携式仪表大多都是以单片机为核心。

LCD1602为工业字符型液晶,能够同时显示16x02即32个字符。

(16列2行)单片机加LCD1602液晶显示器,基本可以满足本次单片机控制的数显频率计的设计与制作。

ADC0832是NS(NationalSemiconductor)公司生产的串行接口8位A/D转换器,通过三线接口与单片机连接,功耗低,性能价格比较高,适宜在袖珍式的智能仪器仪表中使用。

ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。

芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。

通过DI数据输入端,可以轻易的实现通道功能的选择。

 

一.方案认证

1.单片机部分:

考虑到电子设计竞赛的内容和设计的目的,决定选取STC89C52。

此单片机虽然属于低端机型,但足以满足设计的要求。

选取其它的高端机型有些浪费。

所以使用STC89C52。

2.显示部分:

此次电子设计大赛要求地显示部分能够完成数字和常用字符的显示。

若用数码管则只能显示0-F,不能显示其它的字符及符号。

所以不能用数码管。

而选用LCD1602恰好符合要求。

所以应用LCD1602。

3.A/D转换部分:

ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。

芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。

通过DI数据输入端,可以轻易的实现通道功能的选择。

所以应用ADC0832。

二、硬件电路的设计

1.工作原理及系统框图

此次课程设计的要求如下:

一方面,单片机要通过I/O中接收输入信号,另一方面要通过I/O口控制液晶的初始化、显示方式以及要显示的字符。

因此,设计必须以单片机为核心,显示器为外围设备。

硬件上,单片机通过电路板电路与液晶显示电路相连;软件上,单片机要下载完整的程序对二者进行适时的控制。

 

5V

5V

单片机控制的数显频率计电路系统框图

从图中可以看出,单片机控制的有效值检波器的主要功能模块分为4类:

●液晶显示:

是指在单片机的控制下,液晶模块显示被测信号的频率与有效值。

●电源模块:

为单片机和液晶显示器提供工作电源。

●A/D模块:

将交流电压由模拟量转换为数字量。

●放大模块:

将微小交流电压量放大。

单片机电路主要是通过编写程序来控制硬件电路。

因此,可以通过改变程序,提高测量精度。

2.各部分电路设计

2.1单片机控制电路

单片机控制电路由STC89C52单片机、晶振时序电路、复位电路构成。

2.2.1单片机STC89C52

STC89C52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,STC89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

本次设计主要用到单片机4个I/O口中的3个,其中P3口及P1.0-P1.2与液晶显示器相接,18、19脚外界晶振电容为单片机提供时序。

2.2.2晶振时序电路

XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

2.2.3复位电路

常见的复位电路有两种:

上电复位电路和开关复位电路,可根据电路的需要选择复位电路。

2.3液晶显示电路

字符型液晶显示模块LCD1602是一种用5x7点阵图形来显示字符的液晶显示器,其引脚功能如下表所示。

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

DataI/O

2

VDD

电源正极

10

D3

DataI/O

3

VL

液晶显示偏压信号

11

D4

DataI/O

4

RS

数据/命令选择端(H/L)

12

D5

DataI/O

5

R/W

读写选择端(H/L)

13

D6

DataI/O

6

E

使能信号

14

D7

DataI/O

7

D0

DataI/O

15

BLA

背光源正极

8

D1

DataI/O

16

BLK

背光源负极

读状态:

输入:

RS=L,RW=H,E=H输出:

D0~D7=状态字

写指令:

输入:

RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:

读数据:

输入:

RS=H,RW=H,E=H输出:

D0~D7=数据

写数据:

输入:

RS=H,RW=L,D0~D7=数据,E=高脉冲输出:

根据1602液晶显示器的读写时序操作,编写相应的单片机驱动程序,便可以实现液晶显示器的显示输出。

2.4A/D转换电路

ADC0832有DIP和SOIC两种封装,DIP封装的ADC0832引脚排列如图所示。

各引脚说明如下:

CS——片选端,低电平有效。

CH0,CH1——两路模拟信号输入端。

DI——两路模拟输入选择输入端。

DO——模数转换结果串行输出端。

ADC0832引脚图

CLK——串行时钟输入端。

Vcc/REF——正电源端和基准电压输入端。

GND——电源地。

2.4电压放大及整流电路

在本设计中,采用LM324运放组成放大电路,对微量交流电压信号进行放大。

同时,对交流信号全波整流。

三、系统的软件设计

软件调试主要是编写相应的程序,在电路仿真软件上仿真,直至到预期效果。

1.程序框图

主程序及各子程序的框图见图。

主程序框图LCD程序流程图

2.程序清单

根据程序流程图,编写相应的子程序和主程序。

程序清单见附录3。

四、测试数据

1.同一频率在不同电压时的测量。

40mV

100mV

500mV

1V

5V

20Hz

20

0.0%

20

0%

20

0%

20

0%

20

0%

50Hz

50

0.0%

50

0%

52

4%

50

0%

53

6%

100Hz

100

0.0%

107

7%

101

1%

100

0%

101

1%

200Hz

199

0.5%

204

2%

200

0%

199

0.5%

199

0.5%

500Hz

526

5.2%

499

0.2%

499

0.2%

499

0.2%

498

0.4%

1kHz

1004

0.4%

998

0.2%

998

0.2%

999

0.1%

998

0.2%

2kHz

1995

0.2%

1997

0.1%

1993

0.3%

1995

0.2%

1998

0.1%

5kHz

4990

0.2%

4999

0.1%

4986

0.3%

4990

0.2%

4983

0.4%

10k

9976

0.2%

9986

0.1%

9992

0.1%

9982

0.1%

9975

0.2%

20k

19987

0.6%

19978

0.7%

19994

0.1%

19986

0.6%

19955

1%

100k

99967

0.1%

99936

0.1%

99967

0.1%

99957

0.1%

99849

0.1%

误差平均在0.2%以内。

2.同一电压在不同频率时的测量。

10Hz

100Hz

1000Hz

10KHz

50KHz

50mV

50.8

1.4%

50.8

1.4%

50.4

1.4%

48

4%

46

8%

100mV

106.4

6.4%

106

6%

104

4%

92

8%

84

16%

200mV

213

6.5%

210

5%

204

2%

201

0.5%

189

5.5%

500mV

502

0.4%

500

0%

500

0%

500

0%

458

8.2%

1V

1.03

3%

1.02

2%

1.01

1%

1.01

1%

0.92

8%

2V

2.1

0.5%

2.04

2%

2.01

0.5%

1.94

3%

1.85

7.5%

5V

5.08

1.6%

5.00

0%

4.92

1.6%

4.76

2.8%

4.52

9.6%

20V

20

0%

20

0%

20

0%

20

0%

18.5

0.7%

误差平均在3%以内。

 

五.心得体会

在这次电子设计竞赛中我们使用了STC89C52单片机。

这让我对于单片机有了更多的了解。

同时在找资料的过程中学到了许多单片机课本上没有讲到的知识。

在这次电子设计竞赛过程中,我们通过在原有的输入系统进行了改进,使之测量频率和电压有效值精度更高,使之成为一个更加适用,功能更加完备的属于自己的一个系统。

在这个过程中让我对于C语言的编写有了更深入的体会。

在这次电子设计竞赛中,虽然花费了大量的时间和精力,但我却学到了许多在理论课程中无法学到的知识。

最重要的是让我懂得了合作的重要性,学会了如何与人更好的合作。

六、参考文献

[2] 李广弟.单片机基础[M].北京:

北京航空航天大学出版社,1994

[3] 阎石.数字电子技术基础(第三版).北京:

高等教育出版社,1989

1版

[6]张毅刚等编著.《单片机原理及应用》.北京:

高等教育出版社.2004年1月第1版

 

附录1电路简图

 

 

附录2元器件清单

元器件

描述

数量

STC89C52

单片机

1

液晶显示器

LCD1602

1

按键开关

2

电阻

100

3

电容

342uF

1

晶振

11.0592MHz

1

ADC0832

1

电路板

2

10mm铜柱

10mm

12

LM324

1

电位器

103,104

6

拨码开关

6合1

1

指示灯

红色

1

二极管

IN4007

4

 

附录3程序清单:

#include//包含单片机寄存器的头文件

#include//包含_nop_()函数定义的头文件

#defineucharunsignedchar

#defineuintunsignedint

sbitCS=P1^2;//将CS位定义为P3.4引脚

sbitCLK=P1^0;//将CLK位定义为P1.0引脚

sbitDIO=P1^1;//将DIO位定义为P1.1引脚

unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字

unsignedcharcodeStr[]="Volt=";//说明显示的是电压

//以下是对液晶模块的操作程序

sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚

sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚

sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚

sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚

//频率

ucharcodetable1[]="Freq=Hz";

unsignedcharcode

table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

bitflag;//定义标志位,确定是否到了1s

unsignedlongx;

ucharT0count;//从T0的计数单元中读取计数的数值

uchartimecount;

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidwrite_date(uchardate)//写数据

{

P0=0xFF;

delay(5);

RS=1;

E=0;

P0=date;

delay(5);

E=1;

delay(5);

E=0;

}

voidwrite_com(ucharcom)

{

P0=0xFF;

delay(5);

RS=0;

E=0;

P0=com;

delay(5);

E=1;

delay(5);

E=0;

}

voidinit()//写位

{

ucharnum;

E=0;write_com(0x80+0x40);

for(num=0;num<16;num++)

{

write_date(table1[num]);

delay(5);

}

}

voidLcdPos(ucharxPos,ucharyPos)

//设置第(xPos,yPos)个字符的DDRAM地址

{unsignedchartmp;

xPos&=0x0f;//x位置范围是0~15

yPos&=0x01;//y位置范围是0~1

if(yPos==0)//显示第一行

tmp=xPos;

else

tmp=xPos+0x40;

tmp|=0x80;

write_com(tmp);

}

voidwrite_char(ucharc,ucharxPos,ucharyPos)

{

LcdPos(xPos,yPos);

write_date(c);

}

voiddelay1ms()//函数功能:

延时1ms

{

unsignedchari,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++);

}

voiddelaynms(unsignedcharn)//函数功能:

延时若干毫秒,入口参数:

n

{

unsignedchari;

for(i=0;i

delay1ms();

}

bitBusyTest(void)//函数功能:

判断液晶模块的忙碌状态

{

bitresult;

RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;//E=1,才允许读写

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result

E=0;//将E恢复低电平

returnresult;

}

//函数功能:

将模式设置指令或显示地址写入液晶模块

voidWriteInstruction(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,

_nop_();

_nop_();//空操作两个机器周期,给硬件反应时间

P0=dictate;//将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

voidWriteAddress(unsignedcharx)//函数功能:

指定字符显示的实际地址

{

WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"

}

voidWriteData(unsignedchary)//函数功能:

将数据(字符的标准ASCII码)写入液晶模块

{

while(BusyTest()==1);

RS=1;//RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,

P0=y;//将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

voidLcdInitiate(void)//函数功能:

对LCD的显示模式进行初始化设置

{

delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);//显示模式设置:

16×2显示,5×7点阵,8位数据接口

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);//连续三次,确保初始化成功

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x0c);//显示模式设置:

显示开,无光标,光标不闪烁

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x06);//显示模式设置:

光标右移,字符不移

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除

delaynms(5);//延时5ms ,给硬件一点反应时间

}

voiddisplay_volt(void)//函数功能:

显示电压符号数功能:

显示电压符号

{

unsignedchari;

WriteAddress(0x01);//写显示地址,将在第2行第1列开始显示

i=0;//从第一个字符开始显示

while(Str[i]!

='\0')//只要没有写到结束标志,就继续写

{

WriteData(Str[i]);//将字符常量写入LCD

i++;//指向下一个字符

}

}

voiddisplay_dot(void)//函数功能:

显示电压的小数点

{

WriteAddress(0x09);//写显示地址,将在第1行第10列开始显示

WriteData('.');//将小数点的字符常量写入LCD

}

voiddisplay_V(void)//函数功能:

显示电压的单位(V)

{

WriteAddress(0x0d);//写显示地址,将在第2行第13列开始显示

WriteData('V');//将字符常量写入LCD

}

voiddisplay1(unsignedcharx)//函数功能:

显示电压的整数部分

{

WriteAddress(0x08);//写显示地址,将在第2行第7列开始显示

WriteData(digit[x]);//将百位数字的字符常量写入LCD

}

voiddisplay2(unsignedcharx)//函数功能:

显示电压的小数数部分

{

unsignedchari,j;

i=x/10;//取十位(小数点后第一位)

j=x%10;//取个位(小数点后第二位)

WriteAddress(0x0a);//写显示地址,将在第1行第11列开始显示

WriteData(digit[i]);//将小数部分的第一位数字字符常量写入LCD

WriteData(digit[j]);//将小数部分的第一位数字字符常量写入LCD

}

unsignedcharA_D()//函数功能:

将模拟信号转换成数字信号

{

unsignedchari,dat;

CS=1;//一个转换周期开始

CLK=0;//为第一个脉冲作准备

CS=0;//CS置0,片选有效

DIO=1;//DIO置1,规定的起始信号

CLK=1;//第一个脉冲

CLK=0;//第一个脉冲的下降沿,此前DIO必须是高电平

DIO=1;//DIO置1,通道选择信号

CLK=1;//第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0

CLK=0;//第二个脉冲下降沿

DIO=0;//DI置0,选择通道0

CLK=1;//第三个脉冲

CLK=0;//第三个脉冲下降沿

DIO=1;//第三个脉冲下沉之后,输入端DIO失去作用,应置1

CLK=1;//第四个脉冲

for(i=0;i<8;i++)//高位在前

{

CLK=1;//第四个脉冲

CLK=0;

dat<<=1;//将下面储存的低位数据向右移

dat|=(unsignedchar)DIO;//将输出数据DIO通过或运算储存在dat最低位

}

CS=1;//片选无效

returndat;//将读书的数据返回

}

voidmain()//函数功能:

主函数

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1