STC系列单片机内部AD的应用

合集下载

关于STC15F2K60S2的AD应用

关于STC15F2K60S2的AD应用

STC15F2K60S2芯片A/D转换器的应用1.目的在工业控制过程中,它是控制系统与微机之间不可缺少的接口方式。

要实现自动控制,就要检测有关参数,A/D转换器,把检测到的电压或电流信号(模拟量)转换成计算机能够识别的等效数字量,这些数字量经过计算机处理后输出结果,通过D/A转换器变为电压或电流信号,送到执行机构,达到控制某种过程的目的。

2.与A/D转换相关的寄存器STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到300KHz(30万次/秒)。

8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。

上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D装换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。

需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。

P1ASF寄存器的格式如下:2.2. ADC_CONTRADC_CONTR寄存器的格式如下:语句。

ADC_POWER:ADC电源控制位。

0:关闭ADC电源;1:打开A/D转换器电源。

建议进入空闲模式和掉电模式前,将ADC电源关闭,即ADC_POWER = 0,可降低功耗。

启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。

初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。

建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D转换,如能将定时器/串行口/中断系统关闭更好。

由软件清0。

不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D 转换是否结束,当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。

ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0。

stc单片机内部adc采样原理及c语言

stc单片机内部adc采样原理及c语言

一、STC单片机内部ADC采样原理STC单片机是一种常用的嵌入式控制器,而ADC即模数转换器,是用于将模拟信号转换成数字信号的重要电子元件。

STC单片机内部ADC 采样原理是指在STC单片机中内置的ADC模块如何实现对模拟信号的采样和转换。

1. ADC的基本原理ADC的基本原理是将模拟信号按一定的时间间隔进行采样,然后将这些采样值转换成数字信号。

在STC单片机中,内部ADC采样原理遵循这一基本原理。

2. 采样电路STC单片机内部ADC采样电路包括采样保持电路、模拟开关电路和模拟比较器电路。

采样保持电路用于在采样过程中保持模拟信号的稳定,模拟开关电路用于控制模拟信号的模拟开关,模拟比较器电路用于将模拟信号转换成数字信号。

3. 采样精度STC单片机内部ADC采样精度通常取决于其ADC模块的位数,不同型号的STC单片机内部ADC模块位数不同,一般有8位、10位、12位等。

采样精度越高,转换得到的数字信号就越精准。

4. 采样速率STC单片机内部ADC模块的采样速率指的是它每秒钟能够进行的采样次数。

采样速率越高,能够实时捕捉到信号的变化,但也会增加系统的负荷。

5. 采样触发方式STC单片机内部ADC有自动触发采样和手动触发采样两种方式。

自动触发采样是指ADC模块在接收到一定触发条件后自动开始采样,而手动触发采样则需要在程序中通过相应的指令手动触发ADC模块进行采样。

二、C语言在STC单片机内部ADC采样中的应用C语言作为一种高级程序设计语言,在STC单片机内部ADC采样中扮演着重要的角色,通过编写相应的C语言程序,可以实现对STC单片机内部ADC模块的配置和使用。

1. ADC配置在C语言中,可以通过对STC单片机内部寄存器的操作来配置ADC 模块的工作参数,包括采样精度、采样速率、采样触发方式等。

2. 采样程序编写C语言可以通过读取ADC模块的寄存器来获取采样值,然后根据需要进行相应的处理,例如计算电压值、控制外设等。

STC12C5A60S2中的AD转换

STC12C5A60S2中的AD转换

STC12C5A60S2中的AD转换逐次逼近原理AD 里面包含da,当输入电压Vin时,da的最高位是1,即为0.5Vref与输入信号比较,如果输入大于0.5Vref则比较器输出为1,同时da的最高位为1,反之DA最高位则为0,通过8次比较后得到8个01数据即完成ad转换。

现在说下程序中用到stc12单片机两个寄存器ADC_CONTR;主要用来配置ad启动的工作模式;还有个result的寄存器程序中的注意点:配置完ADC_CONTR后要延时4个时钟周期先把程序附上#include &quot;stc12.h&quot;#include &quot;intrins.h&quot;#include &quot;ad.h&quot;uint ad;#define ADC_POWER 0X80 //ADC最高位给adc部分供电,类似于片选#define ADC_START 0X08 //模数转换启动控制位#define ADC_FLAG 0x10 //ad转换需要时间,这个是转换完成标志位#define ADC_SPEEDLL 0X00 //540 clock#define ADC_SPEEDL 0X20 //360 clock#define ADC_SPEEDH 0X40 //180 clock#define ADC_SPEEDHH 0X60 //90 clockuchar ADCresult(uchar aa) //这里的参数是哪个口来ad转换{P1ASF=0X01; //这里的选择和用哪一个P1口作为ad采样ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|aa;//ADC_CONTR=0X88|aa;_nop_();_nop_();_nop_();_nop_();//设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器while (!(ADC_CONTR & ADC_FLAG)); //等待ADC_CONTR,这里的ADC_FLAG相当于一个常数,不是寄存器里面的某个位//while(!ADC_FLAG);//ADC_FLAG=0;ADC_CONTR &= ~ADC_FLAG; //Close ADC 将标志位清零等待下次硬件置1ad=(ADC_RES<<2)+ADC_RESL; //打开10位AD采集功能如果用8位AD 屏掉这句把下一句改为Vo=(float)(ADC_RESL)*500/256; 即可//ADC_RES结果寄存器的高2位;ADC_RES结果寄存器的低8位ad=(float)(ad)*5*100/1024; //Return ADCresult(为显示整数,这里将电压值扩大了十倍)//10位AD采集即2的10次方满值为1024 这里用1024表示5伏的电压//那么用采集到的数量值除以1024 在乘以5 得到的值就是采集的电压数值//这里又*100 是为了扩大100倍显示小数位//ADC_RES*(5/256)为采集的电压值然后扩大10倍便于计算return ad;}这里只是个ad.c源文件,这里有几个问题想说一下1.怎么知道是10位还是8位的ad结果;你可以在ADCresult(uchar aa)最前面加一条AUXR1&=0x04;什么意思呢,转换结果的低2位放在ADC_RES,高8位ADC_RESL 中2为什么不用//while(!ADC_FLAG);//ADC_FLAG=0;这两条因为ADC_FLAG相当于常量前面用宏定义而头文件里只有ADC_CONTR的地址映射;但是如果在头文件中用sbit ADC_FLAG=ADC_CONTR^4会出现错误,具体原因还不清楚先说到这吧。

