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

news2024/10/7 16:25:15

实验一 模拟量输入输出通道实验(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.coloradmin.cn/o/1385224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二证券:利空因素影响成本端 豆粕期现价偏弱运行

上个买卖周&#xff0c;受利空要素影响&#xff0c;内盘豆粕期价刷新2021年12月14日以来收盘价新低。到上周五收盘&#xff0c;豆粕主力合约MO2405最低下探至3075元/吨&#xff0c;收报3078元/吨&#xff0c;周内累计跌幅近4%。业内人士以为&#xff0c;美国农业部超预期调高20…

pinyin-pro库使用方式

pinyin-pro 是一个专业的 JavaScript 中文转拼音的库&#xff0c;具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 pinyin-pro官网链接&#xff1a;介绍 | pinyin-pro 运行展示 pinyin-pro安装命令&#xff1a; # 选择一个你使用的包管理器进行安装即可# NPM $ n…

学网络必懂的华为CSS堆叠技术

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…

2024多系统萎缩最新全球特效药治疗进展

多系统萎缩是一种罕见的神经退行性疾病&#xff0c;由于缺乏有效的治疗方法&#xff0c;患者经常面临症状无法缓解和生活品质下降的困扰。然而&#xff0c;近期刘家峰大夫基于中医理论研究和临床实践&#xff0c;采用中药治疗多系统萎缩取得了显著疗效&#xff0c;给患者带来了…

mysql原理--undo日志2

1.概述 上一章我们主要唠叨了为什么需要 undo日志 &#xff0c;以及 INSERT 、 DELETE 、 UPDATE 这些会对数据做改动的语句都会产生什么类型的 undo日志 &#xff0c;还有不同类型的 undo日志 的具体格式是什么。本章会继续唠叨这些 undo日志 会被具体写到什么地方&#xff0c…

RMI简介

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

Spring MVC中的一些常用注解

目录 RequestMapping 实现路由映射 限制请求方式 PathVariable 从url中获取变量的值 更改绑定参数的名字 RequestParam 可以传递集合 更改绑定参数的名字 可修改是否为必传参数 RequestBody 获取请求正文的内容 可修改是否为必传参数 RequestPart 可以支持上传…

Android中的SPI实现

Android中的SPI实现 SPI是JVM世界中的标准API&#xff0c;但在Android应用程序中并不常用。然而&#xff0c;它可以非常有用地实现插件架构。让我们探讨一下如何在Android中利用SPI。 问题 在Android中&#xff0c;不同的提供者为推送功能提供服务&#xff0c;而在大型项目中…

python入门,数据容器:字典dict

字典作用就和它的名字一样&#xff0c;我们可以通过某个关键字找到它对应的信息&#xff0c;或者讲的高级一点&#xff0c;就是key与value的对应关系 举例&#xff1a; 一场考试小明考了80分&#xff0c;小红考了90分&#xff0c;小东考了95分&#xff0c;在字典里&#xff0…

使用JDK自带的jvisualvm工具查看堆dump文件【回顾】

JDK自带的jvisualvm的使用 打开方式&#xff1a; 直接命令行输入&#xff1a;jvisualvm ,然后回车​​​​​​​ ​​ 或者去jdk的bin目录下找到打开 安装visual GC插件 检测死锁 再点击“死锁 dump”就可以看到死锁的线程信息了&#xff1b;

C++每日一练(16):数组逆序

题目描述 给你m个整数&#xff0c;将其逆序输出 输入 第一行一个整数m&#xff08;3 < m < 100 )&#xff1a;数的个数 第二行m个整数&#xff08;空格隔开&#xff09;&#xff08;这些数在0-9999999之间) 输出 m个整数&#xff08;空格隔开&#xff09; 输入样例 3 1 7…

SV-7041T 30W网络有源音箱校园教室广播音箱,商场广播音箱,会议广播音箱,酒店广播音箱,工厂办公室广播音箱

SV-7041T 30W网络有源音箱 校园教室广播音箱&#xff0c;商场广播音箱&#xff0c;会议广播音箱&#xff0c;酒店广播音箱&#xff0c;工厂办公室广播音箱 SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将…

GZ075 云计算应用赛题第9套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

【已解决】fatal: Authentication failed for ‘https://github.com/.../‘

文章目录 异常原因解决方法 异常原因 在 Linux 服务器上使用git push命令&#xff0c;输入用户名和密码之后&#xff0c;总会显示一个报错&#xff1a; fatal: Authentication failed for https://github.com/TianJiaQi-Code/Linux.git/ # 致命&#xff1a;无法通过验证访问起…

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

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

Shiro框架:Shiro登录认证流程源码解析

目录 1.用户登录认证流程 1.1 生成认证Token 1.2 用户登录认证 1.2.1 SecurityManager login流程解析 1.2.1.1 authenticate方法进行登录认证 1.2.1.1.1 单Realm认证 1.2.1.2 认证通过后创建登录用户对象 1.2.1.2.1 复制SubjectContext 1.2.1.2.2 对subjectContext设…

《向量数据库指南》RAG 应用中的指代消解——解决方案初探

随着 ChatGPT 等大语言模型(LLM)的不断发展&#xff0c;越来越多的研究人员开始关注语言模型的应用。 其中&#xff0c;检索增强生成&#xff08;Retrieval-augmented generation&#xff0c;RAG&#xff09;是一种针对知识密集型 NLP 任务的生成方法&#xff0c;它通过在生成过…

嵌入式学习-网络编程-Day1

Day1 思维导图 作业 实现一下套接字通信 代码 #include<myhead.h>int main(int argc, const char *argv[]) {//1、创建套接字int sfd socket(AF_INET, SOCK_STREAM, 0);//参数1&#xff1a;通信域&#xff1a;使用的是ipv4通信//参数2&#xff1a;表示使用tcp通信//参…

Python轴承故障诊断 (11)基于VMD+CNN-BiGRU-Attenion的故障分类

目录 往期精彩内容&#xff1a; 前言 模型整体结构 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 2.3 故障数据的VMD分解预处理 3 基于VMD-CNN-BiGRU-Attenion的轴承故障诊断分类 3.1 定义VMD-CNN-BiGRU-Attenion分类网…

批评与自我批评组织生活会发言材料2024年六个方面

生活就像一场马拉松&#xff0c;成功需要坚持不懈的奔跑。每一步都可能会遇到挫折和困难&#xff0c;但只要你努力向前&#xff0c;坚持不放弃&#xff0c;你就一定能够迎接胜利的喜悦。不要害怕失败&#xff0c;因为失败是成功的垫脚石。相信自己的能力&#xff0c;追求自己的…