山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

这篇具有很好参考价值的文章主要介绍了山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、实验题目

二、实验要求

三、实验过程及结果分析

四、实验流程图

五、实验源代码


一、实验题目

3.8 ADC0808信号采集实验

二、实验要求

1、画出实验的流程图

2、编写源程序并进行注释

3、记录实验过程

4、记录程序运行结果截图

三、实验过程及结果分析

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

1. 根据上述实验内容,在Proteus 环境下建立图1所示原理图,并将其保存为ADC0808_self.DSN 文件。

山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

图1:实验电路图 

2. 编写源程序,将其保存为ADC0808_self.c,运行Keil开发环境,建立工程ADC0808_self.uV2,CPU 为AT89C51,包含启动文件STARTUP.A51。

3. 将C 语言源程序ADC0808_self.c 加入工程ADC0808_self.uV2,并设置工程ADC0808_self.uV2 属性,将其晶振频率设置为12MHz,选择输出可执行文件,仿真方式为选择硬仿真,并选择其中的“PROTEUS VSM MONITOR 51 DRIVER”仿真器。

4.构造(Build)工程ADC0808_self.uV2。如果输入有误进行修改,直至构造正确,生成可执行程序ADC0808_self.hex 为止。为AT89C51 设置可执行程序ADC0808_self.hex。

5. 运行程序,观察计算结果,并验证其是否正确。改变RV1 的抽头位置,从而改变输入信号的幅值,观察计算结果是否正确。更改信号发射器的频率,再次验证其功能是否正确。(注意:因为是软仿真,所以信号采集的速度受到限制,因此所输入的交流信号频率也不能太高,可以在200Hz以内尝试)。

实验结果如下:

1)将电位器至于满量程的90%,此时信号的幅值就是最大值的90%

山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

图2:电位器调整到满量程的90%

2)将电位器至于满量程的50%,此时信号的幅值为最大值的一半

山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

图3:电位器调整到满量程的50%

3)电位器调整到满量程的10%,此时信号的幅值为最大值的10%

山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

图4:电位器调整到满量程的10%

四、实验流程图

山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

图5:实验流程图

        LCD1602的控制方法按3.7节所示方法进行ADC0808的控制方法按3.8.1所示方法进行。这里主要是过零点的检测方法如何实现。不能采用判断所采集到的数据是否为 0 的方法来实现,因为你的采集时刻不一定能够严格对准过零时刻。但是,我们注意到在 0 点的两边信号的极性是发生变化的,我们可以利用这一特点来实现过零检测。正弦波每个周期有两个过零点,因此,1s 内过零次数除以 2 就是信号的频率。

        因此,在程序中可以这样实现。当每次采集到一个新的数据之后都要看一下这个数据是正数还是负数。当这个数大于 128 时是正数,当它小于 128 时是负数。判断当前数据的正负极性和上一个数据的正负极性是否一致,如果不一致,则说明经过了一次过零点,将其记录入次数计数器。

        ADC0808 的 CLK 仍然用定时器 T1 来实现,可以将其设置为 50kHz(硬件实现时可以更高,软件仿真再高将难以实现)。利用定时器 T0 实现 50ms 定时,并配合软件实现 1s 钟定时。采用 12M 晶振时,T0 采用方式 1,则处置应为(TH0=0x3C,TL0=0xB0)。

        但是,由于中断处理函数需要一定的响应时间,因此这个参数只是理论计算结果,要根据实测情况稍作调整。 同样 T1 理论计算值和实际输出值可能也会有一定的差距,也要进行调整。

五、实验源代码

#include "reg51.h"    //  单片机寄存器头文件
#include "intrins.h"  // _ nop_()等函数定义的头文件
sbit LCD_RS=P2^0;  //寄存器选择位,将RS位定义为P2.0引脚
sbit LCD_RW=P2^1; // 读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚
sbit BF=P1^7;    // P0.7为忙碌标志位

sbit CLK=P2^3;   // 设置时钟端口
sbit start=P2^4; 
sbit oe=P2^5;  
sbit eoc=P2^7; 

sbit out_pulse=P2^6;  // P2^6端口输出5us脉冲

sbit p30=P3^0; 
#define uchar unsigned char
#define uint unsigned int

uchar n=0;
uchar flag=0; 

void delay1ms()// 定义延时1ms函数
{
   		unsigned char i,j;	
	 	for(i=0;i<10;i++)
	  	for(j=0;j<33;j++);		 
 }

 void delay(unsigned int n)	//定义延时nms函数
 {
   	unsigned int i;
	for(i=0;i<n;i++)
	delay1ms();
 }

 bit BusyTest(void) //检查子程序,为1时繁忙,为0时不忙
  {
    	bit result;
		LCD_RS=0;       
    	LCD_RW=1;
    	E=1;       
    	_nop_();   
    	_nop_();
    	_nop_(); 
   		_nop_();   
    	result=BF;  
		E=0;
    	return result;
  }