STC12C5A60S2的ADC PWM功能

STC12C5A60S2的ADC PWM功能

STC12C5A60S2的ADC+PWM功能STC12C5A60S2单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到250 KHz(25万次/秒)。

脉宽调制(PWM)是一种使用程序来控制波形占空比、周期、相位波形的技术。

STC12C5A60S2单片机的PAC模块可以通过程序设定,使其工作于8位PWM模式。

下面是一段将ADC和PWM结合起来应用的程序:/************************************************ ***************时间:2012.12.1晶振:12MHz功能描述:AD采集电位器的电压信号,然后信号以PWM 信号输出控制LED的亮度(调节电位器)当电位器两端的电压大时,LED较亮,同时用1602显示采集的电压值AD采集通道:P1.0PWM输出: P1.3************************************************* **************/#include;#include;unsigned int result,ge,shifen,baifen;unsigned charseg[10]={'0','1','2','3','4','5','6','7','8','9'} ;//要显示字符sbit RS = P2^4; //命令数据sbit RW = P2^5; //写还是读sbit EN = P2^6; //使能端#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------* /void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------* /void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------* /bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------* /void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------* /void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------* /void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s){{LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------* /void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data){{LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------LCD初始化函数------------------------------------------------* /void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/ }/*------------------------------------------------ADC初始化函数------------------------------------------------* /void InitADC(){P1ASF =0x01;//使能P1口ADC功能ADC_RES = 0;ADC_CONTR = 0xc8;}/*------------------------------------------------主函数------------------------------------------------* /void main(void){LCD_Init();LCD_Clear();//清屏LCD_Write_String(5,0,&quot;526lab&quot;);//(列,行,数据)LCD_Write_String(2,1,&quot;Result:&quot;); InitADC();IE=0xa0;//开中断while (1){//PWM初始化CCON=0;CMOD=0;//1MCCAP0H=CCAP0L=ADC_RES;CCAPM0=0x42;//开启PWMCR=1;//计时开始//调用显示LCD_Write_Char(9,1,seg[ge]);LCD_Write_Char(10,1,'.');LCD_Write_Char(11,1,seg[shifen]);LCD_Write_Char(12,1,seg[baifen]);LCD_Write_Char(13,1,'V');}}/*------------------------------------------------ADC中断处理函数------------------------------------------------* /void adc_isr() interrupt 5 using 1{unsigned int temp;temp=ADC_RES;result=temp*0.01953125*1000;ge=result/1000;shifen=result%1000/100;baifen=result%100/10;ADC_CONTR = 0xc8;//开启转换}12C5A60S2.h的头文件//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机内核特殊功能寄存器 C51 Core SFRs// 7 6 5 4 3 2 1 0Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000 /*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1//-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。

STC15单片机内部ADC采集数据在LCD12864上显示的程序

