基于51单片机的模拟量输入输出通道实验

实验一 模拟量输入输出通道实验(C51

一、实验目的:

1、了解A/D、D/A转换的基本原理。

2、了解A/D转换芯片ADC0809、D/A转换芯片DAC0832的性能及编程方法。

3、掌握过程通道中A/D转换与D/A转换与计算机的接口方法。

4、了解计算机如何进行数据采集及输出控制。

二、实验设备

计算机 1台;

缔造者系统 1套:CPU挂箱、8031CPU模块;

万用表 1块;

示波器 1台。

三、实验内容

一)、A/D转换实验

利用实验台上的ADC0809做A/D转换器,实验箱上的电位器提供模拟电压信号输入,编制程序,将模拟量转换成数字量,用数码管显示模拟量转换的结果。

1、实验电路:如图1

图1

2、实验接线:

1)0809的片选信号CS0809接CS0。

2)电位器的输出信号AN0接0809的ADIN1。

3、实验程序

   #include <reg51.h>

#include <absacc.h>

#define INT8U unsigned char

#define INT16U unsigned int

#define Val DBYTE[0x35]

#define RAM8279  XBYTE[0X0CFE9]

#define DATA8279 XBYTE[0X0CFE8]

#define ADC0809  XBYTE[0X0CFA0]

INT8U code SEG_CODE[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

  void delay1_ms(INT8U x)

  {   INT8U t;while(x--) for(t=0;t<120;t++);  }

void main()

{

INT8U ADvalue,AD1,AD2,AD3;

while(1)

   {ADC0809=1;      //start AD

   delay1_ms(10);   //delay

   ADvalue=ADC0809;

   Val=ADvalue;

   AD1=ADvalue/100;   //baiwei

   AD2=ADvalue%100/10; //shi wei

   AD3=ADvalue%10;      //ge wei

   RAM8279=0x90;

   DATA8279=SEG_CODE[AD1];

   delay1_ms(10);

   DATA8279=SEG_CODE[AD2];

   delay1_ms(10);

   DATA8279=SEG_CODE[AD3];

   delay1_ms(10);    

  }

}

4、实验步骤

1)从系统“开始”菜单进入“所有程序”,在“所有程序”中选择“Windows Virtual PC”,点击“Windows XP Mode”进入虚拟机系统。

2)根据接线图接线,并运行EL型(8051)教学实验环境,建立上位计算机与缔造者系统的通信连接。(串口选择COM2;波特率选择9600;点击屏幕中对话框确定后立刻按下设备上的复位键RST,若设备上的数码管显示C则表示通信成功。)

3)新建一个汇编文件(点击工具栏上的字母A,若程序用单片机C语言编写,则点击工具栏上的字母C),输入C51源程序,编译成功后,选择调试-运行。

4)用万用表测量电位器电压,依次调节电位器旋钮,并使数码管从一个较小的数开始变化。记录表格1。

表1 A/D转换实验数据表

序号

电位器电压(V)

理论计算的AD转换结果数字量(十进制)

数码管显示值(十进制)

理论计算与实际显示值相对误差

1

0.29

14

14

0

2

0.68

32

32

0

3

0.86

43

42

1

4

1.76

89

88

1

5

2.40

120

118

2

6

2.81

143

140

3

7

3.30

168

167

1

8

4.03

206

202

4

9

4.21

215

210

5

10

4.49

229

224

5

二)、D/A转换实验

利用DAC0832,编制程序产生波形信号。

  1. 循环产生锯齿波、三角波各10周期;
  2. 波形的VP-P峰峰值为4V。
  3. 要求DAC0832工作方式为单缓冲方式。

1、实验电路:如图2

图2

2、实验接线

DAC0832的片选CS0832接CS1,输出端OUT接示波器探头信号表笔,接地端GND接示波器地线夹子。DS2.3脚用跳线冒短接(单缓冲方式). DS1.2脚用跳线冒短接(双缓冲方式)。

3、实验程序

1)产生锯齿波程序:

#include <reg51.h>

#include <absacc.h>

#define INT8U unsigned char

#define INT16U unsigned int

#define DAC0832 XBYTE[0X0CFA8]

  void delay_ms(INT8U x)

  {   INT8U t;while(x--) for(t=0;t<1;t++);  }

void main()

{INT8U i;

  while(1)

   {

   for(i=0;i<255;i++)  //

   {DAC0832=i;

delay_ms(1);

}

   }

}   

2)产生三角波程序:

#include <reg51.h>

#include <absacc.h>

#define INT8U unsigned char

#define INT16U unsigned int

#define DAC0832 XBYTE[0X0CFA8]

  void delay_ms(INT8U x)

  {   INT8U t;while(x--) for(t=0;t<1;t++);  }

void main()