void Write_com (uchar cmd)		//写命令子程序
{   
    while(BusyTest()==1); 
	 LCD_RS=0;             
	 LCD_RW=0;       // RS/RW都是0的时,写指令
	 E=0;                  
                             
	 _nop_();
	 _nop_();            
	 P1=cmd;   // 写指令操作   
	 _nop_();//运行一个机器周期
	 _nop_();  
	 _nop_();
	 _nop_();               
	 E=1;                   
	 _nop_();
	 _nop_();
	 _nop_();
	 _nop_();               
	  E=0;  // E由高跳低写入
 }


 void WriteAddress(unsigned char x)
 {
     Write_com(x|0x80); //显示位置为"80H+地址码x"	
 }



 void WriteData(unsigned char y)   //写数据子程序
 {
    while(BusyTest()==1);  
	  LCD_RS=1; 
	  LCD_RW=0;
	  E=0;            
                      
	  P1=y;   // 执行操作
	  _nop_(); //运行一个机器周期
	  _nop_();
 	  _nop_();
    	nop_();     
	  E=1;         
	  _nop_(); 
	  _nop_();
	  _nop_();
	  _nop_();       
	  E=0;         
 }

void LcdInt(void) //初始化LCD
{
   	delay(15);  // 延时15ms,让电源稳定
   	Write_com(0x38);  //设置显示,即16×2显示,5×7点阵,8位数据接口
	delay(5);   //延时5ms 
	Write_com(0x0c);  //设置显示:显示开,有光标,光标闪烁
	delay(5);
	Write_com(0x06);  D=1,S=0地址自加1
	delay(5);											  
	Write_com(0x01);  // 清屏幕操作
	delay(5);
 }
void sysinit()			   //系统初始化
{                             
	TMOD = 0x21;  //  设定定时器T1工作方式为自动重装8位计数器,T0工作方式为方式1(16位计数器)
	TH1=0xfd;  //利用中断产生CLK信号
	TL1=0xfd;  

	EA=1;     //开总中断  	
	ET1=1;  	//T1中断允许
	TR1=1;     //启动定时器T1

	TH0=0x45;    // 置初值
	TL0=0x00;  //50MS定时	
	ET0=1;	 //T0中断允许
	TR0=1;	 //启动定时器T0
	start=0;  //A/D转换启动信号起始为0
	oe=0;   //数据输出允许信号起始为0
}

void t0(void) interrupt 1	//T0中断服务程序
{
	ET0=0;     // 关中断
	TH0=0X45;  
	TL0=0X00; 
	n++;
	if(n==20) {flag=1;n=0;}		 //循环20次,即完成1S定时
	
	ET0=1;						//开T0中断允许
	
}
void t1(void) interrupt 3		// 定时器T1中断服务程序
{
	ET1=0;    // 关闭中断
	CLK=~CLK;  // 每中断一次,取上一次clk信号的反,如此便产生了50KHz的周期性方波信号
	ET1=1;    //开启中断
}
unsigned char adc()//数据采集子程序
{
   unsigned  char  Temp;
   start=1;
   start=0;  //启动信号
   while (!eoc); // A/D转换结束信号,0代表转换完成,可以输出
   P0=0xff; // 读之前先写入1 
   oe=1;	
   Temp=P0; //读取采集数据
   oe=0;
   return(Temp); 
}

void display(uint a)//显示子函数
{
	uint bai,shi,ge;
	bai=a/100;
	shi=(a-bai*100)/10;
	ge=a%10;
	WriteAddress(2);
	WriteData(0x30+bai);    //显示百位
	WriteData(0x30+shi);     //显示十位
	WriteData(0x30+ge);     //显示个位
}
void main()    // 定义主程序
{
	uint temp1,temp2;
	uchar f=0;
	LcdInt();
	delay(5);
	sysinit();
	CLK=0;
	WriteAddress(0); //从第0行开始显示
	WriteData('f');   //显示 f ; 等
	WriteData(':');  
	WriteAddress(5);     //从第5行开始显示
	WriteData('H');	    //显示H
	WriteData('z');      //显示z
	while(1)           //一直循环
	{		
		temp2=temp1;
		temp1=adc();//ad采集
		if(((temp1>=128)&&(temp2<=128))||((temp1<=128)&&(temp2>=128)))	//过零时两次采集极性相反
		{
			f++;
			out_pulse=1;   //过零时输出脉冲信号
			_nop_();	   //运行一个机器周期
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			out_pulse=0;     //产生5us的脉冲信号
		}
		if(flag==1)      //1s后计算频率
		{
			flag=0;     // 标志位清0
			f=f/2;     // 一个周期两次过零点
			display(f);     //显示频率
			f=0;
		}
	}
}

