微芯单片机AD转换程序
- 格式:docx
- 大小:12.70 KB
- 文档页数:3
中微单片机多通道adc程序
中微电子公司的单片机常用的多通道ADC程序可以使用它们的STM32系列单片机为例进行说明。
在STM32系列单片机中,多通道ADC程序通常涉及以下几个步骤:
1. 初始化ADC模块,首先需要初始化ADC模块,包括设置时钟、引脚配置、转换模式、采样时间等。
这些参数会影响ADC的精度和
采样速度。
2. 配置多通道,接下来需要配置ADC的多通道转换,即选择要
转换的通道和通道顺序。
在STM32中,可以通过设置SQR寄存器来
配置多通道转换的顺序。
3. 启动转换,配置完成后,可以启动ADC转换。
可以选择单次
转换模式或连续转换模式,根据应用需求来决定。
4. 读取转换结果,当转换完成后,可以从数据寄存器中读取转
换结果。
在多通道转换中,需要根据设置的转换顺序逐个读取各个
通道的转换结果。
5. 数据处理,最后,根据应用需求对转换结果进行处理,比如数据滤波、数据存储、数据传输等。
需要注意的是,不同型号的单片机可能会有不同的寄存器和配置方法,因此在编写多通道ADC程序时需要参考具体的芯片手册和相关资料。
以上是关于中微电子公司单片机多通道ADC程序的基本步骤,希望能对你有所帮助。
《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转换程序解析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转换程序的编写和调用方法,包括编程语言、寄存器的配置、数据的获取和处理等。
单片机adc流程
单片机ADC(模数转换器)是将模拟信号转换为数字信号的一种模块,其流程如下:
1.选择ADC通道:根据需要选择要输入的模拟信号通道,比如温度传感器、光敏电阻等。
2.设置ADC转换精度:根据需要选择转换精度,一般为8位、10位或12位。
3.启动ADC转换:将AD转换开始标志位设置为1,开始转换模拟信号为数字信号。
4.等待ADC转换完成:等待ADC转换完成,一般可以通过查询或中断方式来判断转换是否完成。
5.读取ADC转换结果:读取ADC转换结果,一般为一个数字,表示模拟信号的数字化值。
6.数据处理:将数字信号进行处理,比如进行数据滤波、校准、转换为实际物理量等。
7.输出结果:将处理后的结果输出到外部设备或显示屏上,供用户查看或使用。
以上就是单片机ADC的流程,通过这个流程可以将模拟信号转换为数字信号,并对其进行处理和输出,实现各种应用需求。
- 1 -。
AD转换实验、转换原理MSP430F149勺A/D转换器原理请参考相关书籍。
实验板上与AD相关的硬件电路:RV§10K----------J6P61SIP2A1)输入电路{设计主程序和中断服务程序。
二、转换程序1、程序 1:转换结果发送到 PC主程序中进行 A/D 初始化,中断服务程序读 A/D 转换结果,主程序中通过串口发送结果。
“”主程序与中断程序:/*********************************************************程序功能:将ADC 对端口电压的转换结果按转换数据和对应的模拟电压的形式通过串口发送到PC 机屏幕上显示通信格式: 9600测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据**********************************************************/ #include <> #include "" #include "" #include ""#define Num_of_Results 32 uint results[Num_of_Results]; // uint average; uchar tcnt = 0;主函数 ***********************/void main( void )保存ADC 转换结果的数组/***********************uchar i;uchar buffer[5];WDTCTL = WDTPW + WDTHOLD; // /* 下面六行程序关闭所有的IO 口*/P1DIR=0XFF;P1OUT = 0XFF;P2DIR= 0XFF;P2OUT = 0XFF;P3DIR= 0XFF;P3OUT = 0XFF;P4DIR= 0XFF;P4OUT = 0XFF;P5DIR= 0XFF;P5OUT = 0XFF;P6DIR= 0XFF;P6OUT = 0XFF;P6DIR |= BIT2;P6OUT |= BIT2; //P6DIR|=BIT6;P6OUT&=~BIT6; // InitUART();Init_ADC();_EINT();buffer[4] = '\0';while(1){LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The digital value is: ");PutString(buffer);关狗关闭电平转换关闭数码管显示Trans_val(average,buffer);buffer[3] = buffer[2];buffer[2] = buffer[1];buffer[1] = 0x2e - 0x30;for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The analog value is: ");PutString(buffer);}}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results)uchar i;{average = 0;for(i = 0; i < Num_of_Results; i++){average += results[i];}average >>= 5; // 除以32index = 0;tcnt++;if(tcnt == 250) // 主要是降低串口发送速度{LPM1_EXIT;tcnt = 0;}}}“” A/D 转换相关程序:#include <>typedef unsigned int uint;/********************************************函数名称:Init_ADC功能:初始化ADC参数:无返回值:无****************************************** void Init_ADC(void) {P6SEL |= 0x01; //ADC12CTL0 = ADC12ON+SHT0_15+MSC; // ADC12CTL1 = SHP+CONSEQ_2; // ADC12IE = 0x01; // ADC12CTL0 |= ENC; // ADC12CTL0 |= ADC12SC; // } /********************************************函数名称: Hex2Dec 功能:将16进制ADC 转换数据变换成十进制表示形式参数: Hex_Val--16 进制数据ptr--指向存放转换结果的指针返回值 :无 ********************************************/ void Hex2Dec(uint Hex_val,uchar *ptr) {ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100;ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10; ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10); } /*******************************************函数名称: Trans_val功 能:将16进制ADC 转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参 数: Hex_Val--16 进制数据 返回值 :无使能ADC 通道打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能转换 开始转换********************************************/void Trans_val(uint Hex_Val,uchar *ptr){unsigned long caltmp;uint Curr_Volt;uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; 〃Curr_Volt = caltmp / 25ptr[0] = Curr_Volt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“”串口程序:#include <>typedef unsigned char uchar;/*******************************************函数名称:InitUART功能:初始化UART端口参 数:无 返回值 :无********************************************/ void InitUART(void)ME1 |= URXE0 + UTXE0;// Enable USART0 T/RXDUCTL0 |= CHAR;// 8-bit characterUBR00 = 0x03; UBR10 = 0x00;// Initialize USART state machine/*******************************************函数名称: Send1Char 功 能:向 PC 机发送一个字符参数: sendchar-- 要发送的字符 返回值 :无********************************************/ void Send1Char(uchar sendchar)while (!(IFG1 & UTXIFG0)); // TXBUF0 = sendchar;'*****************************************函数名称: PutSting 功 能:向 PC 机发送字符串并换行指令 参数: ptr-- 指向发送字符串的指针返回值 :无********************************************/ void PutString(uchar *ptr)P3SEL |= 0x30;// ,5 = USART0 TXD/RXDUTCTL0 |= SSEL0; // UCLK = ACLK UMCTL0 = 0x4A;// Modulation// 32k/9600 - //UCTL0 &= ~SWRST; 等待发送寄存器为空{while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; // 发送换行指令}/*******************************************函数名称:PutSting0功能:向PC 机发送字符串,无换行参数:ptr-- 指向发送字符串的指针返回值:无********************************************/void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据2、程序2:转换结果显示在1602 显示模块上“”程序#include <>#include ""typedef unsigned char uchar;typedef unsigned int uint;**//************** 宏定义*************#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3;//RS =#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = #define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = #define SET_EN P6OUT|=BIT5;/*******************************************函数名称:DispNchar功能:让液晶从某个位置起连续显示N 个字符参数:x-- 位置的列坐标y-- 位置的行坐标n-- 字符个数ptr-- 指向字符存放位置的指针返回值:无****************************************** void DispNChar(uchar x,uchar y, uchar n,uchar *ptr){uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值:无******************************************void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; // 如果在第2 行temp |= 0x80;LcdWriteCommand(temp,1);} /******************************************* 函数名称:Disp1Char功能:在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功能:对1602 液晶模块进行复位操作参数:无返回值:无********************************************/ void LcdReset(void)DataDir = 0xFF; // LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms(); LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);}/*******************************************函数名称: LcdWriteCommand 功 能:向液晶模块写入命令参 数: cmd-- 命令,chk-- 是否判忙的标志,返回值 :无********************************************/void LcdWriteCommand(uchar cmd,uchar chk) {CtrlDir |= 0x07;// 控制线端口设为输出状态 数据端口设为输出状态 // 规定的复位操作// 显示模式设置 // 显示关闭 // 显示清屏 // 写字符时整体不移动 // 显示开,不开游标,不闪烁 1:判忙, 0:不判if (chk) WaitForEnable(); // 检测忙信号CLR_RS;CLR_RW;_NOP();DataPort = cmd; // 将命令字写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data-- 显示字符数据返回值:无********************************************/void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; // 将显示数据写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602 液晶完成内部操作参数:无返回值:无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态'*****************************************函数名称:Delay5ms功能:延时约5ms返回值:无******************************************** void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms功能:延时约400ms参数:无返回值:无******************************************** void Delay400ms(void){uchar i=50;uint j;while(i--)while(j--);}}“”程序#include <>#include ""typedef unsigned char uchar; typedef unsigned int uint;#define DataDir P2DIR #define DataPort P2OUT #define Busy 0x80#define CtrlDir P6DIR #define CLR_RSP6OUT&=~BIT3; //RS =#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5;//EN #define SET_EN P6OUT|=BIT5;*****************************************函数名称: DispNchar功 能:让液晶从某个位置起连续显示参 数: x-- 位置的列坐标 y-- 位置的行坐标 n--字符个数 ptr--指向字符存放位置的指针返回值 :无 ********************************************/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) ************ 宏定义 ************* N 个字符{uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值:无******************************************void LocateXY(uchar x,uchar y)uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; // 如果在第2 行temp |=0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功能:在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data) { LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功能:对1602 液晶模块进行复位操作参数:无返回值:无******************************************** void LcdReset(void){CtrlDir |= 0x07; //DataDir = 0xFF; //LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);}/******************************************* 函数名称:LcdWriteCommand 功能:向液晶模块写入命令参数:cmd-- 命令,chk-- 是否判忙的标志,返回值:无控制线端口设为输出状态数据端口设为输出状态// 规定的复位操作// 显示模式设置// 显示关闭// 显示清屏// 写字符时整体不移动// 显示开,不开游标,不闪烁1:判忙,0:不判******************************************void LcdWriteCommand(uchar cmd,uchar chk)if (chk) WaitForEnable(); // CLR_RS;CLR_RW;_NOP();SET_EN; // 产生使能脉冲信号 _NOP();_NOP();CLR_EN;/*******************************************函数名称: LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数: data-- 显示字符数据返回值 :无 ********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW;_NOP();检测忙信号DataPort = cmd;// _NOP();将命令字写入数据端口DataPort = data; // 将显示数据写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602 液晶完成内部操作参数:无返回值:无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW; _NOP();SET_EN;_NOP();_NOP();CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/******************************************* 函数名称:Delay5ms 功能:延时约5ms参数:无返回值:无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms 功能:延时约400ms参数:无返回值:无********************************************/ void Delay400ms(void) uchar i=50;uint j;while(i--){j=7269; while(j--);}}。
#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90 };sbit CLK=P3^6; //位定义AD芯片与单片机相应连接口,读取时钟口sbit DAT=P2^4; //读取数据口sbit CS=P2^5; //片选口uchar ADresult,flag;void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}display(uint num) //数据显示程序{P0=0xfe;P1=table[num/100];delay(1);P0=0xfd;P1=table[num0/10];delay(1);P0=0xfb;P1=table[num];delay(1);}uchar TLC549ADC() //AD转换子程序{uchar ADCdata;uchar i;CS=0; //置片选为低,选中、读取AD芯片转换结果for(i=0;i<8;i ) //依次移位读取AD转换8位数据{delay(1); //等待向DAT移送数据ADCdata<<=1; //ADCdata左移一位,即将最低位清零ADCdata|=DAT; //ADCdata与DAT相或,即将DAT加到ADCdata的最后一位中(DAT是0或者1)CLK=1;CLK=0; //以上两句产生一个时钟下降沿delay(1);}return (ADCdata); //将读取的转换结果返回}void main(){TLC549ADC();delay(10);while(1){if(flag==4) //判断flag是否等于20,如果等于20那么根据显示程序中的延时可算得延时时间至少为12delay(1),那么这时AD转换已经结束,可以读取转换结果ADresult=TLC549ADC();else //转换未完成则falg自加同时显示上一次的AD 转换结果{flag ;display(ADresult);}}}/*AD转换数据读取流程:片选信号置底,等待AD芯片确认片选信号,并将AD 转换结果最高位传送到数据口,此后每一个下降沿时钟到来时,AD芯片都会将下一位转换结果传送到数据口,当第七个下降沿到来后,AD转换的8位数据已全部发送完毕,这时再给一个下降沿,AD芯片进行下以一次AD转换。
ad转换程序(使⽤12c5a32s2)#include#include#define uint unsigned int#define uchar unsigned charunsigned char code disp_code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char code seg[] = {0,1,2,3,4,5,6,7};unsigned char ad_0;unsigned char a[20];unsigned char max;unsigned int m=0;unsigned int i,cnt;unsigned char shuju[2];//----------------独⽴波特率发⽣器相关寄存器-------------------sfr AURX =0x8e;sfr BRT =0x9c;//---------与STC12C5A32S2单⽚机ADC相关的寄存器声明------------------sfr P1ASF =0x9d; //P1⼝模数转换功能控制寄存器sfr ADC_CONTR =0xbc; //AD转换控制寄存器sfr ADC_RES =0xbd; //AD转换结果寄存器⾼sfr ADC_RESL =0xbe; //AD转换结果寄存器低sfr AURX1 =0xa2; //AD转换结果存储⽅式控制位//------------------------------------------------------------------//P1ASF寄存器:8位,对应P1⼝8根⼝线,⽤于指定哪根⼝线⽤作ADC功能//------------------------------------------------------------------#define ADC_POWER 0x80 //ADC电源开#define ADC_SPEED 0x60 //设为90个时钟周期ADC⼀次#define ADC_START 0x08 //ADC启动控制位设为开#define ADC_FLAG 0x10 //ADC结束标志位/*ADC_CONTR寄存器:ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_STAR CHS2 CHS1 CHS01 2 3 4 5 6 7 8第 1 位: =1 打开ADC电源;=0 关闭ADC电源; ADC前要⼀定要打开第2-3位: =1 1 90个时钟周期ADC⼀次; =1 0 180个时钟周期ADC⼀次;=0 1 360个时钟周期ADC⼀次; =0 0 540个时钟周期ADC⼀次;第4位: ADC结束标志位,每次ADC结束时⾃动=1,需要⽤软件清零才可以进⾏下⼀次ADC第5位: ADC启动控制位,置“1”则ADC转换开始,转换结束后为0第6-7-8位:ADC通道选择 000-->P1.0 ........111-->P1.7*///-------------------------------------------------------------void ADC_int(uchar n) //第n通道ADC初始化函数{n&=0x07; //确保n=0----7通道AURX1&=0x00; //转换结果存储格式:数据的⾼8位放ADC_RES,低2位放ADC_RESLP1ASF=1<}//---------------------------------------------------------------uint ADC_GET(unsigned char n) //第n通道ADC采样函数{unsigned int adc_data;n&=0x07; //确保n=0----7通道ADC_RES=0; //清零ADC_RESL=0; //清零ADC_CONTR=0; //清零,以便重构ADC_CONTR|=(ADC_POWER|ADC_SPEED|n|ADC_START); //打开AD转换电源、设定转换速度、设定通道号、AD转换开始_nop_();_nop_();_nop_();_nop_();_nop_(); //延时4个时钟周期左右while(!(ADC_CONTR&ADC_FLAG)); //等待转换结束 =0x10 ADC_FLAG位=1 adc_data=ADC_RES; //转换结果计算,取⾼8位结果ADC_CONTR&=~ADC_FLAG; //清零转换结束标志位(ADC_FLAG位=0) return adc_data; //返回ADC的值(0----1023)}/*------------------------------------------------发送⼀个字节------------------------------------------------*/void SendByte(unsigned char dat){SBUF = dat;while(!TI);TI = 0;}//==========延迟函数=========//void delayMs(unsigned int t){unsigned int j;while(t--){for(j=0;j<123;j++);}}void main(){SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收AURX = 0x11;//启动独⽴波特率发⽣器BRT = 0xfd;//设定波特率为9600TMOD|=0x11;//定时器设置TH0=0xf0;TL0=0xf0;TH1=0xff; //定时器2定时100us,晶振12MHzTL1=0x9c;IE=0x82;TR0=1;TR1=1;// TR1: timer 1 打开EA=1; //打开总中断P2=0x00;cnt = 0;delayMs(100);ADC_int(0); //ADC通道0初始化ADC_int(1); //ADC通道1初始化}void tim0(void) interrupt 1 using 1//定时器0中断,⽤于数码管扫描{TH0=0xf0;//定时器重装值TL0=0xf0;cnt++;if(cnt==1){P2=0;P0=disp_code[shuju[1]];}if(cnt==2){P2=1;P0=disp_code[shuju[0]];cnt=0;}}void tim1(void) interrupt 3 using 1 //定时器1中断,⽤于AD转换{TH1=0xff;TL1=0x9c;ad_0=(char)ADC_GET(1); //第0通道进⾏ADC采样SendByte(ad_0);a[m]=ad_0;m++;if(m==20){m=0;max=0;for(i=0;i<20;i++)if(a[i]>max) max=a[i];SendByte(0xff);SendByte(0xff);SendByte(max);shuju[0]=max%16;shuju[1]=max/16;}}。