{INT8U i;

  while(1)

   {

   for(i=0;i<255;i++) //zheng ban zhou

   {DAC0832=i;

   delay_ms(1);

}

 for(i=255;i>0;i--)  //fu ban zhou

   {DAC0832=i;

   delay_ms(1);

}

 }

}  

4、实验步骤

1)从系统“开始”菜单进入“所有程序”,在“所有程序”中选择“Windows Virtual PC”,点击“Windows XP Mode”进入虚拟机系统。

2)根据接线图接线,并运行EL型(8051)教学实验环境,建立上位计算机与缔造者系统的通信连接。(串口选择COM2;波特率选择9600;点击屏幕中对话框确定后立刻按下设备上的复位键RST,若设备上的数码管显示C则表示通信成功。)3)输入产生锯齿波、三角波的C51源程序,编译连接成功后运行。

4)记录示波器显示的波形曲线,读数,填入表2。

 

表2波形产生实验数据表

锯齿波

周期(ms)\频率(Hz)

43.55Hz

峰峰值Vp-p(V)

536.0mV

三角波

周期(ms)\频率(Hz)

21.74Hz

峰峰值Vp-p(V)

512.0mV

三)、A/D转换结果控制D/A输出信号频率实验

内容及要求:

1)利用实验台上的ADC0809做A/D转换器,实验箱上的电位器提供模拟电压信号输入,编制程序,将模拟量转换成数字量,用数码管显示模拟量转换的结果(十进制)。

2)利用DAC0832,编制程序产生频率受A/D转换结果控制的波形。波形为由锯齿波、三角波各20个周期构成的循环波形。

3)当调节实验箱上的电位器,A/D显示的结果相应发生变化,D/A产生的锯齿波和三角波频率也随之改变。

4)要求单片机判断处理AD转换结束信号采用查询方式。DAC0832工作方式为双缓冲方式。

1、实验电路:如图1及图2

2、实验接线

1)0809的片选信号CS0809接CS0。

  1. 电位器的输出信号AN0接0809的ADIN0。

3)EOC接P3.2/INT0。

4)DAC0832的片选CS0832接CS1,输出端DAOUT接示波器探头信号表笔,接地端GND接示波器地线夹子。双缓冲工作方式(DS1.2脚用跳线冒短接)

(为保证在显示A/D转换结果时D/A输出波形不变,DAC0832要处于双缓冲工作方式,以保证在写数据到8279的寄存器时,DAC0832数据锁存,不受数据总线上数据的变化而发生变化。)

3、实验程序

1)频率受控锯齿波程序:

#include <reg51.h>

#include <absacc.h>

#define INT8U unsigned char

#define INT16U unsigned int

#define Val DBYTE[0x35]

#define RAM8279  XBYTE[0X0CFE9]

#define DATA8279 XBYTE[0X0CFE8]

#define ADC0809  XBYTE[0X0CFA0]

#define DAC08321  XBYTE[0X0CFA8]

#define DAC08322  XBYTE[0X0CFA9]

INT8U SEG_CODE[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

sbit EOC=P3^2;

 void delay_ms(INT8U x)

  {INT8U t;

   while(x--)

       for(t=0;t<1;t++);

     }

     

INT8U ADvalue=0,AD1=0,AD2=0,AD3=0,i;  

 main()

{

RAM8279=0x90;

DATA8279=SEG_CODE[AD1];

delay_ms(1);

DATA8279=SEG_CODE[AD2];

delay_ms(1);

DATA8279=SEG_CODE[AD3];

delay_ms(1);

while(1)

   {

ADC0809=1;  //start AD

while(!EOC);  //wait ADC finish

Val=ADC0809;  //read AD result

   AD1=Val/100;   //high

   AD2=Val%100/10; //middle

   AD3=Val%10;      //low

    DAC08321=Val;    //D/A start

    DAC08322=Val;    //D/A start

    RAM8279=0x90;   //display

    DATA8279=SEG_CODE[AD1];

    delay_ms(1);

    DATA8279=SEG_CODE[AD2];

    delay_ms(1);

    DATA8279=SEG_CODE[AD3];

    delay_ms(1);

    for(i=Val;i<255;i++)   //generate wave

{

DAC08321=i;

DAC08322=i;

delay_ms(1);

}

}

}

2)频率受控三角波程序:

#include <reg51.h>

#include <absacc.h>

#define INT8U unsigned char

#define INT16U unsigned int

#define Val DBYTE[0x35]

#define RAM8279  XBYTE[0X0CFE9]  //control register

#define DATA8279 XBYTE[0X0CFE8]  //data register

#define ADC0809  XBYTE[0X0CFA0]  //ADC address

#define DAC08321  XBYTE[0X0CFA8]  //first register address