STC15单片机内部ADC采集数据在LCD12864上显示的程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(1),STC8A系列可参考STC15单片机内部ADC采集数据在LCD12864上显示的程序main主程序:#include "LCD12864.h"void ValToString(unsigned int tmp,unsigned char *buf);int main(){unsigned int tmp;unsigned char buf[4];P2M1 &= 0xE5;P2M0 &= 0xE5;// P1M1 &= 0x7F;P1M0 &= 0x7F;SPI_config();SPI_init();ADC_init();//delay(10);LCD12864_write1(0,0,5,"test:");LCD12864_write2(0,1,"hello!");while(1){tmp = ADC_getvalue();ValToString(tmp,buf);LCD12864_write1(0,2,sizeof(buf),buf);LCD12864_write2(0,3,buf);//delay(5000);}}void ValToString(unsigned int tmp,unsigned char *buf) {buf[0] = tmp/100 + '0';buf[1] =(tmp%100)/10 + '0';buf[2] = (tmp/10)%10 + '0';buf[3] = '\0';}/*******************************************************/LCD12864程序:#include"LCD12864.h"sbit SPI_cs = P2^4;void delay(unsigned int ms){unsigned int i;do{i = MAIN_Fosc / 13000;while(--i) ; //14T per loop}while(--ms);}//void delay(unsigned int t)//{// unsigned int i,j;// for(i=0; i<t; i++)// for(j=0; j<10; j++);//}void SPI_config(){SPCTL = 0x00;SPCTL |= 0xD0;SPSTAT |= 0xC0;IE2 &= 0xFD;AUXR1 &= 0xF7;AUXR1 |= 0x04;// AUXR1|=0X04; //½« SPI µ÷Õûµ½ P2.1 P2.2 P2.3 P2.4// AUXR1&=0XF7;// SPDAT = 0;// SPSTAT = 0x80|0x40; //Çå³ýSPI״̬λ// SPCTL = 0x40|0x10|0x80;}unsigned char SPI_write(unsigned char dat){SPDAT = dat;while(!(SPSTAT&0x80));SPSTAT = 0xC0;//SPSTAT = 0x80|0x40;return SPDAT;}void SPI_wcmd(unsigned char cmd){SPI_cs = 1;SPI_write(0xF8);SPI_write(cmd&0xF0);SPI_write((cmd&0x0F)<<4);//SPI_write((cmd<<4)&0xF0);delay(2);}void SPI_wdat(unsigned char dat){SPI_cs = 1;SPI_write(0xFA);SPI_write(dat&0xF0);SPI_write((dat&0x0F)<<4);//SPI_write((dat<<4)&0xF0);delay(2);}void LCD12864_write1(unsigned char x,unsigned char y,unsigned char len,unsigned char *buf){//SPI_wcmd(0x03);switch(y){case 0:x=x+0x80;break;case 1:x=x+0x90;break;case 2:x=x+0x88;break;case 3:x=x+0x98;break;default:break;}SPI_wcmd(x);while(len>0){SPI_wdat(*buf++);len--;}}void LCD12864_write2(unsigned char x,unsigned char y,unsigned char *buf){switch(y){case 0:x=x+0x80;break;case 1:x=x+0x90;break;case 2:x=x+0x88;break;case 3:x=x+0x98;break;default:break;}SPI_wcmd(x);while(*buf!='\0')//while(*buf>0){SPI_wdat(*buf++);//delay(50);}}void SPI_init(){//delay(100);SPI_wcmd(0x30);//delay(50);SPI_wcmd(0x0C);//delay(50);}//void display(unsigned char code *buf) //{// while(*buf>0)// {// SPI_wdat(*buf);// buf++;// delay(50);// }//}//void LCD12864_write2()//{// SPI_wcmd(0x03);// delay(50);//// SPI_wcmd(0x91);// display("ÎÒÊÇÈË");//}/*******************************************************/ADC程序:#include "LCD12864.h"unsigned int ADC_getvalue(){unsigned int val;ADC_CONTR |= 0xE7;//val = ADC_RES << 8;val = val | ADC_RESL;ADC_CONTR |= 0x08;//return val;}void ADC_init(){ADC_CONTR &= 0xEF; //0b 1 11 0 1 111;ADC_CONTR |= 0xE7;delay(10);P1ASF |= 0x80;CLK_DIV |= 0x20;EADC = 0;ADC_CONTR |= 0x08;}/*******************************************************/.h文件程序://1#ifndef _ADC_H#define _ADC_Hextern void ADC_init();extern unsigned int ADC_getvalue();#endif//2#ifndef _LCD12864_H#define _LCD12864_H#define MAIN_Fosc 11059200L#include "STC15.H"#include "intrins.h"#include "ADC.h"//sbit SPI_sid = P2^3;//sbit SPI_clk = P2^1;extern void SPI_config();extern void delay(unsigned int ms);extern void SPI_init();extern void LCD12864_write1(unsigned char x,unsigned chary,unsigned char len,unsigned char *buf);extern void LCD12864_write2(unsigned char x,unsigned char y,unsigned char *buf);//extern void LCD12864_write2();#endif。

STC12C5A60S2单片机的AD转换

