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

2024-01-15 09:36

本文主要是介绍基于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

这篇关于基于51单片机的模拟量输入输出通道实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/608444

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信