#define DAC08322  XBYTE[0X0CFA9]  //second register address

INT8U SEG_CODE[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //common cathode

sbit EOC=P3^2;

 void delay_ms(INT8U x)

  {   INT8U t;while(x--) for(t=0;t<1;t++);  }

INT8U ADvalue=0,AD1=0,AD2=0,AD3=0,i;  

 main()

{

RAM8279=0x90;

DATA8279=SEG_CODE[AD1];

delay_ms(1);

DATA8279=SEG_CODE[AD2];

delay_ms(1);

DATA8279=SEG_CODE[AD3];

delay_ms(1);

while(1)

   {

ADC0809=1;  //start AD

while(!EOC);  //wait ADC finish

Val=ADC0809;  //read AD result

   AD1=Val/100;   //high

   AD2=Val%100/10; //middle

   AD3=Val%10;      //low

    DAC08321=Val;    //D/A start

    DAC08322=Val;    //D/A start

    RAM8279=0x90;   //display

    DATA8279=SEG_CODE[AD1];

    delay_ms(1);

    DATA8279=SEG_CODE[AD2];

    delay_ms(1);

    DATA8279=SEG_CODE[AD3];

    delay_ms(1);

    for(i=Val;i<255;i++)   //generate wave

{

DAC08321=i;

DAC08322=i;

delay_ms(10);

}

for(i=255;i>Val;i--)

{

DAC08321=i;

DAC08322=i;

delay_ms(1);

}

}

}

4、实验步骤

1)从系统“开始”菜单进入“所有程序”,在“所有程序”中选择“Windows Virtual PC”,点击“Windows XP Mode”进入虚拟机系统。

2)根据接线图接线,并运行EL型(8051)教学实验环境,建立上位计算机与缔造者系统的通信连接。(串口选择COM2;波特率选择9600;点击屏幕中对话框确定后立刻按下设备上的复位键RST,若设备上的数码管显示C则表示通信成功。)3)输入频率受控波形生成的C51源程序,编译连接成功后运行。

4)依次调节电位器旋钮,并使数码管显示为一个较小的值开始。记录数码管显示值,及相应示波器显示的波形曲线,计算锯齿波和三角波曲线的Vp-p电压及显示波形的周期和频率并填入表3。

表3 频率受控波形实验数据表

序号

数码管显示值

锯齿波的Vp-p(V)

锯齿波频率值(Hz)

三角波的Vp-p(V)

三角波频率值(Hz)

1

0

4.96

39.97

5.04

19.34

2

50

4.00

49.75

4.08

24.13

3

100

3.04

65.79

3.12

31.87

4

150

2.24

86.84

2.08

47.01

5

200

1.28

105.34

1.12

58.60

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/238245.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;NEOAPI SDK联合OpenCV进行图…

Mysql-redoLog

Redo Log redo log进行刷盘的效率要远高于数据页刷盘,具体表现如下 redo log体积小,只记录了哪一页修改的内容,因此体积小,刷盘快 redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快Redo log 格式 在MySQL的InnoDB存储引擎中,redo log(重做日志)被用…

Python字符串

目录 Python字符串字符串字面量用字符串向变量赋值多行字符串字符串是数组字符串负的索引字符串长度 字符串方法strip()lower()upper()replace()split() 检查字符串字符串级联&#xff08;串联&#xff09;字符串格式字符串方法 Python字符串 Python的字符串是字符的序列&#…

【Spring 篇】深入解析SpringMVC的组件魅力

SpringMVC&#xff0c;这个名字在Java Web开发者的耳边仿佛是一首动听的旋律&#xff0c;携着轻盈的氛围&#xff0c;带给我们一种愉悦的编程体验。但是&#xff0c;当我们深入探寻这个框架时&#xff0c;它的魅力远不止表面的简单&#xff0c;它由许多组件构成&#xff0c;每个…

解决方案类常用网址

1.操作系统类&#xff08;原版操作系统下载网址&#xff09; https://next.itellyou.cn/ 之前的版本 https://msdn.itellyou.cn/ 2.ppt免费网站&#xff08;不用注册&#xff09; https://www.1ppt.com/

pandas查看数据常用方法(以excel为例)

目录 1.查看指定行数的数据head() 2. 查看数据表头columns 3.查看索引index 4.指定索引列index_col 5.按照索引排序 6.按照数据列排序sort_values() 7.查看每列数据类型dtypes 8.查看指定行列数据loc 9.查看数据是否为空isnull() 1.查看指定行数的数据head() &#xff…

CAN总线记录仪在车企服务站的应用

CAN总线记录仪在车企服务站的应用 CAN总线记录仪在车企服务站中有着广泛的应用。这种设备可以记录车上的CAN总线数据&#xff0c;方便工程师进行分析&#xff0c;以找出可能存在的问题。CAN记录仪一般采用TF卡来存储数据&#xff0c;实现离线脱机实时存储。数据存储完毕后&…

