基于AD转换模块的单片机仿真和C语言开发

合集下载

51单片机AD转换代码及仿真的新标题

51单片机AD转换代码及仿真的新标题

51单片机AD转换代码及仿真的新标题新标题:深入解析51单片机的AD转换代码及仿真观点和理解:51单片机是一种应用广泛的嵌入式微控制器,具有强大的功能和灵活性。

其中,AD转换是其重要的功能之一,被广泛应用于模拟信号的数字化处理。

本文将深入探讨51单片机的AD转换代码及仿真,从简单到复杂、由浅入深地介绍相关的概念、原理和编程代码,旨在帮助读者更全面、深入地理解这一重要的主题。

文章结构:I. 引言A. 介绍51单片机的AD转换功能的重要性B. 概述本文的结构和目标II. 51单片机的AD转换基础A. 什么是模拟信号和数字信号?B. AD转换器的基本原理和功能C. 51单片机中常用的AD转换器类型和特点III. 了解AD转换的代码实现A. AD转换的基本操作步骤B. 通过中断实现AD转换C. 通过轮询实现AD转换D. 不同方式的AD转换代码的优劣比较IV. AD转换的常用功能扩展A. 多通道的AD转换B. 不同精度的AD转换C. 参考电压的选择和设置D. AD转换相关的溢出处理和校准V. 51单片机AD转换的仿真与调试A. 常见的仿真工具和方法介绍B. 使用仿真工具进行AD转换代码的调试C. 常见问题的排查和解决方法VI. 总结与展望A. 回顾本文所涵盖的内容和观点B. 对51单片机AD转换的未来发展进行展望在本文中,我们将从理论到实践,从基础到进阶,系统地介绍51单片机的AD转换功能。

通过深入理解其原理、学习相关的编程代码,并通过仿真工具进行实际调试,读者将能够掌握51单片机AD转换的各个方面。

这将使读者能够更好地应用这一功能来解决实际问题,并为将来的项目开发打下坚实的基础。

字数:3096字。

单片机ad程序【经典C语言】

