有效值检波器Word文档下载推荐.docx
《有效值检波器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《有效值检波器Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
![有效值检波器Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/4c9f0dc6-5845-44c5-a8eb-df506d17e630/4c9f0dc6-5845-44c5-a8eb-df506d17e6301.gif)
由于将多功能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
3
VL
液晶显示偏压信号
11
D4
4
RS
数据/命令选择端(H/L)
12
D5
5
R/W
读写选择端(H/L)
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光源正极
8
D1
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%
0%
50Hz
50
52
4%
53
6%
100Hz
100
107
7%
101
1%
200Hz
199
0.5%
204
2%
200
500Hz
526
5.2%
499
0.2%
498
0.4%
1kHz
1004
998
999
0.1%
2kHz
1995
1997
1993
0.3%
1998
5kHz
4990
4999
4986
4983
10k
9976
9986
9992
9982
9975
20k
19987
0.6%
19978
0.7%
19994
19986
19955
100k
99967
99936
99957
99849
误差平均在0.2%以内。
2.同一电压在不同频率时的测量。
10Hz
100Hz
1000Hz
10KHz
50KHz
50mV
50.8
1.4%
50.4
48
46
8%
100mV
106.4
6.4%
106
104
92
84
16%
200mV
213
6.5%
210
5%
201
189
5.5%
500mV
502
500
458
8.2%
1.03
3%
1.02
1.01
0.92
2V
2.1
2.04
2.01
1.94
1.85
7.5%
5.08
1.6%
5.00
4.92
4.76
2.8%
4.52
9.6%
20V
18.5
误差平均在3%以内。
五.心得体会
在这次电子设计竞赛中我们使用了STC89C52单片机。
这让我对于单片机有了更多的了解。
同时在找资料的过程中学到了许多单片机课本上没有讲到的知识。
在这次电子设计竞赛过程中,我们通过在原有的输入系统进行了改进,使之测量频率和电压有效值精度更高,使之成为一个更加适用,功能更加完备的属于自己的一个系统。
在这个过程中让我对于C语言的编写有了更深入的体会。
在这次电子设计竞赛中,虽然花费了大量的时间和精力,但我却学到了许多在理论课程中无法学到的知识。
最重要的是让我懂得了合作的重要性,学会了如何与人更好的合作。
六、参考文献
[2] 李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
1版
[6]张毅刚等编著.《单片机原理及应用》.北京:
高等教育出版社.2004年1月第1版
附录1电路简图
附录2元器件清单
元器件
描述
数量
STC89C52
单片机
液晶显示器
LCD1602
按键开关
电阻
电容
342uF
晶振
11.0592MHz
ADC0832
电路板
10mm铜柱
10mm
LM324
电位器
103,104
拨码开关
6合1
指示灯
红色
二极管
IN4007
附录3程序清单:
#include<
reg51.h>
//包含单片机寄存器的头文件
intrins.h>
//包含_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>
y--);
}
voidwrite_date(uchardate)//写数据
{
P0=0xFF;
delay(5);
RS=1;
E=0;
P0=date;
E=1;
voidwrite_com(ucharcom)
RS=0;
P0=com;
voidinit()//写位
ucharnum;
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;
n;
delay1ms();
bitBusyTest(void)//函数功能:
判断液晶模块的忙碌状态
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
_nop_();
//空操作
//空操作四个机器周期,给硬件反应时间
result=BF;
//将忙碌标志电平赋给result
E=0;
//将E恢复低电平
returnresult;
//函数功能:
将模式设置指令或显示地址写入液晶模块
voidWriteInstruction(unsignedchardictate)
while(BusyTest()==1);
//如果忙就等待
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//空操作两个机器周期,给硬件反应时间
P0=dictate;
//将数据送入P0口,即写入指令或地址
//空操作四个机器周期,给硬件反应时间
//E置高电平
//当E由高电平跳变成低电平时,液晶模块开始执行命令
voidWriteAddress(unsignedcharx)//函数功能:
指定字符显示的实际地址
WriteInstruction(x|0x80);
//显示位置的确定方法规定为"
80H+地址码x"
voidWriteData(unsignedchary)//函数功能:
将数据(字符的标准ASCII码)写入液晶模块
RS=1;
//RS为高电平,RW为低电平时,可以写入数据
P0=y;
//将数据送入P0口,即将数据写入液晶模块
voidLcdInitiate(void)//函数功能:
对LCD的显示模式进行初始化设置
delaynms(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);
//显示模式设置:
16×
2显示,5×
7点阵,8位数据接口
delaynms(5);
//延时5ms ,给硬件一点反应时间
//连续三次,确保初始化成功
WriteInstruction(0x0c);
显示开,无光标,光标不闪烁
WriteInstruction(0x06);
光标右移,字符不移
WriteInstruction(0x01);
//清屏幕指令,将以前的显示内容清除
voiddisplay_volt(void)//函数功能:
显示电压符号数功能:
显示电压符号
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列开始显示
V'
//将字符常量写入LCD
voiddisplay1(unsignedcharx)//函数功能:
显示电压的整数部分
WriteAddress(0x08);
//写显示地址,将在第2行第7列开始显示
WriteData(digit[x]);
//将百位数字的字符常量写入LCD
voiddisplay2(unsignedcharx)//函数功能:
显示电压的小数数部分
i=x/10;
//取十位(小数点后第一位)
j=x%10;
//取个位(小数点后第二位)
WriteAddress(0x0a);
//写显示地址,将在第1行第11列开始显示
WriteData(digit[i]);
//将小数部分的第一位数字字符常量写入LCD
WriteData(digit[j]);
unsignedcharA_D()//函数功能:
将模拟信号转换成数字信号
unsignedchari,dat;
CS=1;
//一个转换周期开始
CLK=0;
//为第一个脉冲作准备
CS=0;
//CS置0,片选有效
DIO=1;
//DIO置1,规定的起始信号
CLK=1;
//第一个脉冲
//第一个脉冲的下降沿,此前DIO必须是高电平
//DIO置1,通道选择信号
//第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
//第二个脉冲下降沿
DIO=0;
//DI置0,选择通道0
//第三个脉冲
//第三个脉冲下降沿
//第三个脉冲下沉之后,输入端DIO失去作用,应置1
//第四个脉冲
8;
i++)//高位在前
dat<
<
=1;
//将下面储存的低位数据向右移
dat|=(unsignedchar)DIO;
//将输出数据DIO通过或运算储存在dat最低位
//片选无效
returndat;
//将读书的数据返回
voidmain()//函数功能:
主函数