api密钥管理系统有哪些功能

API密钥管理在当今的软件开发和运营中扮演着至关重要的角色。随着微服务和云计算的普及&#xff0c;越来越多的应用程序依赖于外部API来提供核心功能。与此同时&#xff0c;这些API通常需要某种形式的身份验证&#xff0c;以确保请求来自合法和受信任的来源。API密钥管理正是为…

RMI简介

RMI 介绍 RMI (Remote Method Invocation) 模型是一种分布式对象应用&#xff0c;使用 RMI 技术可以使一个 JVM 中的对象&#xff0c;调用另一个 JVM 中的对象方法并获取调用结果。这里的另一个 JVM 可以在同一台计算机也可以是远程计算机。因此&#xff0c;RMI 意味着需要一个…

我为什么要写RocketMQ消息中间件实战派上下册这本书?

我与RocketMQ结识于2018年&#xff0c;那个时候RocketMQ还不是Apache的顶级项目&#xff0c;并且我还在自己的公司做过RocketMQ的技术分享&#xff0c;并且它的布道和推广&#xff0c;还是在之前的首席架构师的带领下去做的&#xff0c;并且之前有一个技术神经质的人&#xff0…

13 | 使用代理ip爬取安居客房源信息

这是一个简单的Python爬虫代码,用于从安居客网站爬取房地产信息。该爬虫使用了代理IP来绕过可能的封禁,并提供了一些基本的信息抽取功能。 如果访问过多,那么可能出现了验证码 对此,最好的方法就是换ip。 使用代理IP的主要目的是保护爬虫的稳定性和隐私。以下是一些常见的原…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下,打开音乐播放器,然后打开一个.mp3文件,就可以实现播放了,那么在Qt/QML中如何实现呢?首先所有的设计都是基于音乐播放器的,嵌入式linux下同样也有音乐播放器,比如mplayer。其调用方法如下,可以启动一个从头开始播放音频的mplayer进程。 那么音频播放器就是给…

【WPF.NET开发】WPF中的版式

本文内容 改进的文本质量和性能丰富的版式增强的国际文本支持增强的字体支持新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。…

Material Design 进阶(十一)——Chip,ChipGroup,ChipDrawable使用

流式布局标签发展历程 第一阶段&#xff1a;实现这种界面的时候&#xff0c;基本都是自定义一个控件&#xff0c;然后在Java代码中动态的 添加一个个的TextView&#xff0c;还需要计算布局宽度/高度&#xff0c;进行换行等等处理&#xff0c;比较复杂;第二阶段&#xff1a;使用…

tailwindcss真的好用吗?

写在前面 今天写一篇关于tailwindcss 的文章&#xff0c;其实这个css技术已经出现很久了&#xff0c;在一些大型项目很多人也已经在用了&#xff0c;虽然不是说必须要会吧&#xff0c;但是没听说过肯定是不行的&#xff0c;他的操作逻辑应该是和unocss差不多&#xff0c;但是今…

1 快速前端开发

前端开发 1 前端开发1.快速开发网站2.浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title&#xff08;head&#xff09;2.3 标题2.4 div和span2.4.5 超链接2.4.6 图片小结2.4.7 列表2.4.8 表格2.4.9 input系列&#xff08;7个&#xff09;2.4.10 下拉框2.4.11 多…

01 SpringMVC的快速理解

1.1 如图所示&#xff0c;SpringMVC负责表述层&#xff08;控制层Controller&#xff09;实现简化&#xff01; SpringMVC的作用主要覆盖的是表述层&#xff0c;例如&#xff1a; 请求映射、数据输入、视图界面、请求分发、表单回显、会话控制、过滤拦截、异步交互、文件上传…

python 列表的高级应用

当前版本&#xff1a; Python 3.8.4 简介 列表&#xff08;list&#xff09;是Python编程语言中的基本数据类型之一&#xff0c;也是一个非常重要的通用序列。在其它编程语言中&#xff0c;它们通常被称为“数组”。可以存储多个元素&#xff0c;包括数字、字符串、甚至其他列…

机器学习 | 无监督聚类K-means和混合高斯模型

机器学习 | 无监督聚类K-means和混合高斯模型 1. 实验目的 实现一个K-means算法和混合高斯模型&#xff0c;并用EM算法估计模型中的参数。 2. 实验内容 用高斯分布产生 k k k个高斯分布的数据&#xff08;不同均值和方差&#xff09;&#xff08;其中参数自己设定&#xff…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑩

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应处理&#xff0c;程序根据两个输入参数iRecordNum和IType计算x的值并返回。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试&#xff0c;测试类中设计最少的测试数据满足基路…