STC单片机AD转换试验
单片机ad实验报告
单片机ad实验报告
单片机AD实验报告
实验目的:
本次实验旨在通过单片机的AD(模拟-数字)转换功能,将模拟信号转换为数字信号,并通过单片机进行处理和显示,以加深对单片机AD转换原理和应用的理解。
实验器材:
1. 单片机开发板
2. 模拟信号发生器
3. 示波器
4. 连接线
5. 电脑
实验步骤:
1. 连接模拟信号发生器和单片机开发板,设置模拟信号发生器输出一个正弦波信号。
2. 在单片机开发板上编写程序,配置AD转换功能,将模拟信号转换为数字信号。
3. 将数字信号通过串口传输到电脑上,并用示波器观察数字信号的波形。
4. 在电脑上编写程序,对接收到的数字信号进行处理和显示。
实验结果:
经过实验,成功将模拟信号转换为数字信号,并通过单片机进行处理和显示。
在示波器上观察到了数字信号的波形,验证了AD转换的准确性和稳定性。
在
电脑上也成功对接收到的数字信号进行了处理和显示,进一步验证了单片机AD 转换功能的有效性。
实验总结:
通过本次实验,深入了解了单片机AD转换的原理和应用。
AD转换是单片机重要的功能之一,对于模拟信号的采集和处理具有重要意义。
在实际应用中,可以通过单片机AD转换功能,实现各种类型的模拟信号的数字化处理,为各种电子设备的控制和监测提供了技术支持。
通过本次实验,对单片机AD转换功能有了更深入的理解和掌握,为今后的电子技术应用奠定了坚实的基础。
实验5 STC单片机ADC转换实验-V20170317
实验5 STC单片机ADC转换实验-V201703171.实验目的学习STC12C5A单片机ADC知识;2.实验设备硬件:12号节点,串口线;软件:Keil u Vision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘\附件\芯片手册\STC单片机手册源码路径:配套光盘\源代码\单片机原理与技术\实验 5 STC单片机ADC转换实验-V20170317hex路径:配套光盘\源代码\单片机原理与技术\实验 5 STC单片机ADC转换实验-V20170317\out\ADC.hex3.实验原理3.1 A/D相关寄存器介绍与A/D转换有关的寄存器如表3.1所示:表3.1 A/D相关寄存器P1ASF:P1口的模拟功能控制器。
STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。
需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。
P1ASF寄存器的定义如表3.2所示:表3.2 P1ASF寄存器定义ADC_CONTR:ADC控制寄存器。
该寄存器的描述如表3.3所示:表3.3 ADC_CONTR寄存器定义对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。
ADC_POWER: ADC电源控制位。
0:关闭A/D转换器电源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 转换,若能将定时器/串行口/中断系统关闭更好。
STC12C5A60S2单片机的AD转换
AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实 际电压居
return AD_val;
}_
void AD」nit(void)
{"
P1ASF = Oxff; //Pl口全部作为模拟功能A/D使用
ADC_RES = 0;〃清零转换结果寄存器高8位
0x08
//ADC启动控制位设为开
#define
ADC_SPEEDLLFra bibliotek0x00〃设为540个时钟周期ADC一次
#define
ADC_SPEEDL
0x20
〃设为360个时钟周期ADC一次
#define
ADC_SPEEDH
0x40
〃设为180个时钟周期ADC—次
#defi ne
ADC_SPEEDHH
0x60
_nop_();_nop_();_nop_();_nop_();〃要经过4个CPU时钟的延时,苴值才能够保证被 设置进ADC_CONTR?寄彩器?
while) !(ADC_CONTR&ADC_FLAG));〃等待转换完成
adc_data=ADC_RES;〃转换结果计算,取8位结果
ADC_CONTR&=~ADC_FLAG;〃关闭AD转换,ADC_FLAG位由软件淸0
AD_init();
while(l)
{ for(i=0;i<8;i++)
{
AD_work(i); delay(20);
}
) unsigned int AD_get(unsigned char n)〃笫n通道ADC采样函数
{
unsigned int adc_data;
单片机AD模数转换实验报告
单片机AD模数转换实验报告一、实验目的和要求1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、设计要求。
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D 转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、电路原理图。
图1、电路仿真图四、实验程序流程框图和程序清单。
1、查询法:ORG 0000HSTART: LJMP MAINORG 0100HMAIN: MOV SP, #2FH NT: MOV DPTR, #0FF78H MOVX @DPTR, A LOOP: JB P3.3, LOOP MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP NT DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RET DELAY: M OV R5, #01H DL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $ DJNZ R4, DL0 DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ENDdisplay 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回display 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回2、延时法:ORG 0000H START: LJMP MAIN ORG 0100H MAIN: MOV SP, #2FH LOOP: MOV DPTR, #0FF78H MOVX @DPTR, A LCALL DELAY MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP LOOP DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RET DELAY: M OV R5, #01H DL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $ DJNZ R4, DL0 DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H开始启动AD 延时从AD中取数据数据处理结束调显示子函数END五、实验结果。
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转换非常方便,只需要简单的几行代码就可以完成。
用STC12C5A60S2测试AD转换程序
刚到手一块STC12C5A60S2单片机,看说明文档里有AD转换功能。
于是写了这段程序测试学习一下,程序在我的学习板上运行稳定,如里要你只要改下I/O口即可。
里面注解挺详细的,愿对看文档的人有所帮助吧。
下面是主程序部份:# include <stc12c5a60s2.h># include <intrins.h># define uchar unsigned char# define uint unsigned int/* -------------函数声明开始--------------- */void delay_ms(uchar ms);//延时函数void init_adc(void); //初始化ADuint get_adc(void); //获取AD结果,返回UINT型值。
extern write1602_3b (uchar pos, uint n);extern void init_1602 ();/* -------------函数声明结束--------------- */void init_adc(void){P1ASF = 0x01; //AD功能寄存器,设置I/O口作为AD转换实用。
使用P1.0口。
ADC_RES = 0; //清理结果寄存器的值ADC_RESL = 0; //清理结果寄存器的值ADC_CONTR = 0x80; //开启AD电源并设置转换周期为540个时钟周期转换一次。
//ADC_POWER=1;CHS2,1,0为0,用p1.0作为输入。
SPEED1,0为0,540个时钟,delay_ms(2);}void delay_ms(uchar ms){uint i = 5000;while(ms--){while(i--);}}uint get_adc(void){uint d=0;ADC_CONTR = 0X88;_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR & 0X10));ADC_CONTR &= ~0X10;d |= ADC_RES;d <<= 2;d |= ADC_RESL;return d;}void main (void){uint v=0;uint dat = 0;// P2M0 = 0X00;// P2M1 = 0XFF;_nop_();_nop_();_nop_();_nop_();_nop_();init_1602 ();init_adc();while(1){dat=get_adc();v = (uint)((dat*5.0*100)/1024);write1602_3b (0x48,v);delay_ms(10);}}下面是1602显示部分,在编译时要把两个程序都放入KEIL工程里。
实验三STC15系列单片机内部双通道10位AD转换程序
/*T8接T3和T2;或T8接T3,T7接T2;调电位器R36可改变内部10位AD转换0和1通道的电压Vin0或Vin1,采样周期5ms;送AD的电压用万用表在T8(对T6)测量;按照十六进制,0通道数字量由LCD显示(1行);1通道数字量由LCD显示(2行);0通道对应理论值在左边5个数码管显示(1个符号位,2个整数位,2个小数位);1通道对应理论值在右边5个数码管显示(1个符号位,2个整数位,2个小数位);研究2通道间是否需要适当延时*/#in clude <15f2k.h>#in clude <ab sacc.h>#d efine u8c uns igned char code//存放于代码中的无符号8位字符型缩写定义#de fineu8 unsi gnedchar//无符号8位字符型缩写定义#defin e u16 un signe d int //无符号16位整型缩写定义#def ine w ritec md XBYTE[0xEC FF]//1602写指令端口地址,E正脉冲有下降沿(A12=0),R/W=A9=0写,RS=A8=0写指令#defin e rea dstat e XB YTE[0xEEFF]//1602读状态端口地址,E正脉冲有高电平(A12=0),R/W=A9=1读,RS=A8=0读状态#de finewrite data XBYT E[0xE DFF]//1602写数据端口地址,E正脉冲有下降沿(A12=0),R/W=A9=0写,R S=A8=1读数据#defi ne Di splay seg X BYTE[0x7FF F]//数码管段码锁存器写端口地址(A15=0)#defi ne Di splay bit X BYTE[0xBFF F]//数码管位码锁存器写端口地址(A14=0)#defi ne LC D_CLR0x01 //清屏,清DD RAM内容为空,AC=00H#defi ne LC D_MOD E 0x38 //模式设置,001DLN F**,D L=1是8位数据接口,N=1两行显示,F=0是5*7点阵字符#def ine L CD_ON0x0c //显示开关控制,00001DCB,D=1开显示,C=0关光标,B=0关闪烁#de fineLCD_A_MODE 0x06//输入方式设置,000001I/DS,I/D=1数据读写后A C自动增1,S=0数据读写后画面不动b it new_cycl e_fla g=0; //有新采样数据标志,1有新数据sb it LSIG N=P1^6; //左边的符号位数码管公共端连接引脚,=0可能亮sbit RS IGN=P1^7; //右边的符号位数码管公共端连接引脚,=0可能亮u8r_kTH,m_kT H,r_k TL,m_kTL;//0通道和1通道AD转换结果u8 di spbuf[10],statu s,i; //10个数码管显示段码缓存区数组和AD转换状态及计算用中间变量int Vi n0x100,Vin1x100; //据AD值推算的0通道和1通道输入的100倍(显示用) u16A xx,j; //显示时用的中间变量float Vi n0,Vi n1; //据AD值推算的0通道和1通道输入-11.0V~+10.914Vu8 M=0; //扫描显示位计数变量定义u8cSG[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x 79,0x71};//0-F段码表u8c BT[10]={0xfe,0xfd,0xfb,0xf7,0xff,0xef,0xdf,0xbf,0x7f,0xff};//位码表u8c dis p1[16]={'0',' ','C','h','a','n','n','e','l',' ','A','D',' ',' ','H',''};u8c di sp2[16]={'1','','C','h','a','n','n','e','l',' ','A','D',' ',' ','H',' '};/***********LCD写指令************/voi d LCD write cmd(c har c md) //要传递指令{ w hile((read state&0x80)!=0); //查询LC D忙否?B F=1表示忙,循环,直到BF=0退出循环wr itecm d=cmd; //写指令,即把指令送[0xE3F F]端口}/***********L CD写数据************/v oid L CDwri tedat a(cha r dat) //要传递数据{ whil e((re adsta te&0x80)!=0); //查询LCD忙否?BF=1表示忙,循环,直到B F=0退出循环write data=dat;//写数据,即把数据送[0xE7FF]端口}/***********LCD初始化************/void LCD_init(void) //清屏/8位数据接口/1行/5*7点阵字符/关显示/AC自动增1{ L CDwri tecmd(LCD_MODE); //写模式设置指令 LCDw ritec md(LC D_ON); //写显示开关控制指令LCDwr itecm d(LCD_A_MO DE);//写输入方式设置指令L CDwri tecmd(LCD_CLR);//写清屏指令}/*******1602液晶屏幕初始化*******/voi d Dis play_init(void)//1602显示初始化{ LC Dwrit ecmd(0x80); //写指令,设置DDRA M指针AC=0x00fo r(i=0;i<16;i++) LCDw rited ata(d isp1[i]);//往第1行写数据:"0chan nel A D: H "LCDwr itecm d(0xc0); //写指令,设置DD RAM指针AC=0x40for(i=0;i<16;i++) LC Dwrit edata(disp2[i]);//往第2行写数据:"1ch annel AD: H "}/**********内部AD初始化**********/voi d AD_init(void)//内部AD初始化{ CLK_DIV&=0xDF; //MC KO_S1 MCKO_S0 A DRJ T X_RX- CLK S2CL KS1 C LKS0 //A DRJ=0,ADC_RES[7:0]存高8位ADC结果,AD C_RES L[1:0]存低2位ADC结果AD C_CON TR=0x80; //开A/D转换电源 for(j=0;j<10000;j++); //适当延时,一般延时1ms以内即可P1A SF=0x03; //开启P1.0和P1.1作为0通道和1通道模拟量输入通道A DC_CO NTR=0xC0;//ADC_POWER SPEE D1 SP EED0ADC_F LAG A DC_ST ART C HS2 C HS1 C HS0=1 10 0 0 000B//选择180个时钟周期转换1次,暂时不启动AD转换,选择0通道for(j=0;j<200;j++);//适当延时,20u s~200us即可}/***********T0T1初始化***********/v oid T0T1_i nit(v oid) //10数码管扫描1周AD转换1次,每管显1ms,AD周期10ms{ AUX R|=0x c0; //T0、T1定时器时钟1T模式,T0定时1m s,AD时间127.3us TMOD=0x20; //设置定时器模式,T0方式0定时,T1方式2定时T L0=0x66; //频率=11059200/(65536-0xea66)=1999.855Hz TH0=0xea; //定时周期=1/1999.855=0.000500036s=0.500036msEA=1;//允许中断E T0=1;//允许T0中断TR0=1; //定时器0开始计时}/*AD值倒推输入电压显示缓存区的更新*/voiddisp_g(voi d) //A D值倒推输入电压显示缓存区的更新{ i f(Vin0x100<0) //如果据0通道AD值推算的输入Vin0的100倍是负数{ Axx=-Vin0x100; //取绝对值 disp buf[9]=0x40; //符号位数码管对应送负号的段码}els e //据0通道AD值推算的输入Vin0的100倍是正数 { Ax x=Vin0x100; //取据AD值推算的输入Vi n0的100倍 dis pbuf[9]=0x00; //符号位数码管对应送正号的段码}i=(u8)(Axx/1000); //计算电压伏特十位 disp buf[8]=SG[i]; //电压十位数码管显示缓存更新段码 i=(u8)(Ax x/100%10); //计算电压伏特个位d ispbu f[7]=SG[i]|0x80; //电压个位数码管显示缓存更新段码(含小数点)i=(u8)(Axx/10%10); //计算电压小数后第1位dispb uf[6]=SG[i]; //电压小数后第1位数码管显示缓存更新段码i=(u8)(Axx%10);//计算电压小数后第2位d ispbu f[5]=SG[i]; //电压小数后第2位更新i f(Vin1x100<0) //如果据1通道AD值推算的输入Vin1的100倍是负数{ Axx=-Vin1x100; //取绝对值 disp buf[4]=0x40; //符号位数码管对应送负号的段码}els e //据1通道AD值推算的输入Vin1的100倍是正数 { Ax x=Vin1x100; //取据AD值推算的输入Vi n1的100倍 dis pbuf[4]=0x00; //符号位数码管对应送正号的段码}i=(u8)(Axx/1000); //计算电压伏特十位 disp buf[3]=SG[i]; //电压十位数码管显示缓存更新段码 i=(u8)(Ax x/100%10); //计算电压伏特个位d ispbu f[2]=SG[i]|0x80; //电压个位数码管显示缓存更新段码(含小数点)i=(u8)(Axx/10%10); //计算电压小数后第1位dispb uf[1]=SG[i]; //电压小数后第1位数码管显示缓存更新段码i=(u8)(Axx%10);//计算电压小数后第2位d ispbu f[0]=SG[i]; //电压小数后第2位更新}/*****AD结果显示缓存区的更新******/void disp_f(vo id) //A D结果显示缓存区的更新{ //0通道A D结果显示缓存区的更新L CDwri tecmd(0x8c); //写指令,设置DDR AM指针A C=0x4di=(r_k TH&0x f0)>>4; //取0通道8位AD数据的十六进制高位 if(i<10)LCDwr iteda ta(i+0x30);//更新AD数十六进制高位(数字)的A SCII码el se LC Dwrit edata(i+0x37); //更新AD数十六进制高位(大写字母)的AS CII码 i=r_kTH&0x0f; //取0通道8位AD数据的十六进制低位i f(i<10) LC Dwrit edata(i+0x30);//更新AD数十六进制高位(数字)的ASC II码 else LCDw rited ata(i+0x37); //更新AD数十六进制高位(大写字母)的ASCI I码LCDwr iteda ta('H'); //LCDwr iteda ta(r_kTL+0x30);//更新A D数十六进制高位(数字)的AS CII码 //1通道AD结果显示缓存区的更新LCD write cmd(0xcc); //写指令,设置DDRAM指针AC=0x4di=(m_kTH&0xf0)>>4; //取1通道8位AD数据的十六进制高位i f(i<10) LC Dwrit edata(i+0x30);//更新AD数十六进制高位(数字)的ASC II码 else LCDw rited ata(i+0x37); //更新AD数十六进制高位(大写字母)的ASCI I码i=m_k TH&0x0f; //取1通道8位AD数据的十六进制低位if(i<10) LCDw rited ata(i+0x30);//更新AD数十六进制高位(数字)的ASCII码e lse L CDwri tedat a(i+0x37);//更新AD数十六进制高位(大写字母)的A SCII码 LC Dwrit edata('H'); //LC Dwrit edata(m_kT L+0x30); //更新AD数十六进制高位(数字)的ASCI I码}/*************主程序*************/voi d ma in(vo id) //{ L CD_in it();//1602液晶显示模块初始化Dis play_init(); //1602液晶屏显示内容初始化 AD_i nit(); //内部AD初始化T0T1_in it(); //T0、T1初始化程序(11.0592MH z)do{ if(new_c ycle_flag==1) //有新采样数据标志,Vs1=-(R6/R5)*V in0=-0.2Vi n0 { //Vs2=-(R10/R8)*Vs1-(R10/R9)*(-5)=2.5+0.2Vin0 //当Vin0=-10V时,Vs2=0.5V;当Vin0=10V时,Vs2=4.5V //N=((2.5+0.2Vin0)/5)*256;V in0=0.09765625*N-12.5//Vs3=-(R17/R18)*Vin1=-0.2Vin1 //V s4=-(R13/R15)*V s3-(R13/R14)*(-5)=2.5+0.2Vin1 Vin0*=(fl oat)r_kTH; //A D转换需要127.3us,抽空做点计算 Vin0-=12.5; // Vin0x100=(int)(Vin0*100); //A D值倒推输入电压的100倍;小数点定点在第7位Vin1*=(flo at)m_kTH; //当V in1=-10V时,Vs4=0.5V;当Vin1=10V时,Vs4=4.5V Vin1-=12.5; //N=((2.5+0.2V in1)/5)*256;Vin1=0.09765625*N-12.5 Vin1x100=(int)(Vin1*100); //A D值倒推输入电压的100倍;小数点定点在第2位disp_g(); //0通道和1通道AD值倒推的输入电压显示缓存区的更新disp_f(); //0通道和1通道AD结果显示缓存区的更新n ew_cy cle_f lag=0; //新采样数据标志清0 }}whil e(1);}/*********T0中断服务程序*********/voi d t0() int errup t 1 u sing1 //0.5m s中断,自动重装,每次均要进行显示处理{ if(M==10) //5ms到了吗?因为0.5ms*10=5ms{ADC_C ONTR|=0x08; //到了5ms,启动0输入通道AD转换 new_cycl e_fla g=1;//置有新采样数据标志 M=0;//M清0s tatus=0; //状态变量先清0 whil e(sta tus==0) st atus=ADC_C ONTR& 0x10;//转换结束否?ADC_C ONTR=0xC1; //ADC_P OWERSPEED1 SPE ED0 A DC_FL AGAD C_STA RT CH S2 CH S1 CH S0=110 00 001B//选择180个时钟周期转换1次,将ADC_FLAG清0,暂时不启动AD转换,选择1通道 r_kTH=A DC_RE S; //读取0通道AD结果的高8位 r_kT L=ADC_RESL&0x03; //读取0通道AD结果的低2位,不用 Vin0=0.09765625; //AD转换需要127.3us,抽空预置常数 ADC_CONT R|=0x08; //启动1输入通道A D转换 Vi n1=0.09765625; // st atus=0; //状态变量先清0while(stat us==0) sta tus=A DC_CO NTR & 0x10;//转换结束否?A DC_CO NTR=0xC0; //A DC_PO WER S PEED1 SPEE D0 AD C_FLA GADC_STAR T CHS2 CHS1 CHS0=1 10 0 0 000B //选择180个时钟周期转换1次,将ADC_FLAG清0,暂时不启动AD转换,选择0通道 m_k TH=AD C_RES; //读取1通道AD结果的高8位m_kTL=ADC_RESL&0x03; //读取1通道AD结果的低2位,不用}RS IGN=1; //关闭右边符号位显示LSI GN=1; //关闭左边符号位显示 Disp laybi t=0xf f; //关闭8个数码管的显示 Disp layse g=dis pbuf[M]; //查显示缓存表送数显的段端口D ispla ybit=BT[M]; //查位码表送数显的位端口if(M==4) R SIGN=0; //扫描到右边符号位则该位显示 if(M==9) LSI GN=0; //扫描到左边符号位则该位显示 M++; //修改下一次的显示位}。
单片机AD转换实验报告
单⽚机AD转换实验报告三、实验电路五、实验结果将程序产⽣的⼗六进制代码加载到proteus中,运⾏仿真,调节滑动变阻器改变AD 输⼊的电压,可以到如图7.1—7.4所⽰的实验结果。
图7.1输⼊电压0.76V 图7.2输⼊电压1.31V图7.3输⼊电压2.50V 图7.4输⼊电压4.99V四、程序清单及流程图程序⼀(查询):ORG 0000HLJMP MAINORG 0010HMAIN: MOV SP, #2FH CLR EAMOV DPTR, #0EFF8H MOVX @DPTR, AJB P3.3, $MOVX A, @DPTRMOV B, #51DIV ABMOV 7AH, AMOV A, BLCALL CL1MOV 79H, AMOV A, BLCALL CL1MOV 78H, AMOV 7BH, #0AHLCALL DISPLJMP MAINDISP: PUSH ACCPUSH DPHSETB RS1SETB RS0MOV R0, #78HMOV R7, #04HMOV R2, #01HDISP1: MOV A, @R0MOV DPTR, #DKMOVC A, @A+DPTRMOV P2, R2MOV P0, AJNB P2.2, DISP2CLR P0.7DISP2: LCALL DELAYMOV A, R2RL AMOV R2, AINC R0 INC R1DJNZ R7, DISP1POP PSWPOP DPLPOP DPHPOP ACCRETDK: DB 0C0H,0F9H,0A4H,0B0H, 99H,92H,82H,0F8H,80H,90H,0FFH DELAY: MOV R3, #02HLOP: MOV R4, #250DJNZ R4, $DJNZ R3, LOPRETCL1: CJNE A, #25, L00PLJMP L00P2L00P: JNC L00P1L00P2: MOV B, #10DIV ABLJMP L00P3L00P1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #6MOV B, #51DIV ABADD A, #5L00P3: RETEND开始初始化调⽤延时,等待转换读取数据,并转换调⽤显⽰程序启动下⼀次A/D转换程序⼆(延时):延时⽅式只需将查询指令改为⼀个调⽤延时指令,在主程序后加⼊100us延时程序即可。
实验AD转换
实验AD转换实验AD转换⼀、实验⽬的了解STC单⽚机ADC的结构;掌握STC单⽚机ADC的使⽤。
⼆、实验原理STC15F2K60S2单⽚机内含8路10位⾼速AD转换器,速度可达30万次/秒。
单⽚机P1⼝既可作为普通I/O⼝,也可作为AD转换器模拟电压输⼊⼝。
AD转换器相关的寄存器如表1所⽰。
表1 ADC转换相关寄存器P1ASF某⼀位为“1”,P1⼝对应的引脚设为模拟功能。
某⼀位为“0”,对应的引脚设为普通I/O。
②ADC控制寄存器ADC_CONTRADC_POWER=1,打开AD转换器电源(关闭电源可降低功耗,ADC初次上电需适当延时,再启动AD转换)。
SPEED1、SPEED0选择AD转换速度。
ADC_FLAG:ADADC_START:AD转换启动控制。
CHS2、CHS1、CHS0:选择模拟输⼊通道P1.0~P1.7。
转换结果存放在ADC_RES和ADC_RESL寄存器中,当CLK_DIV.5/ADRJ=0时,ADC_RES为结果的⾼8位,ADC_RESL为结果的低2位(如表2所⽰)。
当CLK_DIV.5/ADRJ=1时,ADC_RES为结果的⾼2位,ADC_RESL为结果的低8位(如表3所⽰)。
STC15F2K60S2的AD 转换器以Vcc 为参考电压,当ADRJ=0时,10位转换结果与输⼊模拟电压的关系由式(1)计算:VccVin 10240]:ADC_RESL[10],:ADC_RES[7= (1)如果只取⾼8位,则由式(2)计算: VccVin 2560]:ADC_RES[7=……………………………………...…………………(2)当ADRJ=1时,10位转换结果与输⼊模拟电压的关系由式(3)计算:VccVin10240]:ADC_RESL[70],:ADC_RES[1=…………………………………(3)如果单⽚机Vcc 电压不稳,会引起AD 转换误差,在实际应⽤中,可⽤⼀路AD 采样外部的基准电压(如⽤TL431基准电源),另⼀路AD 采样被测电压,按式(4)计算:转换结果基准电转换结果被测VrefVin 源电压= (4)三、实验环境Windows XP ; Keil µ V ision 4; STC-ISP-6.28。
单片机AD转换实验_2
单片机实验报告实验名称:A/D转换实验姓名:学号:班级:实验时间:2010.12.13一、 实验目的1、理解A/D 转换的工作原理;2、理解掌握ADC0809的A/D 转换原理和并行A/D 转换器接口的编程方法;3、学习使用并行模/数转换芯片ADC0809进行电压信号的采集额数据处理。
二、 实验原理量化间隔和量化误差是A/D 转换器的主要指标之一。
量化间隔:Δ=单片机给ADC 提供一个启动信号后,ADC 转换开始;当A/D 转换结束时,ADC 输出一个转换结束标志信号,通知单片机读取转换结果。
单片机检查判断A/D 转换结束的方法一般有中断和查询两种方式。
整个A/D 转换都是在一定的时钟下作用完成的,其频率是决定芯片转换速度的基准。
实验参考流程:三、 实验内容程序流程:12 n 满量程输入电压程序中#define PIN0 XBYTE[0x7ff8] 表示启动A/转换#define PIN1 XBYTE[0x7ff9]PIN0=0; PIN1=0;result0_reg=PIN0; 表示读取A/D转换结果 result1_reg=PIN1;for(j=0;j<250;j++) 延时等待A/D转换完成for(k=0;k<250;k++);result0=(result0_reg*5)/255; 将转换结果转换为十进制result1=(result1_reg*5)/255;程序仿真,须将程序下载到试验箱中相应模块进行仿真。
在实验箱中,将D2区的1KΩ电位器的中间金属孔连接到A7区的P2_I02金属孔,D2区的10KΩ电位器的中间金属孔连接到A7区的P2_I01金属孔;将A7区的P2_I03-P2_I05分别连接到A2区的A2-A0;将A7区的P2_CS连接到A2区的A15;运行软件程序,每次跑到断点就会停止,此时观察转换的结果与数字万用表测量结果相比近似相同。
四、小结与体会对于具有模拟信号采集的单片机应用系统,A/D转换接口是前向通道中的一个重要环节。
单片机实现5v电压ad数模转换
Stc12c5a60s2系列单片机的A/d数模转换模块实验摘要:与时间成连续函数的物理量,一般都称之为模拟量。
人们在工业生产及科研过程中遇到的被测量绝大部分是模拟量。
例如:电压,电流,温度,压力,位移,速度等。
计算机技术是测量与控制自动化与智能化的关键,是现代测控技术的核心技术之一。
现代计算机是数字计算机,它无法直接处理模拟信号,因此欲实现基于计算机的测量与控制,必须具备将连续变化的模拟信号转变成计算机能够识别及处理的数字信号的手段。
为此模/数转换技术应运而成,并成为现代测控技术中的重要组成部分。
将模拟量转换为一定码制的数字量称为模/数转换。
Stc12c5a60s2系列单片机作为微型控制芯片的一种,其自身自带a/d装换口:P1(p1.0-p1.7),可实现数模转换功能。
实验目的:以Stc12c5a60s2单片机以及1602液晶显示屏做一个简易的”电压测量器“,测量线性稳压电源提供的直流电压,精度0.01v,通过调节电位器,将输入的电压转换为数字量实时显示在1602lcd上。
实现过程:1.理论学习:(1)在掌握1602lcd工作原理及使用方法的基础上,查阅Stc12c5a60s2单片机数模转换模块应用介绍,弄清楚a/d转换器的结构,了解a/d转换器是如何工作的。
(2)理解与a/d转换器相关的寄存器的设置,会根据实际需要设置相关的寄存器。
(3)了解如何配置a/d转换口,如何取出转换结果。
以十位结果为例,计算公式如下:Vcc即单片机实际工作电压,我们用单片机工作电压做模拟参考电压,则输出的实际电压vin=result(结果寄存器中的值)×vcc(单片机工作电压5v)/1024。
2.需注意的问题:(1)Stc12c5a60s2单片机的参考电压源是输入的工作电压vcc,所以一般不用外接参考电压源,如果单片机是采用电池供电,电池电压会在一定范围内漂移,所以vcc就不固定,这时候就需要在8路a/d转换的一个通道外接一个稳定的参考电压源,来计算此时的工作电压vcc,再计算出其他几路a/d转换通道的电压。
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. 为了验证温度转换计算的准确性,可以进行一定的实验验证。
有关单片机AD转换的实验报告
有关单片机AD转换的实验报告
一、试验目的
1、理解A/D转换的工作原理;
2、理解把握ADC0809的A/D转换原理和并行A/D转换器接口的编
程办法; 3、学习用法并行模/数转换芯片ADC0809举行电压信号的采集和数据处理。
二、试验原理
在设计A/D转换器与单片机接口之前,往往要按照A/D转换器的技术指标挑选A/D转换器。
A/D转换器的主要技术指标-----量化间隔和量化误差是A/D转换器的主要技术指标之一。
量化间隔可用下式表示,其中n为A/D转换器的位数: 量化间隔
肯定误差22
1 相对误差n1100%2
A/D转换器芯片种类无数,按其转换原理可分为逐次比较式、双重积分式、量化反馈式和并行式A/D转换器;按其辨别率可分为8~16位的A/D转换器芯片。
目前最常用的是逐次靠近式和双重积分式。
A/D转换器与单片机接口具有硬、软件相依性。
普通来说,A/D转换器与单片机的接口主要考虑的是数字量输出线的衔接、ADC启动方式、转换结束信号处理办法以准时钟的衔接等。
一个ADC开头转换时,必需加一个启动转换信号,这一启动信号要由单片机提供。
不同型号的ADC,对于启动转换信号的要求也不同,普通分为脉冲启动和电平启动两种:
对于脉冲启动型ADC,只要给其启动控制端上加一个符合要求的脉冲信号即可,如ADC0809、ADC574等。
通常用WR和地址译码器的输出经一定的规律电路举行控制;
对于电平启动型ADC,当把符合要求的电平加到启动控制端上时,立刻开头转换。
在转换过程中,必需保持这一电平,否则会终止转换
第1页共2页。
实验5stc单片机adc转换实验
实验5S T C单片机A D C转换实验(总6页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除1.实验目的学习STC12C5A单片机ADC知识;2.实验设备硬件:12号节点,串口线;软件:Keil u Vision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘\附件\芯片手册\STC单片机手册源码路径:hex路径:3.实验原理3.1 A/D相关寄存器介绍与A/D转换有关的寄存器如表3.1所示:表3.1 A/D相关寄存器P1ASF:P1口的模拟功能控制器。
STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。
需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。
P1ASF寄存器的定义如表3.2所示:表3.2 P1ASF寄存器定义ADC_CONTR:ADC控制寄存器。
该寄存器的描述如表3.3所示:表3.3 ADC_CONTR寄存器定义对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。
ADC_POWER:ADC电源控制位。
0:关闭A/D转换器电源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?转换,若能将定时器/串行口/中断系统关闭更好。
SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示:表3.4 SPEED1、SPEED0描述ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0。
《单片机原理与应用》AD和DA转换实验
《单片机原理与应用》AD和DA转换实验一、实验目的1、学习AD转换芯片PCF8591的基本共组原理。
2、掌握PCF8591的编程方法二、实验说明PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。
PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
1、地址寄存器I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活,该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0. A1和A2来设置。
在I2C总线协议中地址必须是起始条件作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读写位。
如图8-1所示。
图8-1 地址寄存器2 控制字寄存器发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能,控制寄存器的高半字节用于容许模拟输出,和将模拟输入编程为单端或差分输入。
低半字节选择一个由高半字节定义的模拟输入通道。
如果自动增量(auto-increment)标志置1,每次AD转换后通道号将自动增加。
如果自动增量(auto-increment)模式是使用内部振荡器的应用中所需要的,那么控制字节中模拟输出容许标志应置1.这要求内部振荡器持续运行,因此要防止振荡器启动延时的转换错误结果。
模拟输出容许标志可以在其他时候复位以减少静态功耗。
选择一个不存在的输入通道将导致分配最高可用的通道号。
所以,如果自动增量(auto-increment)被置1,下一个被选择的通道将总是通道0.两个半字节的最高有效位(即第7位和第3位)是留给未来的功能,必须设置为逻辑0.控制寄存器的所有位在上电复位后被复位为逻辑0.DA转换器和振荡器在节能时被禁止。
单片机AD模数转换实验报告
一、实验目的和要求1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、设计要求。
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、电路原理图。
图1、电路仿真图四、实验程序流程框图和程序清单。
1、 查询法:ORG 0000H START: LJMP MAIN ORG 0100H MAIN: MOV SP, #2FH NT: MOV DPTR, #0FF78H MOVX @DPTR, A LOOP: JB P3.3, LOOP MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP NT DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RETDELAY: MOV R5, #01HDL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $DJNZ R4, DL0DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90Hdisplay 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回display送百分位字符代码送位选信号延时1ms送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms熄灭第四位数码管延时1ms返回END2、延时法:ORG 0000HSTART: LJMP MAINORG 0100HMAIN: MOV SP, #2FHLOOP: MOV DPTR, #0FF78HMOVX @DPTR, ALCALL DELAYMOVX A, @DPTRMOV B, #51DIV ABMOV R0, AMOV A, BMOV B, #5DIV ABMOV R1, AMOV R2, BLCALL DIRSJMP LOOPDIR: MOV R7, #0SJMP LOOP1BH: MOV A, R1MOV R2, ALOOP1: MOV DPTR, #WKMOV A, R7MOVC A, @A+DPTRMOV P2, AMOV DPTR, #DKMOV A, R2MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R7CJNE R7, #2, BHMOV DPTR, #WKMOV A, R7MOVC A, @A+DPTRMOV P2, AMOV DPTR, #DKMOV A, R0MOVC A, @A+DPTRANL A, #7FHMOV P1, ALCALL DELAYRETDELAY: MOV R5, #01HDL1: MOV R4, #8EHDL0: MOV R3, #02HDJNZ R3, $DJNZ R4, DL0DJNZ R5, DL1RETWK: DB 10HDB 20HDB 40H开始启动AD延时从AD中取数据数据处理结束调显示子函数DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND五、实验结果。
单片机AD模数转换实验报告
单片机AD模数转换实验报告实验目的:通过单片机完成模数转换实验,了解AD模数转换的原理,掌握AD转换器的使用方法。
实验设备:1.STC89C52RC单片机开发板2.电位器3.电阻4.电容5.连接线实验原理:AD模数转换是将连续的模拟信号转换为离散的数字信号的过程。
在单片机中,通过ADC模块将模拟电压转换为数字量。
STC89C52RC单片机具有内置的10位ADC模块,可以将模拟电压转换为0-1023之间的数字量。
实验步骤:1.连接电位器、电阻和电容的引脚到单片机上。
2.在单片机的引脚配置中,将ADC0的引脚配置为模拟输入。
3.在主函数中初始化ADC模块。
4.使用AD转换函数来获取模拟电压的数字量。
5.将数字量通过串口输出。
实验结果:经过以上步骤,我们成功地将连续的模拟信号转换为了数字信号,并通过串口输出。
通过电位器、电阻和电容的调整,我们可以观察到不同的输入信号对应的数字量。
实验总结:通过本次实验,我们深入了解了AD模数转换的原理,并学会了使用单片机的ADC模块来完成模数转换。
在实验过程中,我们还发现了一些问题和注意事项。
首先,在连接电路时,需要将模拟输入连接到ADC0引脚,并在引脚配置中正确设置。
其次,在初始化ADC模块时,需要根据实际情况设置参考电压和转换速率等参数。
最后,在使用AD转换函数时,需要根据需要进行适当的调整和计算,以获取正确的数字量。
总体来说,本次实验帮助我们更好地理解了AD模数转换的原理和单片机的ADC模块的使用方法。
通过实际操作,我们掌握了实验步骤和注意事项,提高了实际操作的能力和理论知识的运用。
这对我们的电子技术学习和应用都起到了积极的促进作用。
单片机 DA、AD转换实验
实验目的: 实验目的:
1.掌握A/D转换与单片机的接口方法 .掌握 转换与单片机的接口方法. 转换与单片机的接口方法 2.了解A/D芯片 .了解 芯片ADC0809转换性能及编程 转换性能及编程. 芯片 转换性能及编程 3.通过实验了解单片机如何进行数据采集. .通过实验了解单片机如何进行数据采集
实验程序框图
源代码: 源代码:
A_DPORT EQU 8000H ;0809通道0 地址 ORG 0000H LJMP START ORG 0003H LJMP INT_0 ORG 0040H START: MOV SP,#60H MOV R7,#0FFH ;初始化 SETB IT0 SETB EA SETB EX0 ;INT0 允许 A_D:
MOV DPTR,#A_DPORT MOVX @DPTR,A ;启动 A_D CJNE R7,#00H,$ ;等待 A_D 转 换结束 CPL A MOV P1,A ;数据输出 MOV R7,#0FFH ;清读数标志 SJMP A_D INT_0: MOVX A,@DPTR ;读 A_D 数据 MOV R7,#00H ;置读数标志 RE实验
实验要求: 实验要求:
利用实验板上的ADC0809做A/D转换器,利 做 转换器, 利用实验板上的 转换器 用实验板上的电位器W1提供模拟量输入。编制程 提供模拟量输入。 用实验板上的电位器 提供模拟量输入 将模拟量转换成二进制数字量, 序,将模拟量转换成二进制数字量,用发光二极管 将模拟量转换成二进制数字量 显示. 显示
实验电路及连线: 实验电路及连线: CS0809接8000H. 模块电位器V-OUT点(即中心 抽头)接至ADC0809的IN0(通道0).EOC连 P3.2(INT0).将单片机的P1.0~P1.7接至八位发光二 极管L1 -- L8.
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转换在数据采集、传感器应用等方面的重要性。
stc 8位ADC转换实验程序
stc 8位ADC转换实验程序/*********************************************************************************************程序名: 8位ADC转换实验程序编写人: 杜洋 编写时间: 2010年3月24日硬件支持: STC12C2052AD 使用ADC功能外部晶体12MHz接口说明: 修改日志: 1-/*********************************************************************************************说明:PC串口端设置 [ 4800,8,无,1,无 ]将ADC读出的数值通过串口以十六进制方式显示。
/*********************************************************************************************/ #include <STC12C2052AD.H> //单片机头文件#include <intrins.h> //51基本运算(包括_nop_空函数)/*********************************************************************************************函数名:毫秒级CPU延时函数调用:DELAY_MS (?);参数:1~65535(参数不可为0)返回值:无结果:占用CPU方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i<600,应用于12T单片机时i<125/*********************************************************************************************/ void DELAY_MS (unsigned int a){unsigned int i;while( a-- != 0){for(i = 0; i < 600; i++);}}/*********************************************************************************************/ /*********************************************************************************************函数名:UART串口初始化函数调用:UART_init();参数:无返回值:无结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)备注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]/**********************************************************************************************/ void UART_init (void){//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)//ES = 1; //允许UART串口的中断TMOD = 0x20; //定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)TH1 = 0xF3; //定时器初值高8位设置TL1 = 0xF3; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)TR1 = 1; //定时器启动}/**********************************************************************************************/ /*********************************************************************************************函数名:UART串口发送函数调用:UART_T (?);参数:需要UART串口发送的数据(8位/1字节)返回值:无结果:将参数中的数据发送给UART串口,确认发送完成后退出备注:/**********************************************************************************************/ void UART_T (unsigned char UART_data){ //定义串口发送数据变量SBUF = UART_data; //将接收的数据发送回去while(TI == 0); //检查发送中断标志位TI = 0; //令发送中断标志位为0(软件清零)}/**********************************************************************************************/ /*********************************************************************************************函数名:8位A/D转换初始化函数调用:Read (?);参数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)返回值:无结果:开启ADC功能并设置ADC的输入端口备注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)/**********************************************************************************************/ void Read_init (unsigned char CHA){unsigned char AD_FIN=0; //存储A/D转换标志CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)_nop_();ADC_CONTR |= CHA; //选择A/D当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D电源DELAY_MS(1); //使输入电压达到稳定(1ms即可)}/**********************************************************************************************/ /*********************************************************************************************函数名:8位A/D转换函数调用:? = Read ();参数:无返回值:8位的ADC数据结果:读出指定ADC接口的A/D转换值,并返回数值备注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)/**********************************************************************************************/ unsigned char Read (void){unsigned char AD_FIN=0; //存储A/D转换标志ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FIN ==0){ //等待A/D转换结束AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,return (ADC_DATA); //返回A/D转换结果(8位)}/**********************************************************************************************/ /*********************************************************************************************函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:/**********************************************************************************************/ void main (void){unsigned char R;UART_init();//串口初始程序Read_init(0);//ADC初始化P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STC单片机AD转换试验(C源码),将做充、放电器的脱机记录..
[i=s] 本帖最后由autopccopy 于2010-7-4 23:56 编辑[/i]
/*使用STC单片机内置10AD(仅用高八位,分辨率为5mV)做的简易电压表*/
/*本程序AD部分使用了深圳宏晶公司官方AD转换示范程序修改, 特此鸣谢 */
/*使用STC12C5A60S2 1T单片机,12M外部晶振, Keil V3编译通过,AD 转换脚定义为P1.1, */
/*使用芯片本身5V电源为基准,在深圳精创电子的51/AVR开发板实现。
8位共阳LED字符码 */
/*接P0口,位线接在P2口,均为低电平显示,使用右4位。
本显示程序摘自网上,一并感谢。
*/
/*----2010.07.04 written by autopccopy() */
#include <intrins.H>
#include <STC_NEW_8051.H> //STC的新头文件
sbit P20 = P2 ^ 0; //个位
sbit P21 = P2 ^ 1; //十位
sbit P22 = P2 ^ 2; //百位
sbit P23 = P2 ^ 3; //千位
sbit P07 = P0 ^ 7; //小数点
typedef unsigned char INT8U;
typedef unsigned int INT16U;
#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
//---------------------------------------------------------------------
INT8U get_AD_result(INT8U channel);
void delay(INT8U delay_time); //延时函数
int DATA_LED[11] =
{
//0~9的数码管段码(共阳)
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xFF
};
void led(int n) //数码管显示及数据处理程序
{
P0 = 0xFF;
P0 = DATA_LED[n % 10]; //个位
P20 = 0;
delay(1);
P20 = 1;
P0 = 0xFF;
P0 = DATA_LED[n / 10 % 10]; //十位
P21 = 0;
delay(1);
P21 = 1;
P0 = 0xFF;
P0 = DATA_LED[n / 100 % 10]; //百位
P22 = 0;
delay(1);
P22 = 1;
P0 = 0xFF;
P0 = DATA_LED[n / 1000 % 10]; //千位
P23 = 0;
P07=0; //千位显示小数点
delay(1);
P23 = 1;
}
//--------------------------------------------------------------------- INT8U get_AD_result(INT8U channel) //AD转换部分
{
INT8U AD_finished=0; //存储A/D 转换标志
ADC_RES = 0; //高八位
ADC_RESL = 0; //低二位(本例未使用)
channel &= 0x07; //0000,0111 清0高5位
ADC_CONTR = AD_SPEED;
_nop_();
ADC_CONTR |= channel; //选择A/D 当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D 电源
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令ADCS = 1, 启动
A/D转换,
AD_finished = 0;
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111,0111 清ADC_FLAG 位, 关闭A/D转换,
return (ADC_RES); //返回A/D 高8 位转换结果
}
void delay(INT8U delay_time) // 延时函数
{
INT16U n;
while(delay_time--)
{
n = 6000;
while(--n);
}
}
//--------------------------------------------------------------------- void main()
{
INT16U ADC_result;
P1ASF = 0x02; //0000,0010, 将P1.1 置成模拟口AUXR1 &= ~0x04; //0000,0100, 令ADRJ=0 : 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
ADC_CONTR |= 0x80; //1000,0000 打开A/D 转换电源while(1)
{
ADC_result = get_AD_result(1);//P1.1 为A/D 当前通道, 测量并发送结果
led(ADC_result*19.53); //显示数值。
19.53 是AD转换系数:原公式是ADC_result/256*5V*1000
}
}
STC内置有EEPROM(FLISH), 很方便做脱机记录,可以以串口传回PC. 也可以使用外置的IIC串口EEPROM:24C256等,用编程器读回PC, 以EXCEL 分析画图等。