单片机ad程序【经典C语言】
特别说明:如果不进行32次平均,我们会看到最低位不停的跳变。
--------------------------------------------------------------
测试说明:调节电位器R7的调整旋钮,观察显示数字的变化
*************************************************************/
AD采样转换程序
/*************************************************************
程序功能:对0对应的模拟通道进行多次转换后,将32次平均值
在数码管上显示(数码管显示的只是ADC的转换结果而不
是真实的模拟电压)
--------------------------------------------------------------
ADC12IE = BIT1; // Enable ADC12IFG.0
ADC12CTL0 |= ENC; // Enable conversions,ENC转换允许位
ADC12CTL0 |= ADC12SC; // Start conversion,ADC12SC转换开始位
P4DIR = 0xff;
Results[index++] = ADC12MEM1; // Move results, IFG is cleared
if(index == 31)
{
uchar i;
Average = 0;
for(i = 0; i < 32; i++)
Average += Results[i];
Average >>= 5; //除以32求平均值

基于AD转换模块的单片机仿真和C语言开发.

基于AD转换模块的单片机仿真和C语言开发.

目录摘要 01 软件介绍 (1)1.1 protues仿真软件 (1)1.2 C编译器Keil介绍 (1)1。

3 51单片机介绍 (2)2 整体设计分析 (2)3 硬件模块设计 (3)3.1 控制系统模块 (3)3。

3 数码管显示模块 (5)3。

4 总原理图 (6)4 仿真流程 (6)4.1 C语言编译 (6)4。

2 添加文件 (7)5 个人心得 (9)6 参考文献 (10)附录一 C语言程序代码 (11)本科生能力拓展训练成绩评定表 (14)摘要本设计要求作出一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。

完成此功能采用AT89C51型单片机作为控制系统,用C语言进行编程,根据实时按键的扫描情况更新采集的数据,并且在数码管上显示出来。

完成AD转换功能的核心器件是ADC0808芯片,多通路的输入用开关来进行控制。

关键词:AD转换 ADC0808 AT89C511 软件介绍1.1 protues仿真软件Protues 软件是来自英国Labcenter electronics 公司的EDA 工具软件,Protues 软件有20年的历史,在全球广泛使用。

它除了具有和其它EDA 工具一样的原理布图、PCB 自动或人工布线及电路仿真的功能外,其革命性的功能是,它的电路仿真是交互的,可视化的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,可以测量仿真的波形及记录仿真数据.其功能模块:—个易用而又功能强大的ISIS 原理布图工具;PROSPICE 混合模型SPICE 仿真; ARESPCB 设计.PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真.此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LED 甚至LCD 显示CPU 模型。

51单片机ad转换代码及仿真

51单片机ad转换代码及仿真

51单片机ad转换代码及仿真一、前言51单片机是一种广泛应用于嵌入式系统领域的微控制器,其具有低功耗、高性能、易学易用等特点。

其中,AD转换模块是其重要的功能之一,可以实现模拟信号到数字信号的转换。

本文将介绍51单片机AD 转换的相关知识和代码实现,并通过仿真验证其正确性。

二、51单片机AD转换原理1. AD转换概述AD转换(Analog-to-Digital Conversion)是指将模拟信号(如声音、图像等)转化为数字信号的过程。

在嵌入式系统中,AD转换通常用于采集外部传感器等模拟量信号,并将其转化为数字量进行处理。

2. 51单片机AD转换模块51单片机内置了一个8位AD转换模块,可以对0~5V范围内的模拟信号进行采样和转换。

该模块包含以下主要部分:(1)输入端:可接受外部0~5V范围内的模拟信号。

(2)采样保持电路:在采样期间对输入信号进行保持,以避免采样过程中信号波动。

(3)比较器:将输入信号与参考电压进行比较,并输出比较结果。

(4)计数器:对比较结果进行计数,得到AD转换的结果。

(5)控制逻辑:控制采样、保持、比较和计数等过程。

3. AD转换精度AD转换精度是指数字信号与模拟信号之间的误差,通常用位数来表示。

例如,8位AD转换器可以将模拟信号分成256个等级,即精度为1/256。

因此,AD转换精度越高,数字信号与模拟信号之间的误差越小。

4. AD转换速率AD转换速率是指单位时间内进行的AD转换次数。

在51单片机中,AD转换速率受到时钟频率和采样时间的限制。

因此,在实际应用中需要根据具体情况选择合适的时钟频率和采样时间以满足要求的转换速率。

三、51单片机AD转换代码实现以下为51单片机AD转换代码实现:```#include <reg52.h>sbit IN = P1^0; // 定义输入端口sbit OUT = P2^0; // 定义输出端口void main(){unsigned char result;while (1){ADC_CONTR = 0x90; // 打开ADCADC_CONTR |= 0x08; // 开始采样while (!(ADC_CONTR & 0x10)); // 等待采样完成result = ADC_RES; // 读取结果OUT = result; // 输出结果}}```代码解释:(1)定义输入输出端口:使用sbit关键字定义输入端口和输出端口。

AD转换C语言

AD转换C语言

AD转换程序[C语言]2007年10月12日星期五 13:45//实验目的:熟悉A/D转换//软件思路:选择RAO做为模拟输入通道;// 连续转换4次再求平均值做为转换结果// 最后结构只取低8位// 结果送数码管的低3位显示//硬件要求:拨码开关S14第2位置ON,第1位置OFF// 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF // 为不影响结果,其他拨码开关置OFF。

#include<pic.h> //包含单片机内部资源预定义__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M 晶体HS振荡const charTABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90};//定义常数0-9的数据表格void DELAY(); //delay函数申明void init(); //I/O口初始化函数申明void display(int x); //显示函数申明//------------------------------------------------//主程序开始void main(){int result=0x00; //定义转换结果寄存器while(1) //死循环{int i; //定义循环次数控制寄存器result=0x00; //转换结果清0for(i=5;i>0;i--) //求5次转换结果的平均值{init(); //调用初始化函数ADGO=0X1; //开启转换过程while(ADGO); //等待转换完成result=result+ADRESL; //累计转换结果}result=result/5; //求5次结果的平均值display(result); //调用显示函数}}//-----------------------------------------------//初始化函数void init(){PORTA=0XFF;PORTD=0XFF; //熄灭所有显示TRISA=0X1; //设置RA0为输入,其他为输出TRISD=0X00; //设置D口全为输出ADCON1=0X8E; //转换结果左对齐,RA0做模拟输入口,其它做普通I/OADCON0=0X41; //系统时钟Fosc/8,选择RA0通道,允许ADC 工作DELAY(); //保证采样延时}//-----------------------------------------------//显示函数void display(int x){int bai,shi,ge,temp; //定义4个临时变量temp=x; //暂存AD转换的结果bai=temp/0x64; //求显示的百位shi=(temp%0x64)/0xa; //求显示的十位ge=(temp%0x64)%0xa; //求显示的个位PORTD=TABLE[bai]; //查表得百位显示的代码PORTA=0x37; //RA3输出低电平,点亮百位显示DELAY(); //延时一定时间,保证显示亮度PORTD=TABLE[shi]; //查表得十位显示的代码PORTA=0x2F; //RA4输出低电平,点亮十位显示DELAY(); //延时一定时间,保证亮度PORTD=TABLE[ge]; //求个位显示的代码PORTA=0x1F; //RA5输出低电平,点亮个位显示DELAY(); //延时一定时间,保证亮度}//----------------------------------------------//延时程序void DELAY() //延时程序{int i; //定义整形变量for(i=0x100;i--;); //延时}。

基于单片机的AD转换电路与程序设计

基于单片机的AD转换电路与程序设计

基于单片机的AD转换电路与程序设计单片机(MCU)是一种集成了处理器核心、内存、输入输出接口和各种外围设备控制器等功能的集成电路。

MCU通常用于嵌入式系统,广泛应用于各个领域,例如家电、工业控制、汽车电子等。

其中,AD转换是MCU中的一个重要模块,用于将模拟信号转换成数字信号。

在应用中,常常需要将外部的温度、湿度、压力或光照等模拟信号进行转换和处理。

AD转换电路一般由模拟输入端、引脚连接、采样保持电路、比较器、取样调节电路、数字输出端等部分组成。

模拟输入端负责接收外部的模拟量信号;引脚连接将模拟输入信号引到芯片的模拟输入端;采样保持电路负责将引脚输入的模拟信号进行采样和保持,保证AD转换的准确性;比较器用于将模拟信号与参考电压进行比较,判断信号的大小;取样调节电路用于调整模拟信号的边界;数字输出端将模拟信号转换成数字信号输出给MCU。

在程序设计方面,MCU通常使用C语言进行编程。

程序设计分为初始化和数据处理两个步骤。

初始化阶段主要包括设置IO口、初始化外设、设置模拟输入通道等工作。

数据处理阶段主要包括数据采样、数值转换、数据处理和输出等工作。

下面以一个简单的温度采集系统为例进行说明。

首先,在初始化阶段,需要设置IO口和外设,以及设置模拟输入通道。

具体步骤如下:1.设置IO口:根据具体需要配置MCU的引脚功能和工作模式。

2.初始化外设:根据需要初始化ADC模块,包括设置采样频率、参考电压等参数。

3.设置模拟输入通道:选择需要转换的模拟输入通道。

接下来,在数据处理阶段,需要进行数据采样、数值转换和数据处理。

具体步骤如下:1.数据采样:使用ADC模块进行模拟信号的采样,将采样结果保存到寄存器中。

2.数值转换:将采样结果转换成数字信号,可以使用如下公式进行转换:数字信号=(ADC采样结果/采样最大值)*参考电压3.数据处理:根据具体需求进行数据处理,例如计算平均值、最大值或最小值,也可以进行滤波或校正。

我的51单片机之模数转换ADC0804的C语言和汇编编程

我的51单片机之模数转换ADC0804的C语言和汇编编程
//返回数据处理,LED 显示,Frequency 为转换频率 unsigned int DoWitchData(unsigned int Frequency) {
unsigned char AD[2];//存高低字节 unsigned int InputV;//最后处理结果 unsigned char i; InputV=ReadAD(); AD[1]=InputV&0xF0; AD[1]=AD[1]>>4; AD[0]=InputV&0x0F; InputV=ADH[AD[1]]+ADL[AD[0]]; for(i=0;i<Frequency;i++) {
//延时 void delay(unsigned char n) {
unsigned char i; for(i=0;i<n;i++) {
; } }
//AD 转换,P 口取数 unsigned char ReadAD() {
unsigned char ADData; RDA=1; WRA=1; InputPort=0xFF; WRA=0; _nop_(); WRA=1; delay(100); RDA=0; _nop_();_nop_();_nop_();_nop_();_nop_(); ADData=InputPort; _nop_();_nop_();_nop_();_nop_();_nop_(); RDA=1; _nop_(); return (ADData); }
//
{ 0 , 1, 2 , 3 , 4 , 5, 6, 7, 8,
//
9, A , b , C , d, e, f, 点, 息灯, }
sbit RDA=P3^7; sbit WRA=P3^6; sbit INTR=P3^3;

基于AD转换的单片机实验和C语言开发 胡青

基于AD转换的单片机实验和C语言开发 胡青

课程设计任务书学生姓名:胡青专业班级:电信1206 指导教师:孟哲工作单位:信息工程学院题目:基于A/D转换模块的单片机实验和C语言开发初始条件:具备单片机和ADC芯片的理论知识;具备C语言编程能力;具备对Protues和Keil软件的操作能力;提供编程所需要的计算机一台要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、独立编写程序实现基于D转换模块的单片机实验和C语言开发2、用软件对电路进行仿真,并分析实现原理3、完成符合学校要求的设计说明书时间安排:一周,其中3天程序设计,2天程序调试指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (1)Abstract (2)1 软件介绍 (3)1.1 Keil使用 (3)1.2 Proteus软件使用 (4)2 设计原理 (5)2.1单片机简介 (5)2.4 ADC0809简介 (5)2.4.1 ADC0809内部结构 (5)2.3.2 ADC0809的工作过程 (6)3 多路模拟信号采集模块设计 (8)3.1 功能简介 (8)3.2 总原理图 (8)3.2.1 单片机电路 (8)3.2.2 ADC采样电路 (9)3.2.3显示模块 (10)3.3 系统流程图 (11)4 程序代码 (12)5 仿真结果与分析 (16)6 调试 (17)7 心得体会 (19)参考文献 (20)摘要本次课程设计的要求是:基于A/D转换模块的单片机实验和C语言开发,设计一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。

A\D转换器是一种用来将连续的模拟信号转换成二进制的器件。

一个完整的AD 转换器通常包括这样一些信号:模拟输入信号,参考电压,数字输出信号,启动转换信号,单片机介绍信号,数据输出允许信号等。

使用ADC0808型号的A/D转换器对多路模拟信号进行数据采集,同时与单片机进行通信,将测量的模拟信号量传递给89C51单片机,由单片机进行运算,输出对应的数字量,然后在数码管上显示出来。

基于单片机的AD转换电路及程序设计

基于单片机的AD转换电路及程序设计

目录摘要1ABSTRACT20文献综述31引言31.1任务分析与方案确定41.2单片机的系统分析41.3A/D转换器的选取71.4传感器的数据采集81.5显示与键盘分析102 系统硬件设计132.1A/D转换的一般步骤132.2ADC0809内部功能与引脚介绍132.3ADC0809与MCS-51系列单片机的接口方法16 2.4控制器、振荡源和复位电路182.5键盘与显示电路193软件设计213.1A/D转换213.2标度变换243.3数制转换263.4键盘程序27 3.5LED显示程序28 4结论30参考文献31致谢32基于单片机的A/D转换电路与程序设计XXX西南大学工程技术学院,400716摘要:A/D转换是指将模拟信号转换为数字信号,这在信号处理、信号传输等领域具有重要的意义。

常用的A/D转换电路有专用A/D集成电路、单片机ADC模块,前者精度高、电路复杂,后者成本低、设计简单。

基于单片机的A/D转换电路在实际电路中获得了广泛的应用,论文对这一电路结构进行了详细的研究。

关键词:单片机;AD转换器;电路Based on SCM A/D Circuit and Program DesignTANG XiaolingCollege of Engineering and Technology, Southwest University, Chongqing 400716, ChinaAbstract:A/D conversion refers to analog signals into digital signals, which in signal processing, signal transmission fields has the vital significance. monly used A/D circuit has dedicated A/D IC chip, high precision, the former ADC module circuit, the plex, low cost, simple design. Based on SCM A/D circuit in practical circuit has been widely used in the circuit, this paper makes A detailed study of the structure.0文献综述数据采集系统 用于将模拟信号转换为计算机可以识别的数字信号。

AT89C51单片机AD转换器接口实验

AT89C51单片机AD转换器接口实验

班级电科 081 班姓名龚浪学号 ************ 实验名称电脑时钟程序实验指导教师马光喜理学院时间:2011年月日实验十一 A/D转换器接口实验一.实验目的⑴熟悉单片机与A/D转换芯片的接口方法。

⑵了解A/D转换芯片的转换性能及编程方法。

⑶通过实验了解单片机如何进行数据采集。

二.实验内容利用电位器提供模拟量输入,输入到0809的IN3输入端,编制程序,将模拟量转换成数字量,并在数码管显示出来。

三.实验步骤1.在Proteus中画出实验电路ADC0808转换原理电路3.进入Keil C51组合软件的操作环境,编辑源程序并进行编译;4.设置Proteus 与Keil C51之间的连接;5.程序设计(1)进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P1端口读入,经过数据处理之后经P0口从数码管上显示。

(2)进行A/D转换之前,要启动转换的方法:CBA=011选择第三通道Start的正脉冲(start从0→1→0)起动AD转换,本程序中用P2^0控制。

(3)本程序用C语言编写,代码如下://EXP11#include <reg51.h>sbit start=P2^0;//控制起动转换信号sbit finish=P2^1;//转换结束标志sbit ale=P2^2; //地址锁存信号#define address P3 //地址口#define date P1 //数据口#define disp P0 //显示口void transform(); //AD转换函数void main(){start=0;while(1)transform();//循环调用AD转换函数}//**********************//AD转换函数//**********************void transform (){start=1; //正脉冲起动AD转换start=0;address=0x3f;//送地址给AD转换ale=1; //锁存地址while(1)//等待转换结束{if(finish==1)//转换完成{disp=date;// 取走数据ale=0; //撤消地址锁存信号break;//跳出循环进行下一次AD转换}}}6.运行、调试程序和结果检查⑴采用单步,设置断点等方法,态观察程序走向是否正确。

