山东大学单片机实验:3.8 ADC0808/9信号采集实验

【实验题目】  

本实验利用LCD 1602和AD0808实现简单的交流信号过零检测和频率分析。要求信号幅度变化时(满量程的5%~95%),不影响检测结果。频率检测的结果通过LCD 1602D的第一行显示出来,信号过零时,能够通过P2.6输出一个脉冲宽度为5us的脉冲信号。

【实验要求】 

  • 编写源程序并进行注释。
  • 记录实验过程。
  • 记录程序运行结果。

【实验过程及结果记录】

从25%~75%依次截图为:

【实验源程序】

#include"reg51.h"
#include"intrins.h"

#define uchar unsigned char
#define uint unsigned int

uchar data line[16];
uchar code numchar[]={'0','1','2','3','4','5','6','7','8','9'};

sbit RS=P2^0;\\设置按键
sbit RW=P2^1;
sbit E=P2^2;
sbit clk=P2^3;
sbit start=P2^4;
sbit oe=P2^5;
sbit out=P2^6;
sbit eoc=P2^7;

uchar ADdata1,ADdata0,f1,f2,f3;\\设置变量
uint num,F,t;
bit ADend;

void delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
bit lcd_busy()\\LCD忙检查子程序
{
bit flag;
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
flag=(bit)(P1&0x80);
E=0;
return flag;
}

void lcd_wcmd(uchar cmd)\\命令子程序
{
while(lcd_busy());
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
P1=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}

void lcd_clr()\\清屏程序
{
lcd_wcmd(0x01);
delayms(2);
}

void lcd_wdat(uchar dat)\\写数据子程序
{
while(lcd_busy());
RS=1;
RW=0;
E=0;
_nop_();
_nop_();
P1=dat;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}

void lcd_init()\\初始化子程序
{
delayms(15);
lcd_wcmd(0x38);
delayms(5);
lcd_wcmd(0x0c);
delayms(5);
lcd_wcmd(0x06);
delayms(5);
lcd_wcmd(0x01);
delayms(5);
}

void displaystr(uchar m)\\字符显示子程序
{
uchar i;
switch(m)
{
case 0:
lcd_wcmd(0x80);break;
case 1:
lcd_wcmd(0xc0);break;
}
i=0;
while (line[i]!='\0')
{
lcd_wdat(line[i]);
delayms(1);
i++;
}
}

void s_T0() interrupt 1\\外部中断0子程序
{
TH0=0x3c;
TL0=0xb0;
EA=0;
t++;
if(t==20)

{


F=num/2;
f3=F/100;
f2=F%10 ;
f1=(F%100)/10;
num=0;
t=0;
}
EA=1;
}

void s_T1() interrupt 3\\外部中断0子程序
{

{
clk=~clk;
}

void readAD()\\读取AD子程序
{
start=0;
while(eoc!=1);
ADdata0=ADdata1;
P0=0xff;
_nop_();
_nop_();
_nop_();
_nop_();
oe=1;
ADdata1=P0;
oe=0;
ADend=1;
}

void operation()\\观察是否过0
{
while(!ADend);
if(((ADdata0<128)&&(ADdata1>=128))||((ADdata0>128)&&(ADdata1<=128)))
{
num++;
out=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
out=0;
}
}

void main()\\主程序
{
TMOD=0X21;
TH1=0Xfb;
TL1=0Xfb;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET1=1;
ET0=1;
TR1=1;
TR0=1;
out=0;
start=0;

ADdata0=0;
ADdata1=0;
t=0;

lcd_init();
lcd_clr();
delayms(2);

while(1)
{
ADend=0;
start=1;
delayms(1);
start=0;
readAD();
operation();
line[0]='f';
line[1]='=';
line[2]=numchar[f3];
line[3]=numchar[f2];
line[4]=numchar[f1];
line[5]='H';
line[6]='z';
line[7]='\0';
displaystr(0);
}
}
© 版权声明
THE END
喜欢就支持以下吧
点赞1赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容