STC12C5A60S2单片机的AD转换
=OxBE;//AD转换结果寄存器低
Sfr
P1ASF
=0x9D;//Pl口模拟转换功能控制寄存器
Sfr
AURX1
=0xA2;//AD转换结果存储方式控制位
#define
ADC_POWER
0x80
//ADC电源开
#define
ADC_FLAG
0x10
//ADC结束标志位
#define
ADC_START
A/D转换测试程序(ADC查询方式)
#include""〃头文件在STC公司主页上下载
#includenn
〃与STC12C5A60S2单片机ADC相关的寄存器说明〃
Sfr
ADC_CONTR
=OxBC;//AD转换控制寄存器
Sfr
ADC_RES
=0xBD;//AD转换结果寄存器高
Sfr
ADC_RESL
return adc_data;???〃返回ADC的值
float AD_work(unsigned char n)
{ _
float AD_val;〃定义处理后的数值AD_val为浮点数unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(n);//转换100次求平均值(提高精度)
ad转换结果存储方式控制位defineadcpower0x80adc电源开defineadcflag0x10adc结束标志位defineadcstart0x08adc启动控制位设为开defineadcspeedll0x00设为540个时钟周期adc一次defineadcspeedl0x20设为360个时钟周期adc一次defineadcspeedh0x40设为180个时钟周期adcdefineadcspeedhh0x60设为90个时钟周期adcvoidadjnitvoid

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用STC单片机AD转换及EEPROM使用随着各种电子设备的普及,信号处理的重要性日益凸显。

而一款好的ADC (Analog to Digital Convertor) 和一个高效的存储平台EEPROM (Electrically Erasable Programmable Read-Only Memory) 就成为建立可靠稳定的信号处理系统的重要组成部分。

本文将讨论STC单片机如何进行AD转换及EEPROM的使用。

首先,AD转换是将模拟信号转换成数字量的过程,是建立信号处理系统的关键步骤之一。

STC单片机内置了一个12位的AD转换器,也就是说,它可以将模拟信号转换成一个12位的数字信号,这是非常精确的。

下面我们来看看如何在代码中使用AD转换。

AD转换的原理很简单,即将待转换的模拟信号输入到AD口,接着启动AD转换。

当转换结束后,检测转换结束标志位,然后将转换结果读出。

这里具体介绍一下代码的实现方法。

首先,需要定义AD口的引脚、参考电压及转换效率等参数。

代码如下:#define ADC_PIN 0x01 //定义AD口所连接的引脚为P1.1#define ADC_REF 0x80 //定义参考电压为内部参考电压#define ADC_MODE 0xC0 //定义转换效率为最快接着,需要配置AD口所连接的引脚,使其成为输入口。

代码如下:P1ASF = 0x02; //定义P1.1为AD口输入接下来,启动AD转换,等待转换结束标志位的出现。

代码如下:ADC_CONTR = ADC_REF | ADC_MODE | ADC_PIN; //配置AD口ADC_CONTR |= 0x08; //启动AD转换while (!(ADC_CONTR & 0x20)); //等待转换结束标志位最后,将AD转换结果读出。

代码如下:uint16_t value;value = ADC_RES;value |= ADC_RESL << 8;我们可以看到,在STC单片机中使用AD转换非常方便,只需要简单的几行代码就可以完成。

单片机内部AD的用法

单片机内部AD的用法

STC系列单片机内部AD的应用作者:郭天祥来源:原创更新时间:2008-11-27 22:16:38 浏览次数:11438STC89LE52AD、54AD、58AD、516AD这几款89系列的STC单片机内部自带有8路8位的AD转换器,分布在P1口的8位上,当时钟在40MHz以下时,每17个机器周期可完成一次AD转换。

与AD相关的几个寄存器如表1所示。

表1 STC89系列单片机AD相关寄存器P1_ADC_EN:P1.X口的AD使能寄存器。

相应位设置为“1”时,对应的P1. X口作为AD转换使用,内部上拉电阻自动断开。

ADC_CONTR:AD 转换控制寄存器。

ADC_START:AD转换启动控制位,设置为“1”时,AD开始转换。

ADC_FLAG:AD转换结束标志位,当AD转换完成后,ADC_FLAG=1。

CHS2、CHS1、CHS0:为模拟输入通道选择,如表2所示。

表2 STC89系列单片机AD模拟通道选择设置ADC_DATA:AD 转换结果寄存器。

模拟/数字转换结果计算公式如下:结果=256×Vin / VccVin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。

下面一个例程演示STC89LE516AD/X2系列单片机的A/D转换功能。

时钟11.0592MHz,转换结果以16进制形式输出到串行口,可以用串行口调试程序观察输出结果。

(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。

新建文件part3.4.5.c,程序代码如下:#include <reg52.H>#include <intrins.H>// 定义与ADC 有关的特殊功能寄存器sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器sfr ADC_DATA = 0xC6; //A/D转换结果寄存器typedef unsigned char INT8U;typedef unsigned int INT16U;void delay(INT8U delay_time) // 延时函数{INT8U n;INT16U m;for (n=0;n<delay_time;n++){for(m=0;m<10000;m++);}}void initiate_RS232(void) //串口初始化{ES = 0; // 禁止串口中断SCON = 0x50; // 0101,0000 8 位数据位,无奇偶校验T2CON = 0x34; // 0011,0100,由T2 作为波特率发生器RCAP2H = 0xFF; // 时钟11.0592MHz, 9600 波特率RCAP2L = 0xDB;ES = 1; // 允许串口中断}void Send_Byte(INT8U one_byte) // 发送一个字节{TI = 0; // 清零串口发送中断标志SBUF = one_byte;while (TI == 0);TI = 0; // 清零串口发送中断标志}INT8U get_AD_result(INT8U channel){INT8U AD_finished = 0; // 存储A/D 转换标志ADC_DATA = 0;ADC_CONTR = channel; // 选择A/D 当前通道delay(1); //使输入电压达到稳定ADC_CONTR |= 0x08; //0000,1000 令ADC_START = 1, 启动A/D 转换AD_finished = 0;while ( AD_finished == 0 ) // 等待A/D 转换结束{AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1测试A/D转换结束否}ADC_CONTR &= 0xF7; //1111,0111 令ADC_START = 0, 关闭A/D 转换,return (ADC_DATA); // 返回A/D 转换结果}void main(){initiate_RS232();P1 = P1 | 0x63; // 0110,0011,要设置为A/D 转换的P1.x 口,先设为高P1_ADC_EN = 0x63; //0110,0011, P1 的P1.0,P1.1,P1.5,P1.6 设置为A/D 转换输入脚// 断开P1.0,P1.1,P1.5,P1.6 内部上拉电阻while(1){Send_Byte(get_AD_result(0)); //P1.0 为A/D 当前通道, 测量并发送结果delay(0x200);Send_Byte(get_AD_result(1)); //P1.1 为A/D 当前通道, 测量并发送结果delay(0x200);Send_Byte(get_AD_result(5)); //P1.5 为A/D 当前通道, 测量并发送结果delay(0x200);Send_Byte(get_AD_result(6)); //P1.6 为A/D 当前通道, 测量并发送结果delay(0x200);Send_Byte(0); // 连续发送4 个00H, 便于观察输出显示Send_Byte(0);Send_Byte(0);Send_Byte(0);delay(0x200); // 延时delay(0x200);delay(0x200);delay(0x200);delay(0x200);delay(0x200);}}知识点:typedef与#define的区别typedef:类型定义,其功能是用户为已有数据类型取“别名”。

stc单片机ad温度转换计算

stc单片机ad温度转换计算

STC单片机AD温度转换计算一、概述STC单片机是一种常用的嵌入式微控制器,广泛应用于各种电子设备中。

其中,采集温度传感器的数据是STC单片机的常见应用之一。

本文将介绍如何利用STC单片机的AD转换功能,实现温度数据的采集和计算。

二、AD转换原理1. STC单片机内部的AD转换器是一种10位逐次逼近式AD转换器,可以将模拟信号转换为数字信号。

2. 要进行温度转换,需要先连接温度传感器到STC单片机的AD输入引脚,并将相应的引脚配置为输入模式。

3. 通过编程,设置AD转换器的工作模式、参考电压和时钟频率等参数,以确保AD转换的准确性和稳定性。

三、温度传感器的接入1. 常用的温度传感器有NTC热敏电阻、DS18B20数字温度传感器等。

这些传感器可以通过一定的电路连接到STC单片机的AD输入引脚。

2. 在连接时,需要考虑传感器的电气特性,如输入电压范围、输出信号类型等,以确保传感器与单片机的兼容性。

3. 另外,还需要考虑传感器的精度、响应时间和稳定性等性能指标,以选择合适的传感器用于温度测量。

四、温度转换计算1. 获取AD转换后的数字数据后,需要利用一定的算法将其转换为实际的温度数值。

2. 对于NTC热敏电阻传感器,可以利用斯特林公式和双参数B25/85值来计算温度。

3. 而对于DS18B20数字温度传感器,可以直接从AD转换的数字值中得到温度数据。

4. 在计算过程中需要考虑温度传感器的特性曲线、环境温度补偿等因素,以提高温度测量的准确性和可靠性。

五、温度数据的处理与显示1. 获取到温度数据后,可以进行一定的数据处理和滤波,以消除测量中的噪声和干扰。

2. 可以通过串口通信或LCD显示屏等外设,将温度数据实时显示出来,以方便用户对温度进行监测和控制。

3. 另外,还可以将温度数据存储到EEPROM或外部存储器中,以便后续的数据分析和应用。

六、实验验证1. 为了验证温度转换计算的准确性,可以进行一定的实验验证。

STC单片机AD转换及EEPROM使用

STC单片机AD转换及EEPROM使用

a a tv i s i ht g o ED ” c m b l l he t ou h sa d p o l ms" e a e c nf t d w ih i h r c s fd i d p i e b a —l g i fL n o i ̄ ] t h g t n r b e ig v r o r v on e t n t e p o e so o ng【L e i n, em a e p s ln r )1 d s r g w kea d e un l a y md p o e i o t n1 i l s srl tle n he a p i a i n m e h so r b nt he P  ̄ p e , tt t sa d t p l to t od ft AD nv re l h c C r c he Co e t ra l t e EEP O M CU TC t h e e e t o s n e d R on M ofS wih t e r f r n t o l e p e e fa tce r t n b h re p rs ic so i l sw i e y ot e x e t r t Th ri l h l p o i e s l e p t he f l e a t e s al r v d on e h l o t } owi e e r he ・ c il ng r s a c s
关键 词 :T S C单 片机 AD 换 E P 转 E ROM 中图分 类号 : P 1 . T 36 2 文献标识 码 : A 文章编 号 : 0 79 1 ( 0 j 90 6 —3 1 0 — 4 62  ̄ ) — 19 0 0
The us e of
c onve t r and EEPROM re

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示

STC单片机内部ADC采集电压用数码管显示STC单片机内部ADC采集电压用数码管显示/////////////////////////////////////////////////////////////////// /////////////////////////////////// ///特点:/// ///1、数码管显示用中断方式/// ///2、STC12C5A60S2内ADC采样电压值,先采样30次然后去掉上下10个再取平均值/// ///3、采集数据用串口发送到PC /// ///------------------------------------------------------------------------shenzhen---iqss----2011/02/23--------/////////////////////////////////////////////////////////////////////////// //////////////////////////////#include#define uchar unsigned char#define uint unsigned int#define segp P0#define scanp P2uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //不带点段驱动信号uchar code tab_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带点段驱动uchar code scan[]={0xfe,0xfd,0xfb,0xf7}; //位扫描驱动信号uint display[4]={0,0,0,0}; //初始显示数字uint con=0, _data=0,data2=0; //con显示循环变量_data为ADC采样值临时变量data显示数据临时变量sfr P1ASF=0x9d; //下面五行为ADC定义sfr ADC_CONTR=0xbc;sfr ADC_RES=0xbd;sfr ADC_RESL=0xbe;sfr AUXR1=0xa2;void t0_t1_init(); //t0显示扫描定时器和t1串口比特率定时器初始化函数void adc_init(); //adc初始化函数void uart_out(uchar byte); //串口发送字节函数uint average(uint buffer[30]); //采样数据处理函数void AD(); //电压采样30次函数void delay1ms(uchar x); //延时函数void main(){t0_t1_init();adc_init();while(1){AD();}}/////////定时器初始化///////void t0_t1_init(){ SCON=0x50;PCON=0;TMOD=0x21;TH1=TL1=0xe6;TH0=0xf0;TL0=0x60;EA=ET0=1;// ES=1;TR1=1;TR0=1;}/////ADC初始化///////void adc_init(){ P1ASF=0x01; //启动P10为ADC模拟输入口把内部上拉电阻断开AUXR1 &= 0xfb; //adrj_0 高8位在ADC_RESADC_RES=0; //初值ADC_CONTR=0x80; //开启ADC电源SPEED_1_1,chs000(选择AD采样通道p10) delay1ms(2);// IE|=0xa0;}//////采集30次电压值//////void AD(){ char i;uint temp_buf[30]={0};for(i=0;i<30;i++){ ADC_CONTR |=0x08; //开启转换while((ADC_CONTR&0x10)==0);ADC_CONTR &=0xe7; //清除标志temp_buf[i]=ADC_RES; //取出数值到temp_buf}_data=average(temp_buf); //采样30次后的数据代入处理函数处理后返回处理后的数值,给下面用串口发送出去uart_out(_data);}/////先对整个数组的三十个值进行从小到大的排列,/////////再去掉最大5个和最少5个再求平均值;函数返回temp值/// uint average(uint buffer[30]){uchar i,j;uint temp;for(i=1; i<30; i++)for(j=29; j>=i; --j){if(buffer[j-1] > buffer[j]){temp = buffer[j-1];buffer[j-1] = buffer[j];buffer[j] = temp;}}temp = 0;for(i=5; i<25; i++){temp += buffer[i];}temp = (uint)(((float)temp) / 20 + 0.5);return(temp);}///显示数据处理及扫描显示中断服务函数//// void t0_4ms(void) interrupt 1{data2=_data;data2=_data*19.53;display[3]=tab_d[data2/1000];display[2]=tab[(data2/100)%10];display[1]=tab[(data2/10)%10];display[0]=tab[data2%10];TH0=0xf0;TL0=0x60;if(++con==5) con=1;// segp=0xff;segp=display[con-1];scanp=scan[con-1];}///串口发送节字函数//// void uart_out(uchar byte) { SBUF=byte;while(TI==0);TI=0;}///1ms延时////void delay1ms(uchar x) { uchar i,j;for(i=0;i<x;i++)< p=""> for(j=0;j<250;j++); }</x;i++)<>。

STC单片机8路AD及串口数据传送

STC单片机8路AD及串口数据传送
uchar data3[2]={0};
void main()
{
ADC_CONTR=ADC_CONTR|0x80;// 打开AD转换电源
P1ASF=0x00;//设置p1.2为模拟功能
ADC_CONTR=ADC_Power_On_Speed_Channe1_0;//设置p1.2为ad转换通道
while( !(ADC_CONTR&&0x10))
{
display();
}
display();
ADC_CONTR=ADC_CONTR&0xEF;
ADC_Channe1_0_Result=ADC_RES;
x1=(int)(5*ADC_Channe1_0_Result/256);
}
void UART_SER(void) interrupt 4
{
if(RI)
{
ES=0;
RI=0;
P0=~P0;
// P1=~P1;
//temp=SBUF;
ES=1;
}
if(TI)
{
TI=0;
//P0=~P0;
//P1=~P1;
Addr=255;
AddrLinshi=0;
Байду номын сангаас
}
CMyView::~CMyView()
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying

关于STC15F2K60S2的AD应用

关于STC15F2K60S2的AD应用

Mnemonic Add
Name
B7
B6 B5 B4 B3 B2
B1
B0
ADC_RE S
A/D 转换结 BDh 果寄存器

ADC_RE S
A/D 转换结 BDh 果寄存器

CLK_DIV 97H
时钟分频 寄存器
MCKO_ MCK S1 O_S0
ADRJ
Tx_R x
TX2_ Rx2
CLKS2
CLKS1
CLKS0
2.4.A/D 转换结果寄存器 ADC_RES、ADC_RESL
特殊功能寄存器 ADC_RES 和 ADC_RESL 寄存器用于保存 A/D 转换结果,其格式如下: AUXRI 寄存器的 ADRJ 位是 A/D 转换结果寄存器(ADC_RES、ADC_RESL)的数据 格式调整控制位。
当 ADRJ = 0 时,10 位 A/D 转换结果的高 8 位存放在 ADC_RES 中,低 2 位存放在 ADC_RESL 的低 2 位中。
2.与 A/D 转换相关的寄存器
与 STC15 系列单片机 A/D 转换相关的寄存器列于下表所示。
符号
描述
地址 MSB
位地址及其符号
复位值 LSB
P1AS F
P1 Analog Function Configure register
9DH
P17ASF
P16AS F
P15AS F
P14 AS F
P13 AS F
3.A/D 转换器的结构
4.程序 /****************************************************/ //利用 STC12C5A60S2AD 转换,实现温度计 //函数名:main.c /****************************************************/ #include<reg51.h> #include"10bit_adc.c" #define uchar unsigned char /*宏定义用 uchar 代替 unsigned char*/ #define uint unsigned int /*宏定义用 uint 代替 unsigned int*/

stc15单片机ad转换汇编程序

stc15单片机ad转换汇编程序

STC15单片机AD转换汇编程序一、引言在嵌入式系统开发中,AD(模数转换)是非常重要且常用的功能之一。

STC15单片机作为一种广泛应用的单片机,其AD转换功能也备受关注。

本文将针对STC15单片机的AD转换功能,深度探讨其汇编程序实现的方法和技巧。

二、STC15单片机AD转换的基本原理STC15单片机通过内部的AD转换模块,可以将模拟信号转换为数字信号,从而方便处理和分析。

其AD转换的基本原理是通过采样保持电路对模拟信号进行采样,然后将其转换为相应的数字量。

在具体的汇编程序中,需要考虑输入端口的设置、参考电压的选取和AD转换开始命令的下发等问题。

三、STC15单片机AD转换的汇编程序实现方法1. 设置输入端口和参考电压在写汇编程序之前,首先需要设置好输入端口和参考电压。

对于STC15单片机,可以通过相应的寄存器设置来实现。

需要注意的是,输入端口的选择和参考电压的设置将直接影响到AD转换的准确性和稳定性,因此需要认真考虑并进行合理设置。

2. 编写AD转换子程序在编写AD转换子程序时,需要考虑如何进行AD采样和转换、如何获得转换结果、以及如何处理转换结果等问题。

在采样转换时,需要注意采样保持电路的作用和AD转换的时钟周期。

获取转换结果后,还需要进行相应的处理,如数据的清洗、分析和存储等。

3. 主程序中调用AD转换子程序在主程序中调用AD转换子程序时,需要注意时序合理性和程序流程的清晰性。

还需要考虑如何根据转换结果进行相应的控制和应用,从而充分发挥AD转换的作用。

四、结论STC15单片机的AD转换功能在实际应用中具有重要意义,通过合理的汇编程序实现,可以充分发挥其优势并应用于各种领域。

熟练掌握AD转换的实现方法和技巧,对于嵌入式系统开发工程师来说是非常必要的。

希望本文的探讨能够对读者有所帮助。

个人观点和理解在实际的嵌入式系统开发中,AD转换是一个常见但又比较复杂的功能模块之一。

通过学习和实践,我深切体会到了AD转换在数据采集、传感器应用等方面的重要性。

STC12C5A60S2单片机实现AD采样并液晶显示

STC12C5A60S2单片机实现AD采样并液晶显示

STC12C5A60S2单片机实现AD采样并液晶显示STC12C5A60S2是一款高性能、低功耗的8051内核单片机。

以下是一种基于该单片机进行AD采样并液晶显示的实现方案。

请注意,由于字数限制,以下内容是基本的框架和步骤,具体细节还需要根据具体需求进行调整。

1.准备材料和设备:-STC12C5A60S2单片机主控板-16x2液晶显示屏-AD转换器(例如MCP3008)-电压传感器模块-连接线、电阻、电容等2.连接硬件:-将液晶显示屏的VCC、GND和信号线(如RS、R/W、EN、D0-D7等)连接到STC12C5A60S2单片机对应的引脚。

-将AD转换器的VCC、GND和信号线(如CLK、DOUT、DIN、CS等)连接到STC12C5A60S2单片机对应的引脚。

-将电压传感器模块的输出引脚连接到AD转换器的输入引脚。

3.编写代码:-使用C语言编写STC12C5A60S2单片机的代码,包括初始化设置、AD 采样、数据处理和液晶显示等部分。

-在初始化设置中,设置AD转换器的引脚和时钟,配置液晶显示屏的引脚和参数。

-在AD采样部分,通过SPI通信协议与AD转换器进行通信,获取电压传感器模块的输出电压值。

-在数据处理部分,将采样到的原始数据经过相应的处理,如校正、换算等。

-在液晶显示部分,将处理后的数据显示到液晶屏上,并通过适当的界面设计和显示格式展示结果。

4.烧录程序:-使用相应的编程工具将编写好的代码烧录到STC12C5A60S2单片机。

-确保烧录成功,并断开编程工具的连接。

5.调试测试:-连接好硬件后,给电压传感器模块供电,确保电压输入正常。

-上电运行STC12C5A60S2单片机,液晶显示屏应显示出AD采样后的结果。

-对不同的输入电压进行测试,观察液晶屏上的显示结果是否与实际输入电压相符。

请注意,以上仅是基本的框架和步骤,实际应用中还需要根据具体需求和应用场景进行相应的优化和调整。

STC15F2K60S2系列单片机 AD转换

STC15F2K60S2系列单片机   AD转换

P1ASF的8个控制位与P1口的8个口线是一一对应的, 即P1ASF.7~P1ASF.0对应控制P1.7~P1.0,为“1”,对应P1 口口线为ADC的输入通道;为“0”,其它I/O口功能。 P1ASF的格式如下:
单片微机原理与接口技术
返回目录
电子工业出版社
10.2 STC15F2K60S2单片机A/D模块的控制
④ 选择ADC通道(设置ADC_CONTR中的CHS2~CHS0);
⑤ 根据需要设置转换结果存储格式(设置CLK_DIV中的ADRJ); ⑥ 查询A/D转换结束标志ADC_FLAG,判断A/D转换是否完成,若完成.则读出A/D转换 结果(保存在ADC_RES和ADC_RESL寄存器中),并进行数据处理 。如果是多通 道模拟量进行转换,则更换A/D转换通道后要适当延时,使输入电压稳定,延时 量取20~200μS即可(与输入电压源的内阻有关),如果输入电压源的内阻在l0kΩ 以下,可不加延时; ⑦ 若采用中断方式.还需进行中断设置(中断允许和中断优先级); ⑧ 在中断服务程序中读取A/D转换结果,并将ADC中断请求标志ADC_FLAG清零。 例10.1 例10.2
单片微机原理与接口技术
返回目录
电子工业出版社
10.2 STC15F2K60S2单片机A/D模块的控制
3 A/D转换结果存储格式控制与A/D转换结构控制寄存器 ADC_RES、ADC_RESL
当(ADRJ)=0时,10位A/D转换结果的高8位存放在 ADC_RES寄存器中,低2位存放在ADC_RESL寄存器的低2 位中。
单片微机原理与接口技术
返回目录
电子工业出版社
10.2 STC15F2K60S2单片机A/D模块的控制
STC15F2K60S2单片机的A/D模块主要是由P1ASF、 ADC_CONTR、ADC_RES和ADC_RESL等四个特殊功能寄存 器进行控制与管理的。

stc adc外部电压

stc adc外部电压

stc adc外部电压
STC ADC外部电压指的是STC单片机中的模数转换器(ADC)所
能接受的外部电压范围。

STC单片机通常会有多个模拟输入引脚,
这些引脚可以连接外部电压源,并通过ADC转换成数字信号进行处理。

STC单片机的ADC通常能够接受的外部电压范围取决于具体型
号和系列。

一般来说,STC单片机的ADC外部电压范围是0V至Vref,其中Vref是参考电压。

在STC单片机中,Vref可以是内部参考电
压或外部参考电压,因此在使用ADC时需要注意参考电压的设置。

对于不同的应用场景,STC单片机的ADC外部电压范围可能会
有所不同。

一些型号的STC单片机可能支持负电压输入,而另一些
可能仅支持正电压输入。

因此,在使用STC单片机的ADC时,需要
查阅具体型号的数据手册,以确定其支持的外部电压范围。

另外,在连接外部电压源到STC单片机的ADC引脚时,还需要
考虑输入阻抗、采样率、信噪比等因素,以确保获取到准确的模拟
输入信号并进行有效的转换。

总之,STC单片机的ADC外部电压范围是一个重要的参数,需要根据具体型号和应用需求来确定,并在设计和应用过程中进行合理的考虑和配置。

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

STC系列单片机内部AD的应用
作者:郭天祥来源:原创更新时间:2008-11-27 22:16:38 浏览次数:7668
STC89LE52AD、54AD、58AD、516AD这几款89系列的STC单片机内部自带有8路8位的AD转换器,分布在P1口的8位上,当时钟在40MHz以下时,每17个机器周期可完成一次AD转换。

与AD相关的几个寄存器如表1所示。

表1 STC89系列单片机AD相关寄存器
P1_ADC_EN:P1.X口的AD使能寄存器。

相应位设置为“1”时,对应的P1. X口作为AD转换使用,内部上拉电阻自动断开。

ADC_CONTR:AD 转换控制寄存器。

ADC_START:AD转换启动控制位,设置为“1”时,AD开始转换。

ADC_FLAG:AD转换结束标志位,当AD转换完成后,ADC_FLAG=1。

CHS2、CHS1、CHS0:为模拟输入通道选择,如表2所示。

表2 STC89系列单片机AD模拟通道选择设置
ADC_DATA:AD 转换结果寄存器。

模拟/数字转换结果计算公式如下:
结果=256×Vin / Vcc
Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。

下面一个例程演示STC89LE516AD/X2系列单片机的A/D转换功能。

时钟11.0592MHz,转换结果以16进制形式输出到串行口,可以用串行口调试程序观察输出结果。

(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。

新建文件part3.4.5.c,程序代码如下:
#include <reg52.H>
#include <intrins.H>
// 定义与ADC 有关的特殊功能寄存器
sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器
sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器
sfr ADC_DATA = 0xC6; //A/D转换结果寄存器
typedef unsigned char INT8U;
typedef unsigned int INT16U;
void delay(INT8U delay_time) // 延时函数
{
INT8U n;
INT16U m;
for (n=0;n<delay_time;n++)
{
for(m=0;m<10000;m++);
}
}
void initiate_RS232(void) //串口初始化
{
ES = 0; // 禁止串口中断
SCON = 0x50; // 0101,0000 8 位数据位,无奇偶校验
T2CON = 0x34; // 0011,0100,由T2 作为波特率发生器
RCAP2H = 0xFF; // 时钟11.0592MHz, 9600 波特率
RCAP2L = 0xDB;
ES = 1; // 允许串口中断
}
void Send_Byte(INT8U one_byte) // 发送一个字节
{
TI = 0; // 清零串口发送中断标志
SBUF = one_byte;
while (TI == 0);
TI = 0; // 清零串口发送中断标志
}
INT8U get_AD_result(INT8U channel)
{
INT8U AD_finished = 0; // 存储A/D 转换标志
ADC_DATA = 0;
ADC_CONTR = channel; // 选择A/D 当前通道
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令ADC_START = 1, 启动A/D 转换
AD_finished = 0;
while ( AD_finished == 0 ) // 等待A/D 转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1测试A/D转
换结束否
}
ADC_CONTR &= 0xF7; //1111,0111 令ADC_START = 0, 关闭A/D 转换,
return (ADC_DATA); // 返回A/D 转换结果
}
void main()
{
initiate_RS232();
P1 = P1 | 0x63; // 0110,0011,要设置为A/D 转换的P1.x 口,先设为高
P1_ADC_EN = 0x63; //0110,0011, P1 的P1.0,P1.1,P1.5,P1.6 设置为A/D 转换输入脚// 断开P1.0,P1.1,P1.5,P1.6 内部上拉电阻
while(1)
{
Send_Byte(get_AD_result(0)); //P1.0 为A/D 当前通道, 测量并发送结果
delay(0x200);
Send_Byte(get_AD_result(1)); //P1.1 为A/D 当前通道, 测量并发送结果
delay(0x200);
Send_Byte(get_AD_result(5)); //P1.5 为A/D 当前通道, 测量并发送结果
delay(0x200);
Send_Byte(get_AD_result(6)); //P1.6 为A/D 当前通道, 测量并发送结果
delay(0x200);
Send_Byte(0); // 连续发送4 个00H, 便于观察输出显示
Send_Byte(0);
Send_Byte(0);
Send_Byte(0);
delay(0x200); // 延时
delay(0x200);
delay(0x200);
delay(0x200);
delay(0x200);
delay(0x200);
}
}
知识点:typedef与#define的区别
typedef:类型定义,其功能是用户为已有数据类型取“别名”。

如:typedef int INT; 意思是将int重新定义为INT,以后使用INT a;就相当于int a;
用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单,而且使意义更为明确,因而增强了可读性。

例如:typedef int a[10];表示a是整型数组类型,数组长度为10,然后就可用a定义变量,如:a s1,s2;完全等效于:int s1[10],s2[10];define:宏定义。

如:#define PI 3.14 意思是以后程序中出现PI的地方将用3.14代替,这个替换是在编译预处理阶段完成的,注意#define最后没有分号,否则编译时将分号一同带入PI中。

表1 STC89系列单片机AD相关寄存器。

相关文档
最新文档