AD转换c 语言程序

AD转换c 语言程序

AD转换c 语言程序#include "c8051f020.h"#include<absacc.h>#include<intrins.h>#define ad0809 XBYTE[0x2f80] //A/D地址/********函数声明********/void Send7279Byte(unsigned char ch); //发送一个命令字void Delay1us(unsigned char us) ; //延时1μvoid Delay1ms(unsigned char T) ; //延时1msvoid delay10ms(unsigned char time);void SYSCLK_Init (void);//**** 变量及I/O口定义*********unsigned char adx1,adx10,adx100,m,n;unsigned char n31=4,n01,sure,k,mm;unsigned int set,tmr, he;sbit CLK = P1^6; // HD7279sbit DAT = P1^7; // HD7279#define NOSELECT7279 P5 |= 0x80 //SPICS4(P57)=1 #define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0//***********延时N * 1μ*****************************//void Delay1us(unsigned char us) //延时1μ{while (us){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();--us;}}//*********发送一个命令字****************//void Send7279Byte(unsigned char ch) //发送一个命令字{char i;SELECT7279; //置CS低电平Delay1us(100); //延时50μfor (i=0;i<0x8;i++){if (ch&0x80) //输出7位到HD7279A的DATA端{DAT=1;}else{DAT=0;}CLK=1; //置CLK高电平ch=ch<<1; //待发数据左移Delay1us(20); //延时8μCLK=0; //置CLK低电平Delay1us(20); //延时50μ}DAT=0; //发送完毕,DATA端置低,返回}/************* 显示时钟************/void displaytime() //显示时钟{Send7279Byte(0xcd) ;Send7279Byte(0xa) ; ////显示“A”Send7279Byte(0xcc) ;Send7279Byte(0xd) ; // //显示“D”Send7279Byte(0x83) ;Send7279Byte(0xa) ; // //显示“-”Send7279Byte(0x82) ;Send7279Byte( adx100) ; //显示百位Send7279Byte(0x81) ;Send7279Byte( adx10); //显示十位Send7279Byte(0x80);Send7279Byte(adx1); //显示个位}//*********单片机时钟初始化***********//void SYSCLK_Init (void){int i; // delay counterOSCXCN = 0x65; // start external oscillator with// 18.432MHz crystal for (i=0; i < 256; i++) ; // Wait for osc. to start upwhile (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settleOSCICN = 0x88; // select external oscillator as SYSCLK// source and enable missing clock// detector}//***************//初始化IO口*************************//void PORT_Init (void){//XBR0 = 0x07; // Enable SMBus, SPI0, and UART0XBR1= 0x02; //交叉开关允许XBR2 = 0x40; // Enable crossbar and weak pull-upsEMI0CF=0x2F ; //复用方式,高4端口。