受于文本原因,本文相关实验工程无法展示出来,现已将资源上传,可自行下载。

山东大学单片机原理与应用实验工程文件3.8ADC0808/9信号采集实验-单片机文档类资源-CSDN下载山东大学单片机原理与应用实验工程文件3.8ADC0808/9信号采集实验详解博客地址:http更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/m0_52316372/85926174文章来源地址https://www.toymoban.com/news/detail-466981.html

到了这里,关于山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 山东大学计算机科学与技术学院程序设计思维与实践作业 week8-图和树的性质与应用(下)

    山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H8 山大程序设计思维实践作业H8 山东大学程序设计思维与实践 week8-图和树的性质与应用(下) 相关资料:GitHub 问题描述 现在有一个长

    2023年04月25日
    浏览(61)
  • 山东大学增强现实实验四

    注意:本人尚处在opencv的入门学习阶段,本博客仅为个人学习笔记见解,如有不当,欢迎指出 (实验/理论)平面标志物的视觉跟踪,要求: 选择一个标志物,可以是人工标志物,也可以是自然标志物;实现和实验二相同的效果。 用手机或摄像头拍摄标志物的影像,建议读取视

    2024年02月08日
    浏览(64)
  • 山东大学计算机网络期末

    内容仅供参考。如有错误之处,敬请指正! 第一章 概述 第二章 物理层 第三章 数据链路层 第四章 介质访问子层 第五章 网络层 第六章 传输层 第七章 应用层 1.基本概念 计算机网络定义: 表示一组通过单一技术相互连接起来的自主计算机集合。 分布式系统: 是建立在网络

    2024年02月03日
    浏览(45)
  • 整数序列(山东大学考研机试题)

    题目链接:3717. 整数序列 - AcWing题库

    2024年02月13日
    浏览(43)
  • 2021山东大学众智期末复习笔记

    目录 社交网络 同质性 正负关系 小世界 搜索引擎 博弈论 市场 权力 从众 新事物的扩散 信息不对称 流⾏病和线粒体夏娃 强连通图:有向图G中,任意两点可以相互到达。 有向图的强连通分量:有向图中的极大强连通子图。 三元闭包:如果两个互不相识的人有了一个共同的朋

    2023年04月08日
    浏览(43)
  • 山东大学数字图像处理实验(一)

    题目:加载并显示图像 imread 函数原型为 imread(const string filename, int flags=1) 这里的 filename 需要的是图像的路径。该函数从文件中加载图像并返回一个矩阵,如果图像不能被读取,则返回一个空的矩阵 这里介绍一下不同 flag 的效果 flag=-1 :8位深度,原通道 flag=0 :8位深度,

    2024年02月06日
    浏览(55)
  • 【山东大学】web数据管理——复习笔记

    写在前面 若有图片加载失败,请 科学上网 。 本文为对软件学院连老师的PPT课件总结所得的复习笔记,仅供参考。不保证对考点的全覆盖,以PPT为主。 对往年考过的题相关知识点前面都标注了“考过”,并高亮,供参考。 写的比较匆忙,有遗漏、错误之处敬请指正。 笔记中

    2024年02月08日
    浏览(45)
  • 山东理工大学单元测试2重现

    本次单元测试虽然较第一次机测难度增加,但整体难度与平时pta练习相比,难度并不大,一些细节同学们在考试时容易忽略,本次八道题,可关注第四题的简便公式,以及第七题的注意事项和第八题运行超时的解决办法。 7-1 sdut-C语言实验-A+B for Input-Output Practice (不确定次数循

    2024年02月05日
    浏览(38)
  • 【软件工程】山东大学软件工程复习提纲

    涵盖所有考点,复习绝对高效,点赞+留邮箱获取pdf版本 本提纲可以完全摘抄,考试命中率100%,先上考试带的A4纸: 1. 软件工程三要素 方法:为软件开发提供了“如何做 ”的技术,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计等; 工具:为软件工

    2024年02月13日
    浏览(31)
  • 山东大学众智科学与网络化产业复习笔记

    写在前面:鹿男神yyds,讲课诙谐有趣,条理清晰,给分可冲,总而言之,众智可冲,题主94,12/160,本文是复习时的总结,希望学弟学妹95+ 图 = 事物(节点) + 联系(边) 同构:图的画法不同,结构上相同,两图同构意味着可以找到一组对应的点,其关系也一致。 邻接矩阵

    2024年01月23日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包