AD转换子程序
单片机控制AD转换程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wr=P3^6;
sbit rd=P3^7;
sbit duan=P2^6;
wei=1;
P0=0xfb;
wei=0;
delay(30);
}
sbit wei=P2^7;
uchar bai,shi,ge;
uint temp;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint k)
while(1)
{
start(); //启动AD转换
delay(10);
rd=0;
delay(5);
rd=1;//rd上升沿读数据
temp=P1;//读出数据后,马上赋给temp
delay(1);
wei=0;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
display(bai,shi,ge);
P0=0xff;//消影,下一步位选开启时,瞬间传入的是前面的P0值,所以后3个数码管有乱码
wei=1;
P0=0xfd;
wei=0;
delay(30);
//显示个位
duan=1;
P0=table[ge];
单片机AD转换程序

《MAIN》;====变量及常数定义段====#include "VARDFN.ASM";添加变量等定义模块;===============ORG 0000HLJMP MAINORG 0003HLJMP INTERUPT_0 ;转外部中断0服务子程序ORG 0030HMAIN:#include "INITIAL.ASM";添加初始化模块MOV IE,#81HSETB TCON.0 ;设置下降沿触发外部中断0 CLR RESET;延时:(((2*R6+3)*R7+3)*R5);约为R5*2.5ms DELAY: ;延时((2*R7+3)*R6+5)*R5≈0.5SMOV R5,#200DL00: MOV R6,#05DL01: MOV R7,#250DL02:DJNZ R7,DL02DJNZ R6,DL01DJNZ R5,DL00SETB RESETMOV STA,#21H ;选择时钟寄存器,通道2LCALL WRITE7705MOV STA,#09H ;25Hz的转换频率LCALL WRITE7705MOV STA,#11H ;选择设置寄存器LCALL WRITE7705MOV STA,#6EH ;自校准模式,增益为32 LCALL WRITE7705; JB P3.2,$ ;等DRDY变低MLOOP:JNB TF0,$ ;4mS到?CLR TF0 ;清定时标志MOV TH0,#0F0H ;4mS定时重设MOV TL0,#60HLCALL RDKEY ;调用读键状态及去抖处理JNB EK14,CF0MOV MSTA,#01HCF0:MOV A,MSTA ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#MTABJMP @A+DPTRMTAB: AJMP WORK0 ;转移到显示重量模块AJMP WORK1 ;转移到单价赋值模块AJMP WORK2 ;转移到查询模块AJMP WORK0 ;冗余;====显示重量模块====WORK0:;LCALL INIT7705;MOV STA,#38H;LCALL WRITE7705;LCALL READ7705;MOV R7,AD_GAO;MOV R6,AD_DI;MOV R5,#0C3H;MOV R4,#50H;MOV R0,#ZHUANH0;LCALL MUL1MOV R7,ZHUANH3MOV R6,ZHUANH3MOV R5,#00HMOV R4,XISHUMOV R0,#YALILCALL MUL1;=====压力转重量转电压待处理YALI ===AJMP MLOOP;====单价赋值模块====WORK1:MOV A,XIAOSHU ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#WWK11JMP @A+DPTRWWK11: AJMP WRK0 ;AJMP WRK1 ;AJMP WRK2 ;AJMP WRK3WRK0:MOV COM,#93HLCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#2EHLCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEAJMP XIAO_ZWRK1:MOV COM,#93H LCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#2EHLCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEAJMP XIAO_ZWRK2:MOV COM,#93H LCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#2EHLCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEAJMP XIAO_ZWRK3:MOV COM,#93H LCALL WCOMMOV A,DSB3ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB2ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB1ADD A,#30HMOV CODER,ALCALL WCODEMOV A,DSB0ADD A,#30HMOV CODER,ALCALL WCODEMOV CODER,#20HLCALL WCODEAJMP XIAO_ZXIAO_Z:JNB EK13,LPP0MOV A,XIAOSHUINC AANL A,#03HMOV XIAOSHU,A; MOV A,XIAOSHUCLR AMOV DSB0,AMOV DSB1,AMOV DSB2,AMOV DSB3,ALPP0:CLR A ;查询"0"键JB EK0,WK12INC A ;查询"1"键JB EK1,WK12INC AJB EK2,WK12INC AJB EK3,WK12INC AJB EK4,WK12INC AJB EK5,WK12INC AJB EK6,WK12INC AJB EK7,WK12INC AJB EK8,WK12INC A ;查询"9"键JNB EK9,WOOKWK12:MOV DSB,AMOV A,ANJ_ZHI ;根据状态值散转相应模块ANL A,#03HRL AMOV DPTR,#WWKJMP @A+DPTRWWK: AJMP WOK0 ;AJMP WOK1 ;AJMP WOK2 ;AJMP WOK3WOK0:MOV A,DSBMOV DSB0,AAJMP WOOKWOK1:MOV A,DSBMOV DSB1,AAJMP WOOKWOK2:MOV A,DSBMOV DSB2,AAJMP WOOKWOK3:MOV A,DSBMOV DSB3,AAJMP WOOKWOOK:JNB EK11,KKL0 ;是否有11按键,有的话,切换位MOV A,ANJ_ZHIINC AANL A,#03HMOV ANJ_ZHI,AKKL0:JNB EK12,KKL1 ;判断是否有12按键,有的话跳到模块02HMOV MSTA,#02HKKL1:AJMP MLOOP;====查询模块====WORK2:AJMP MLOOP;====外部中断0服务子程序====INTERUPT_0:PUSH ACCPUSH PSWCLR IE0MOV STA,#39HLCALL WRITE7705LCALL READ7705NOPNOPNOPNOPNOPMOV STA,#11HLCALL WRITE7705MOV STA,#6EHLCALL WRITE7705POP PSWPOP ACCRETI;====通用子程序段====#include "RDKEY.ASM";添加读键状态及去抖处理子程序#include "YJINITIAL.ASM" ;添加液晶12864动态扫描显示子程序#include "AD7705.ASM"#include "SUANFA.ASM"END;AD7705子程序清单:;------------Iint7705-------------;初始化AD7705;------------WRITE7705-------------;输出一个字节到7705WRITE7705:MOV R0,#08HCLR CSSETB RESETW7705:CLR SCLKMOV A,STARLC AMOV DIN,CSETB SCLKDJNZ R0,W7705SETB CSRET;------------READ7705-------------;读7705的转换结果READ7705:; JB P3.2,$ ;等DRDY变低CLR CSMOV R0,#08HR751:CLR SCLKSETB SCLKMOV C,DOUTRLC ADJNZ R0,R751MOV AD_GAO,A ;保存高位字节R752:SETB SCLKMOV C,DOUTRLC ADJNZ R0,R752MOV AD_DI,A ;保存低位字节SETB CSRET====变量定义段====;AD7705变量SCLK BIT P3.0CS BIT P3.1RESET BIT P3.3DIN BIT P3.4DOUT BIT P3.5DRTY BIT P3.2;LCD变量SCLK0 BIT P2.5 ;液晶(E)位选--串行口时钟信号CS0 BIT P2.3 ;液晶(RS)位选--串行口片选信号SID BIT P2.4 ;液晶(R/W)位选--串行口数据信号ROW0 BIT P1.4 ;K0~3键列选择ROW1 BIT P1.5 ;K4~7键列选择ROW2 BIT P1.6 ;K8~11键列选择ROW3 BIT P1.7 ;K12~15键列选择KEY1 EQU 21H ;键状态字KEY2 EQU 22HK0 BIT KEY1.0 ;K0键K1 BIT KEY1.1 ;K1键K2 BIT KEY1.2 ;K2键K3 BIT KEY1.3 ;K3键K4 BIT KEY1.4 ;K4键K5 BIT KEY1.5 ;K5键K6 BIT KEY1.6 ;K6键K7 BIT KEY1.7 ;K7键K8 BIT KEY2.0 ;K8键K9 BIT KEY2.1 ;K9键K10 BIT KEY2.2 ;K10键K11 BIT KEY2.3 ;K11键K12 BIT KEY2.4 ;K12键K13 BIT KEY2.5 ;K13键K14 BIT KEY2.6 ;K14键K15 BIT KEY2.7 ;K15键EKEY1 EQU 23H ;键前沿字EKEY2 EQU 24HEK0 BIT EKEY1.0 ;K0键前沿EK1 BIT EKEY1.1 ;K1键前沿EK2 BIT EKEY1.2 ;K2键前沿EK3 BIT EKEY1.3 ;K3键前沿EK4 BIT EKEY1.4 ;K4键前沿EK5 BIT EKEY1.5 ;K5键前沿EK6 BIT EKEY1.6 ;K6键前沿EK7 BIT EKEY1.7 ;K7键前沿EK8 BIT EKEY2.0 ;K8键前沿EK9 BIT EKEY2.1 ;K9键前沿EK10 BIT EKEY2.2 ;K10键前沿EK11 BIT EKEY2.3 ;K11键前沿EK12 BIT EKEY2.4 ;K12键前沿EK13 BIT EKEY2.5 ;K13键前沿EK14 BIT EKEY2.6 ;K14键前沿EK15 BIT EKEY2.7 ;K15键前沿COM EQU 30H ;控制字暂存单元--液晶DAT1 EQU 31H ;显示数据暂存单元1--液晶DAT2 EQU 32H ;显示数据暂存单元2--液晶CODER EQU 33H ;字符代码暂存单元--液晶ADDR EQU 34H ;地址暂存单元---液晶KTMR EQU 35H ;键去抖延时器STA EQU 36H ;模块状态值AD_GAO EQU 37HAD_DI EQU 38HFNUM0 EQU 39H ;数据1(双字节压缩BCD码) FNUM1 EQU 3AHSNUM0 E QU 3BH ;数据2(双字节压缩BCD码) SNUM1 E QU 3CHMSTA EQU 3DHZHUANH0 EQU 40HZHUANH1 EQU 41HZHUANH2 EQU 42HZHUANH3 EQU 43HYALI EQU 44HXISHU EQU 45HXIAOSHU EQU 50HDSB EQU 51HDSB0 EQU 52HDSB1 EQU 53HDSB2 EQU 54HDSB3 EQU 55HANJ_ZHI EQU 56H;====常数定义段====;==================。
51单片机ad转换程序解析

51单片机ad转换程序解析1.引言1.1 概述概述部分旨在介绍本篇文章的主题——51单片机AD转换程序,并对文章的结构和目的进行简要说明。
51单片机是指Intel公司推出的一种单片机芯片,它广泛应用于嵌入式系统中。
而AD转换则是模拟信号转换为数字信号的过程,是嵌入式系统中的重要功能之一。
本文将详细解析51单片机中的AD转换程序。
文章结构分为引言、正文和结论三个部分。
引言部分将给读者介绍本篇文章的内容和结构安排,正文部分将详细讲解51单片机AD转换程序的相关要点,而结论部分将总结正文中各个要点的内容,以便读者能够更好地理解和掌握51单片机AD转换程序的实现原理。
本文的目的在于向读者提供一份对51单片机AD转换程序的详细解析,使读者能够了解51单片机的AD转换功能以及如何在程序中进行相应的设置和操作。
通过本文的学习,读者将掌握如何使用51单片机进行模拟信号的采集和处理,为后续的嵌入式系统设计和开发提供基础。
在下一节中,我们将开始介绍文章的第一个要点,详细讲解51单片机AD转换程序中的相关知识和技巧。
敬请期待!1.2 文章结构文章结构部分主要是对整篇文章的框架和内容进行介绍和归纳,以帮助读者更好地理解文章的组织和内容安排。
本文以"51单片机AD转换程序解析"为主题,结构分为引言、正文和结论三个部分。
引言部分主要包括概述、文章结构和目的三个方面。
首先,通过对单片机AD转换程序的解析,来讲解其实现原理和功能。
其次,介绍文章的结构,帮助读者明确整篇文章的主要内容和组织方式。
再次,阐明文章的目的,即为读者提供关于51单片机AD转换程序的详尽解析和指导,帮助读者深入了解该技术并进行实际应用。
正文部分则分为两个要点,即第一个要点和第二个要点。
第一个要点可以从AD转换的基本概念入手,介绍51单片机AD转换的原理和流程。
包括输入电压的采样、AD转换器的工作原理、ADC的配置和控制等方面的内容。
在此基础上,深入解析51单片机AD转换程序的编写和调用方法,包括编程语言、寄存器的配置、数据的获取和处理等。
AD转换程序(ADC0808TLC2543)

Lesson6-4:ADC0808数字电压表,测量范围0~5V,仿真通过#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极段码uchar b[4];//存放4位显示的数sbit START=P2^4;sbit OE=P2^6;sbit EOC=P2^5;void mdelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void show(void){uint i;uchar c=0x01;for(i=0;i<4;i++){P1=(c<<i);P3=b[i];if(i==2)//显示小数点P3=P3|0x80;mdelay(1);}}void main(void){uint shuju=0;while(1){START=1;START=0;//下降沿启动转换信号while(EOC==0)//判断是否转换结束,EOC=0正在进行转换{OE=1;}shuju=P0;shuju=shuju*1.0/255*500;//放大100倍OE=0;b[0]=a[shuju%10];//个位b[1]=a[shuju%100/10];//十位b[2]=a[shuju/100];//百位b[3]=a[shuju/1000];//最高位始终为0show();}}Lesson6-4:TLC2543数字电压表,测量范围0~5V,1路模拟输入,采用4位数码管显示,仿真通过。
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极段码uchar b[4];//存放4位要显示的数sbit CLOCK=P2^7; /*2543时钟*/sbit D_IN=P2^6; /*2543输入*/sbit D_OUT=P2^4; /*2543输出*/sbit _CS=P2^5; /*2543片选*/void mdelay(uint z)//1ms延时子程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay(uchar n){uchar i;for(i=0;i<n;i++){_nop_();}}/**************************************名称:read2543功能:TLC2543驱动模块输入参数:port通道号输出参数:ad转换值*************************************/uint read2543(uchar port){uint ad=0,i;CLOCK=0;_CS=0;port<<=4;//通道号左移4位for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制{if(D_OUT) ad|=0x01;//转换后的值高位先送出D_IN=(bit)(port&0x80);//通道值高位先送出CLOCK=1;delay(3);CLOCK=0;delay(3);port<<=1;ad<<=1;}_CS=1;ad>>=1;//循环中多左移了一位return ad;}void show(void)//数码管显示子程序{uint i;uchar c=0x01;for(i=0;i<4;i++){P1=(c<<i);P3=b[i];if(i==2)//显示小数点P3=P3|0x80;mdelay(1);}}void main(void){uint ad=0;while(1){ad=read2543(0);ad=ad*1.0/4096*500;//b[0]=a[ad%10];//个位b[1]=a[ad%100/10];//十位b[2]=a[ad/100];//百位b[3]=a[ad/1000];//最高位始终为0show();}}附:功能与前例相同,但是读2543的函数不同#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f};//共阴极段码uchar b[4];//存放4位要显示的数sbit D_CLOCK=P2^7;sbit D_IN=P2^6;sbit D_OUT=P2^4;sbit D_CS=P2^5;void mdelay(uint z)//1ms延时子程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**************************************名称:read2543功能:TLC2543驱动模块输入参数:port通道号输出参数:ad转换值*************************************///TI TLC2543 12位AD驱动程序,51晶振是11.0592MHz的。
单片机实验程序AD转换

程序分析5-中断服务-显示部分
j=dis_buffer[Disp_cnt];//显示内容:2 5 5 P2_tmp=array[j]; //查表,数据端口 if(!ADC_CS) { if(F_ADC_CLK)//P2.1 is clk_adc P2_tmp |=0x02; else P2_tmp &=0xfd; } P2 = P2_tmp; P0=display_con[Disp_cnt];//位控制 Disp_cnt++; if(Disp_cnt>=3) Disp_cnt=0;
}
程序分析3-AD转换器时序
ADI: 1 1 0(启动 单端 通道0 的AD转换)
程序分析3-生成脉冲
void Pulse(void) { unsigned char i; F_ADC_CLK=1; ADC_CLK=1; i=2; while(i-->0); F_ADC_CLK=0; ADC_CLK=0; i=2; while(i-->0); } F_ADC_CLK的作用?
实验19 AD转换
功能&演示
• 0.4s启动一次AD转换 • 将AD转换的结果(0~255)显示在数码管 DS1~DS3上 • 调整电位器,可观察到数码管显示数字的 变化
程序分析1-程序结构
• • • • AD转换模块(对通道0 CH0) 显示模块(定时器中断中完成) 初始化部分 主循环部分
void ADConvert() { unsigned char temp; unsigned char i; temp=0; ADC_CS=0; i=5; ADC_CS=1; while(i-->0); ADC_CS=0; ADC_DI=1; //1:启动AD转换器 Pulse(); ADC_DI=1; //SGL = 1 : 单端模式 Pulse(); ADC_DI=0; //ODD=0 : 对通道0进行 AD转换(单端模式) Pulse(); for(i=0;i<8;i++) { temp=temp<<1; Pulse(); if(ADC_DO) temp=temp|0x01; }
AD转换例程

第8章模数转换模块(ADC)8.8 ADC转换应用举例源程序代码:(1)所需的复位和中断向量定义文件“vectors.asm”// 该文件利用汇编语言代码定义了复位和中断向量.title "vectors.asm".ref _c_int0,_nothing,_adint.sect ".vectors"reset: b _c_int0 // 复位向量int1: b _adint // A/D中断向量int2: b _nothingint3: b _nothingint4: b _nothingint5: b _nothingint6: b _nothing(2)主程序// 该程序用于进行A/D转换的演示,A/D转换的结果存于数足ADRESULT[16]中,// 寄存器cesi用于测试每个A/D转换的结果#include "register.h"int ADRESULT[16];// 定义一个数组用于保存AD转换的结果volatile unsigned int *j;// 定义一个指针变量jint i=0X00,ceshi;// 屏蔽中断子程序void inline disable(){asm(" setc INTM");}// 开总中断子程序void inline enable(){asm(" clrc INTM");}// 系统初始化子程序void initial(){175asm(" setc SXM");// 符号位扩展有效asm(" clrc OVM");// 累加器中结果正常溢出asm(" clrc CNF");// B0被配置为数据存储空间*SCSR1=0x81FE;// CLKIN=6M,CLKOUT=4*CLKIN=24M*WDCR=0x0E8;// 不使能看门狗,因为SCSR2中的WDOVERRIDE// 即WD保护位复位后的缺省值为1,故可以用// 软件禁止看门狗*IMR=0x0001;// 允许INT1中断*IFR=0x0FFFF;// 清除全部中断标志,"写1清0"}// AD初始化子程序void ADINIT(){*T4CNT=0X0000;// T4计数器清0*T4CON=0X170C;// T4为连续增计数模式,128分频,且选用内部时钟源*T4PR=0X75;// 设置T4的周期寄存器*GPTCONB=0X400;// T4周期中断标志触发AD转换*EVBIFRB=0X0FFFF;// 清除EVB中断标志,写"1"清0*ADCTRL1=0X10;// 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,// 转换时间预定标位CPS为0,AD为启动/停止模式,排// 序器为级连工作方式,且禁止特殊的两种工作模式*ADCTRL2=0X8404;// 可以用EVB的一个事件信号触发AD转换,// 且用中断模式1*MAXCONV=0X0F;// 16通道*CHSELSEQ1=0X3210;*CHSELSEQ2=0X7654;*CHSELSEQ3=0X0BA98;*CHSELSEQ4=0X0FEDC;// 转换通道是0-15}// 启动AD转换子程序(通过启动定时器4的方式间接启动)void ADSOC(){*T4CON=*T4CON|0X40;// 启动定时器4}// 若是其它中断则直接返回子程序void interrupt nothing(){return;176}// AD中断服务子程序void interrupt adint(){asm(" clrc SXM");// 抑制符号位扩展j=RESULT0;// 取得RESULT0的地址for(i=0;i<=15;i++,j++){ADRESULT[i]=*j>>6;// 把AD转换的结果左移6位后存入规定的数组ceshi=ADRESULT[i];// 检验每个A/D转换的结果}*ADCTRL2=*ADCTRL2|0X4200;// 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0 enable();// 开总中断,因为一进入中断总中断就自动关闭了}main(){disable( );// 禁止总中断initial( );// 系统初始化ADINIT( );// AD初始化子程序enable( );// 开总中断ADSOC( );// 启动AD转换while(1){if(i==0x10) break;// 如果已发生中断,则停止等待(发生中断后,i=0x10)} // 等待中断发生*T4CON=*T4CON&0X0FFBF;// 停止定时器4,即间接停止A/D转换while(1){;} // 死循环,在实际的工程应用中在此可以利用A/D转换的结果用于一些运算}177。
单片机的AD转换程序

单片机的AD转换程序#include at89x51.h#define uchar unsigned char#define unit unsigned intsbit eoc=P3^0;sbit oe =P3^1;sbit st =P3^3;sbit s1=P2^5;sbit s2=P2^6;sbit s3=P2^7;uchar codetab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x0,0x0};//数码管共阳级显示0~9,不显示unit ad_0809,ad_data1,ad_data2,ad_data3;uchar out;void delaynms(unit x);void display();void ad0809();void key();void main(){EA=1;EX0=1;IT0=1;//下降沿触发,cpu内存占用少,如果是低电平触发,cpu将耗大量内存在中断上,长时间的取ad转换数据while(1){ s1=s2=s3=0;/annel 0P0=0xff;//inputoe=0;st=0;st=1;//清0st=0;//启动ad_0809=out;display();}}void EXINTO(void) interrupt 0{EA=0;EX0=0;oe=1;out=P0;oe=0;EX0=1;}void delaynms(unit x){ while(x--0){unsigned char k;for(k=10;kk--);}}void display(){ //unit a;ad_data1=(ad_0809*49/25)/100; //the highest bit, 255*49/25=4.99V ad_data2=(ad_0809*49/25)/10%10;ad_data3=(ad_0809*49/25)%100%10;P1=tab[ad_data3];P2=0x0b;delaynms(10);P2=0xff;P1=tab[ad_data2];P2=0x0d;delaynms(10);P1=tab[ad_data1];P2=0x0e;P1_7=1; //共阴极的delaynms(10);//中断方式延时比较短P2=0xff;}模数转换器适用的最高有效工作时钟频率约为3MHz。
C语言编写的AD转换程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dat = P2^0; //164数据输入端sbit clk = P2^1; //164 时钟控制端sbit EOC = P2^6; //1543 eocsbit CS = P2^2; //片选sbit CLOCK= P2^5; //1543时钟sbit ADDRESS=P2^4; //1543地址输入端sbit DA TAOUT=P2^3; //1543数据输出端sbit buzz = P2^7; // 报警输出口uchar publicwaring=0; //全局变量,记录报警类型,高、低、缺相。
初值必是0uint idata Edataout[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//全局数组。
记录经滤波、标度变换后的测量通道测量值。
void writeaddress (uchar waddress) //向1543写入地址子程序段{unsigned char i,j;CS=0; CLOCK =0; //关闭时钟,片选waddress=waddress<<4; //移除1543地址数据,应1543是4位故前4位不是有效数据位for (i=0;i<4;i++){ //4次移位循环,写地址到1543ADDRESS=(bit)(waddress&0x80);CLOCK=1;for(j=0;j<10;j++);CLOCK=0;waddress<<=1;}for (i=1;i<7;i++) //因为1543是10个高后开始再次工作。
而地址只有4位{for(j=0;j<10;j++); //所以相1543中填入6个空的高脉冲CLOCK=1;for(j=0;j<10;j++);CLOCK=0;}CS=1;CS=1; EOC=0;}uint readdataout (uint outdata) //1543数据读出子程序{uchar i,j,ap[15];bit outbit7;CS=0; CLOCK =0;outdata=0; //此数据初始必须为0 ,以便其后分离并合并数据for (i=0;i<12;i++){ap[i]=0x00;}for(j=0;j<10;j++){CLOCK=1;for(i=0;i<10;i++);outbit7=(bit)(DA TAOUT);if (outbit7==0){ap[j]= ap[j]&0x00;} //分离读出的数据位,并存入制定地址中if (outbit7==1){ap[j]= ap[j]|0x01;}CLOCK=0;for(i=0;i<10;i++);}CS=1; EOC=0;CS=1; i=7;for(j=2;j<10;j++) //数据的有效移位,得出AD值的低8位的个位的正确位置{ap[j]=ap[j]<<i;outdata=outdata|ap[j]; //合并数据个位得出AD的低8位数据--i;}outdata+=ap[0]*512+ap[1]*256 ; //处理AD高2位,并与低8位合成16位数据return (outdata);}//------------------------------------------------------------------------------------------// 显示程序//---------------------------------------------------------------------------------------------uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc7,0x89,0xc1};//0-9,-,全灭,L,Hvoid sendbyte(uchar byte,uchar m)//0000 0000 --- dp g f e d c b a 段码序列{uchar num,c,i;uchar k=4; //控制小数点位置,1:个位2:十位------------num=tab[byte];if (k==m){num&=0x7f;}for(c=0;c<8;c++){dat=num&0x80;num=num<<1;clk=0;for (i=0;i<20;i++) ;clk=1;for (i=0;i<30;i++) ;}}void display(uint i){ uchar j,k,n,p,x,y,m; //提取报警通道号和报警类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验6 AD转换器实验
配合教材p227-p233,根据虚拟实验的环境所提供的子程序
; ---------------------------
; 程序名称:ADC0832数据采集子程序
; 功能:采集ADC0832采集的数据
; 数据采集的结果存:20H
; 占用的寄存器:R5,A,CY
; ---------------------------
AD: MOV R5,#8
CLR CS
CLR CK1
SETB CK1
CLR CK1
SETB CK1
CLR CK1
CLR DO1
NOP
NOP
SETB CK1
NOP
NOP
CLR CK1
SETB DO1
NOP
NOP
SETB CK1
NOP
NOP
ADA: CLR CK1
MOV C,DO1
RLC A
SETB CK1
DJNZ R5,ADA
SETB CS
MOV 20H,A
RET
; ----------------------------
; 子程序名称:CAL_VOL
; 功能:将AD转换结果(已存放在20H中)处理成为带一位小数点的十进制数
; 入口:内部ram 20H-- 十六进制数
; 出口:V_1 (77H)--用于电压0.1位值的显示;V_10(76H)--用于电压个位值的显示;; 占用的寄存器:A,B
; ------------------------------------------------------------
CAL_VOL: MOV A,20H ;算法是:x*(5/256)*10=x*50/256/10
MOV B,#100 ;虚拟实验中ADC0832获取的值只有实际值的一半,只好乘2了
MUL AB
MOV A,B
MOV B,#10
DIV AB
MOV V_10,A
MOV V_1, B
RET
;*******************************************************
;这是一个用5个CD4094做的显示参考子程序
;在单片机Proteus的实验中可用此程序代替实验版中的LCD
;程序名:display
;功能:显示LED 的5位数字
;说明:所显示的数字个位~万位的内容存于RAM75~79H
;占用R0,R7,DPTR
;*******************************************************
DIN BIT P2.6
CLK BIT P2.7
STB BIT P2.3
DISPLAY:MOV R0,#75H
DP12: CLR STB
MOV R7,#8
MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
DP13: RLC A
MOV DIN,C
CLR CLK
SETB CLK
DJNZ R7,DP13
INC R0
CJNE R0,#7AH,DP12
SETB STB
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;0,1,2,3,4,5
DB 82H,0F8H,80H,90H,0FFH,9DH,0C6H;6,7,8,9,暗,u,C
DELAY: MOV R4,#10
L1: MOV R5,#0
L2: MOV R6,#0
L3: DJNZ R6,L3
DJNZ R5,L2
DJNZ R4,L1
RET。