基于51单片机和ADC0809数模转换的C程序

基于51单片机和ADC0809数模转换的C程序

#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned int/********************定义LCD1602接口信息********************************/sbit lcdrs=P3^0;//数据命令选择位sbit lcden=P3^1;//使能位sbit lcdrw=P3^2;/********************定义ADC0808接口信息********************************/sbit ADA=P2^0;sbit ADB=P2^1;sbit ADC=P2^2;sbit EOC=P2^3;sbit CLK=P2^4;sbit START=P2^5;sbit OE=P2^6;/*****************键盘管脚定义*************/sbit key1=P3^3;sbit key2=P3^7;/*********************定义数据********************************/uchar tab1[]={48,46,48,48,48,46,48,48,48,46,48,48,48,46,48,48};//存放AD采集数据uchar tab2[]={48,46,48,48,48,46,48,48,48,46,48,48,48,46,48,48};uchar tab3[]="TONGLU:";uchar tab4[]="DIANYA:";uchar tab5[]="12345678";uchar num,m=0,getdata=0;uint temp=0;/*延时函数*/void delay(uchar t){uchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void delayl(uchar ltime){uchar i;for(i=ltime;i>0;i--)delay(255);}/*写命令函数*/void write_com(uchar com){lcdrs=0;P0=com;delay(10);lcden=1;delay(10);lcden=0;}/*写数据函数*/void write_data(uchar date){lcdrs=1;P0=date;delay(10);lcden=1;delay(10);lcden=0;}void disp(uchar h,l,uchar *p){write_com(0x80+h*0x40+l);while(*p!='\0'){write_data(*p);p++;}}/*初始化函数*/void LcdInit(){lcdrw=0;delay(5);lcden=0;//使能位置低电平write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);delayl(20);}void TimeInit(){TMOD=0x10;//定时器1工作于方式1,16位不重装初值TH1=(65536-200)/256; //定时200us(5KHz)TL1=(65536-200)%256;EA=1;ET1=1;TR1=1;}void AdTr(bit ADDA,ADDB,ADDC,uchar channel){START=0;OE=0;START=1;START=0;//A/D转换启动信号,正脉冲启动选中的模拟信号开始转换ADA=ADDA;ADB=ADDB;ADC=ADDC;delay(5);while(EOC==0);//启动转换后EOC变为L,转换结束后变为HOE=1;getdata=P1;temp=getdata*1.0/255*500;OE=0;if(channel<4){tab1[4*channel]=temp/100+0x30;tab1[4*channel+2]=(temp%100)/10+0x30;tab1[4*channel+3]=(temp%100)%10+0x30;}if(channel>=4){channel=channel-4;tab2[4*channel]=temp/100+0x30;tab2[4*channel+2]=(temp%100)/10+0x30;tab2[4*channel+3]=(temp%100)%10+0x30;}}void keyscan()/* 按键2进行减1*/{uint k;if(key1==0){m--;if(m<5){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab1[4*(m-1)+k]);}if(m>=5&&m<9){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab2[4*(m-5)+k]);}if(m==1)m=1;}while(key1==0); //等待按键释放if(key2==0){m++;if(m<5){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab1[4*(m-1)+k]);}if(m>=5&&m<9){write_com(0x80+0x07);write_data(tab5[m-1]);write_com(0x80+0x47);for(k=0;k<4;k++)write_data(tab2[4*(m-5)+k]);}if(m==9)m=0;}while(key2==0); //等待按键释放}void main(){LcdInit();TimeInit();while(1){AdTr(0,0,0,0);delay(5);AdTr(0,0,1,1);delay(5);AdTr(0,1,0,2);delay(5);AdTr(0,1,1,3);delay(5);AdTr(1,0,0,4);delay(5);AdTr(1,0,1,5);delay(5);AdTr(1,1,0,6);delay(5);AdTr(1,1,1,7);delay(5);disp(0,0,tab3);disp(1,0,tab4);keyscan();}}void t1(void) interrupt 3 using 0 {TH1=(65536-200)/256;TL1=(65536-200)%256;CLK=~CLK;}。

结合单片机学习板学习c语言之AD转换

结合单片机学习板学习c语言之AD转换

结合单片机学习板学习c语言之AD转换目的:通过STC单片机接收ADC0804的数字量,并把该数字量通过8155控制的LED显示出来。

/*本程序利用查询法得到ADC0804的AD转换后的数字量。

*/#include"at89x51.h"#include"absacc.h"#include "intrins.h"#include<stdio.h>#include"math.h"#define uchar unsigned charsfr ISP_CONTR =0xE7;uchar advalue,adl,adh;uchar code BitdisL[]={0x1f,0x2f,0x37,0x3b,0x3d,0x3e};uchar code Chardis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1};delay_05s(){int count;count=647395;for(;count!=0;count--);}/*void ad() interrupt 2 //如果想要用中断法,可以使用这个子程序{//EX1=0;RD=0;advalue=P0;adl=advalue & 0x0f;adh=_cror_(advalue,4);RD=1;//P1=~P1;//P1=advalue;WR=0;_nop_();WR=1;//EX1=1;}*/void serial() interrupt 4 //编号0-4,外中断0,定时器0,外中断1,定时器1,串行中断{uchar a;a=SBUF;if (a==0xFE){P1_0=0;delay_05s();delay_05s();ISP_CONTR=0x60;} else if(a=='A'){P1_1=0;delay_05s();P1_1=1;}}void main(void){unsigned int b; unsigned char cmd,temp;TMOD=0x20;TH1=0xf4;TL1=0XF4;TR1=1;SCON=0XF8;PCON=0X80;IT0=1;EA=1;ES=1;RI=0;cmd=0x0F;XBYTE[0X7FF0]=cmd; WR=0;_nop_();WR=1;while(1){WR=0;_nop_();WR=1;while(P3_3);RD=0;advalue=P0;if (cabs(advalue-temp)>0x01)/*该句仅仅为了显示值不会老是变动,但代价是显示精度减少了,有的电压不能用数字显示出来。

单片机adc转换原理及c语言编程实例

单片机adc转换原理及c语言编程实例

单片机adc转换原理及c语言编程实例单片机中的ADC(模拟数字转换器)是一种将模拟信号转换为数字信号的电子元件。

其原理是将模拟信号通过一系列的电子元件转换为相应的数字信号,从而能够被单片机处理和识别。

在C语言中,ADC的转换通常是通过读取ADC的寄存器来实现的。

下面是一个简单的C语言编程实例,用于读取ADC的转换结果:```cinclude <> // 包含单片机头文件define ADC_PORT P1 // 定义ADC输入端口为P1口void ADC_Start() // 启动ADC{ADC_PORT = 0x80; // 设置ADC控制寄存器,启动ADCdelay(10); // 延时一段时间,等待ADC转换完成}unsigned char ADC_Read() // 读取ADC转换结果{unsigned char i, dat = 0;for (i = 0; i < 8; i++) // 循环读取ADC数据寄存器中的数据{ADC_Start(); // 启动ADCdelay(10); // 延时一段时间,等待ADC转换完成if (ADC_PORT & 0x01) // 判断数据寄存器最高位是否为1{dat = (0x01 << i); // 将数据寄存器中的数据写入到结果变量中}ADC_PORT = (ADC_PORT >> 1) & 0x7F; // 将数据寄存器左移一位,准备读取下一位数据}return dat; // 返回转换结果}void main() // 主函数{while (1) // 循环读取ADC转换结果并输出到串口{unsigned char dat = ADC_Read(); // 读取ADC转换结果// 在此处添加串口发送代码,将dat发送到串口}}```在上述代码中,首先定义了ADC的输入端口为P1口,然后定义了两个函数:`ADC_Start()`用于启动ADC,`ADC_Read()`用于读取ADC转换结果。

51单片机ad转换代码及仿真

51单片机ad转换代码及仿真

51单片机AD转换代码及仿真1. 任务概述本文主要探讨51单片机模拟信号的AD(模数转换)过程以及相关代码的编写和仿真。

通过本文,读者将了解到51单片机的AD转换原理、AD转换的流程、具体代码实现方法以及如何使用仿真软件进行验证和调试。

2. 51单片机的AD转换原理[为了实现模拟信号到数字信号的转换,51单片机内置了一部分模拟数字转换器(ADC)。

ADC是一种电子元器件,它可以将模拟信号转换成数字信号。

模拟信号是连续的,而数字信号是离散的。

模拟信号转换成数字信号的过程叫做AD(模数转换),其原理可以简单描述如下:]1.首先,模拟信号通过模拟输入引脚进入51单片机中的ADC模块。

2.ADC模块将模拟信号进行采样,即对信号进行离散化处理,将离散化后的采样值存储在一个寄存器中。

3.采样值随后会经过数字化处理,变成具有一定精度的数字量。

4.数字量经过处理后,嵌入系统可以根据其数值进行分析、判断和控制。

3. 51单片机的AD转换流程[51单片机的AD转换流程可以分为以下几个步骤:]3.1 设置ADC模块在使用51单片机进行AD转换之前,需要先设置ADC模块的相关参数,如引脚选择、参考电压选择、时钟频率等。

这些设置可通过写入ADC相关的寄存器来完成。

3.2 启动转换设置完成后,可以通过设置一个特定的位来启动AD转换。

一旦AD转换开始,51单片机将根据设置的参数自动进行转换操作。

3.3 等待转换完成在启动AD转换后,需要等待转换完成。

此时,可以通过查询ADC模块的状态位来判断转换是否完成。

3.4 读取转换结果转换完成后,可以通过读取ADC寄存器的值来获取AD转换结果。

这个值将会代表输入模拟信号的数字化数值。

4. 51单片机AD转换的代码实现[以下给出一个简单的51单片机AD转换的代码示例。

本示例假设选用了P1口作为ADC的输入引脚,使用AVCC作为参考电压,时钟频率为12MHz。

]#include <reg52.h>// 引入51单片机的头文件sbit ADC_IN = P1^0; // 定义P1.0为ADC输入引脚void ADC_Init() {// 设置ADC参考电压为AVCCADMUX = (1<<REFS0);// 设置ADC输入通道为ADC0(P1.0)ADMUX |= (1<<MUX0);// 启用ADC模块,设置ADC时钟频率为F_CPU/8ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);}unsigned int ADC_Read() {unsigned int adc_value = 0;// 设置ADC转换开始位ADCSRA |= (1<<ADSC);// 等待转换完成while (ADCSRA & (1<<ADSC));// 读取ADC寄存器的值adc_value = ADCL;adc_value |= (ADCH<<8);return adc_value;}void main() {unsigned int adc_result = 0;ADC_Init(); // 初始化ADC模块while (1) {adc_result = ADC_Read(); // 读取ADC转换结果// 在此处对结果进行处理或输出}}在以上示例代码中,首先通过ADC_Init()函数对ADC进行初始化设置。

基于AD转换模块的单片机仿真和C语言开发设计

基于AD转换模块的单片机仿真和C语言开发设计

基于AD转换模块的单片机仿真和C语言开发设计
 大学做过的一小设计,那会没事就弄这些AD\DA\MCU以及功能性的IC. 后来一老师要求做的这个,设计一多路数据采集系统,当时资料大多都是0809,0832之类的ADDA,网上找了部分资料。

因为手上刚好有几片TLC2543。

后来就用的它,完全满足题目要求吧。

配上PTORUES仿真最后
显示出来了。

记得当时给老师看的时候用电阻做的10路模拟数据,然后用螺丝刀旋转电位器给被人看。

没有什幺额外特别的功能,相当于做了个AD+显示,也称得上是最
小的一个系统了。

技术要求:
1、设计一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。

要求进行电路仿真实验,并使用C语言进行程序的开发。

简易框架如下。

STM8的C语言编程AD转换

STM8的C语言编程AD转换

STM8的C语言编程AD转换STM8的C语言编程(12)--AD转换在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。

在S TM8单片机中,提供的是10位的A/D,通道数随芯片不同而不同,少的有4个通道,多的则有16个通道。

下面的实验程序首先对A/D输入进行采样,然后将采样结果的高8位(丢弃最低的2位),作为延时参数去调用延时子程序,然后再去驱动LED控制信号。

因此不同的采样值,决定了LED的闪烁频率。

当旋转ST三合一开发板上的电位器时,可以看到LED的闪烁频率发生变化。

同样还是利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的m ain.c,修改后的代码如下。

// 程序描述:通过AD模块,采样电位器的电压,改变LED的闪烁频率#include "STM8S207C_S.h"// 函数功能:延时函数// 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ// 输出参数:无// 返回值:无// 备注:无void DelayMS(unsigned int ms){unsigned char i;while(ms != 0){for(i=0;i<250;i++){}for(i=0;i<75;i++){}ms--;}}main(){int i;// 将PD3设置成推挽输出,以便推动LEDPD_DDR = 0x08;PD_CR1 = 0x08;PD_CR2 = 0x00;// 初始化A/D模块ADC_CR2 = 0x00; // A/D结果数据左对齐ADC_CR1 = 0x00; // ADC时钟=主时钟/2=1MHZ// ADC转换模式=单次// 禁止ADC转换ADC_CSR = 0x03; // 选择通道3ADC_TDRL = 0x20;for(;;) // 进入无限循环{ADC_CR1 = 0x01; // CR1寄存器的最低位置1,使能ADC转换for(i=0;i<100;i++); // 延时一段时间,至少7uS,保证ADC模块的上电完成ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1// 使能ADC转换while((ADC_CSR & 0x80) == 0); // 等待ADC结束i = ADC_DRH; // 读出ADC结果的高8位DelayMS(i); // 延时一段时间PD_ODR = PD_ODR ^ 0x08; // 将PD3反相}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录摘要............................................... 错误!未定义书签。

1 软件介绍......................................... 错误!未定义书签。

1.1 protues仿真软件.......................... 错误!未定义书签。

1.2 C编译器Keil介绍......................... 错误!未定义书签。

1.3 51单片机介绍............................. 错误!未定义书签。

2 整体设计分析.................................... 错误!未定义书签。

3 硬件模块设计..................................... 错误!未定义书签。

3.1 控制系统模块.............................. 错误!未定义书签。

3.3 数码管显示模块............................ 错误!未定义书签。

3.4 总原理图.................................. 错误!未定义书签。

4 仿真流程........................................ 错误!未定义书签。

4.1 C语言编译................................ 错误!未定义书签。

4.2 添加文件.................................. 错误!未定义书签。

5 个人心得......................................... 错误!未定义书签。

6 参考文献........................................ 错误!未定义书签。

附录一 C语言程序代码............................. 错误!未定义书签。

本科生能力拓展训练成绩评定表....................... 错误!未定义书签。

摘要本设计要求作出一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。

完成此功能采用AT89C51型单片机作为控制系统,用C语言进行编程,根据实时按键的扫描情况更新采集的数据,并且在数码管上显示出来。

完成AD转换功能的核心器件是ADC0808芯片,多通路的输入用开关来进行控制。

关键词:AD转换ADC0808 AT89C511 软件介绍1.1 protues仿真软件Protues 软件是来自英国Labcenter electronics 公司的EDA 工具软件,Protues 软件有20年的历史,在全球广泛使用。

它除了具有和其它EDA 工具一样的原理布图、PCB 自动或人工布线及电路仿真的功能外,其革命性的功能是,它的电路仿真是交互的,可视化的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,可以测量仿真的波形及记录仿真数据。

其功能模块:—个易用而又功能强大的ISIS 原理布图工具;PROSPICE 混合模型SPICE 仿真; ARESPCB 设计。

PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。

此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LED 甚至LCD 显示CPU 模型。

Protues 主要特征:1、支持许多通用的微控制器,如ARM,PIC,AVR,以及8051.2、交互的装置模型包括:LED 和LCD 显示,RS232 终端,通用键盘3、强大的调试工具,包括寄存器和存储器,断点和单步模式4、IAR C-SPY 和Keil uVision4 等开发工具的源层调试1.2 C编译器Keil介绍Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

KeilSoftware公司推出的uVision4是一款可用于多种8051MCU的集成开发环境(IDE),该IDE同时也是PK51及其它开发套件的一个重要组件。

除增加了源代码、功能导航器、模板编辑以及改进的搜索功能外,uVision3还提供了一个配置向导功能,加速了启动代码和配置文件的生成。

此外其内置的仿真器可模拟目标MCU,包括指令集、片上外围设备及外部信号等。

uVision3提供逻辑分析器,可监控基于MCUI/O引脚和外设状态变化下的程序变量。

uVision4提供对多种最新的8051类微处理器的支持,包括AnalogDevices的ADuC83x和ADuC84x,以及Infineon的XC866等。

1.3 51单片机介绍单片微型计算机(Single-Chip Microcomputer),简称单片机。

就是将微处理器(CPU)、存储器(存放程序或数据的ROM和RAM)、总线、定时器/计数器、输入/输出接口(I/O口)和其他多种功能器件集成在一块芯片上的微型计算机。

本次课程设计选用的是MCS-51系列单片机中的80C51。

MCS-51单片机包含中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时器/计数器、并行I/O接口、串行I/O接口和中断系统等几大单元。

中央处理器由运算器、控制器组成。

8051的CPU包含以下功能部件:(1)8位CPU。

(2)布尔代数处理器,具有位寻址能力。

(3)128B内部RAM数据存储器,21个专用寄存器。

(4)4KB内部掩膜ROM程序存储器。

(5)2个16位可编程定时器/计数器。

(6)32位(4×8位)双向可独立寻址的I/O口。

(7)1个全双工UART(异步串行通信口)。

(8)5个中断源、两级中断优先级的中断控制器。

(9)时钟电路,外接晶振和电容可产生1.2MHz~12 MHz的时钟频率。

2 整体设计分析设计要完成一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。

我采用的是八通道的数据轮流输入ADC0808,ADC0808是以逐次逼近原理进行模/数转换的器件,用开关进行控制八路数据,整个接在IN0输入口上,ADC0808的控制口全0选通该输入口。

当然也可以把八个通道分别接在芯片八个不同的输入口上,通过单片机来控制输入口的选通,此种方法51芯片部分的程序设计要加上选通模块。

ADC0808完成转换后数据送入AT89C51部分,然后再控制在四个七段数码管上显示输出采集的数据。

3 硬件模块设计3.1 控制系统模块本设计控制系统采用AT89C51,采用12M晶振,整体控制多通道数据采集显示和键盘扫描,该部分的接线和仿真时的显示如下图3.1所示。

图3.1 89C51芯片引脚AT89C51结构介绍:P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

3.2 ADC数据采集模块ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。

其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0808是ADC0809的简化版本,功能基本相同。

一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

ADC0808芯片有28条引脚,采用双列直插式封装,如下图3.2所示。

图3.2 ADC0808模块部分引脚功能如下:(1)1~5和26~28(IN0~IN7):8路模拟量输入端;(2)8、14、15和17~21:8位数字量输出端;(3)22(ALE):地址锁存允许信号,输入,高电平有效;(4)6(START):A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升使0808复位,下降沿启动A/D转换);(5)7(EOC):A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

(6)9(OE):数据输出允许信号,输入,高电平有效。

当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量;(7)23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路。

3.3 数码管显示模块本系统采用四个数码管显示通道以及采样值。

并且实时更新新的采样数据。

这部分连接较简单,下图3.3是数码管部分的接入以及零输入时的数码管显示。

图3.3 数码管显示模块3.4 总原理图图3.4 总原理图4 仿真流程4.1 C语言编译在Keil软件中编写好C语言程序,编译生成.hex文件。

编译及生成文件如下图4.1所示。

图4.1 Keil软件编译4.2 添加文件在proteus软件中按原理图所示连线,并邮件点击AT89C51模块添加仿真文件,添加界面如图4.2所示。

图 4.2 文件添加4.3 仿真结果通道1通道3通道6以上展示了三个通道的输入和输出,我设置的八路模拟量输入分别为0.50、0.75、1.00、1.50、2.50、3.00、3.50、4.00,当然,这每一路的输入都是可以在0-5v的范围内通过滑动变阻器进行调整。

经过检验,依次分别合上单路开关后,数码管上显示的数值分别为0.507、0.742、0.996、1.503、2.480、2.988、3.476、3.984,由此可见,在一定误差允许的范围内,用ADC0808以及AT89C51完成了AD转换,并在数码管上进行显示的功能。

相关文档
最新文档