STC12C5A60S2单片机的10位AD转换程序

合集下载

10位AD转换源码显示汇编程序

10位AD转换源码显示汇编程序

P2口接数码管,4个数码管选通端由P1.4~P1.7控制,分别控制千位~个位。

STC单片机P1口自带AD转换。

ADC_CONTR EQU 0C5H ;A/D转换寄存器ADC_RES EQU 0C6H ;8位A/D转换结果寄存器ADC_RES2 EQU 0BEHP1ASF EQU 9DH ;P1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1ADC_Power_On_Speed_Channel_2 EQU 11100010BP1M0 EQU 91HP1M1 EQU 92HADC_Channel_2_Result EQU 32H ;2通道A/D转换结果ADC_Channel_2_Result2 EQU 33HORG 0000HMOV SP, #6FHAD1:;设置堆栈ACALL ADC_Power_On ;开ADC电源, 第一次使用时要打开内部模拟电源ACALL Set_P12_ASF ;开ADC电源, 可适当加延时,1mS 以内就足够ACALL Set_P12_ASF ;设置P1.2 为模拟功能口ACALL Set_ADC_Channel_2 ;设置P1.2 作为A/D转换通道ACALL Get_AD_Result ; AD转换结果LCALL ZHUANHUA1LCALL DISPSJMP AD1;A/D转换电源,晶振为22.1184MHz,时间为1.280758msADC_Power_On:PUSH ACCORL ADC_CONTR, #80H ;开A/D转换电源MOV A, #20HACALL DELAY ;开A/D转换电源后要加延时,1mS以内就足够了POP ACCRET;设置P1.2为模拟功能,晶振为22.1184MHz,时间为0.000496msSet_P12_ASF:PUSH ACCMOV A, #00000100BORL P1ASF, AORL P1M0, AORL P1M1, APOP ACCRET;选择P1.2作为A/D转换通道,晶振为22.1184MHz,时间为0.000363msSet_ADC_Channel_2:MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2;选择P1.2作为A/D转换通道;更换A/D 转换通道后要适当延时, 使输入电压稳定;以后如果不更换A/D 转换通道的话, 不需要加延时RET;将AD转换结果存入寄存器中,晶振为22.1184MHz,时间为0.050516msGet_AD_Result:PUSH ACC ;入栈保护MOV ADC_RES, #0ORL ADC_CONTR, #00001000B ;启动AD 转换NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值NOPNOPNOPWait_AD_Finishe:MOV A, #00010000B ;判断AD 转换是否完成ANL A, ADC_CONTRJZ Wait_AD_Finishe ;AD 转换尚未完成, 继续等待ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D转换MOV A, ADC_RESMOV ADC_Channel_2_Result,A ;将转换高8位结果存入ADC_Channel_2_Result中MOV A,ADC_RES2MOV ADC_Channel_2_Result2,A ;将转换低2位结果存入ADC_Channel_2_Result1中MOV A,ADC_Channel_2_Result ;将转换结果的高两位存入ADC_Channel_2_Result中,低8位存入ADC_Channel_2_Result1中RL ARL AANL A,#03HMOV 61H,A ;将转换结果的高两位存入61H中MOV A,ADC_Channel_2_ResultRL ARL AANL A,#0FCHMOV 42H,AMOV A,ADC_Channel_2_Result2ANL A,#03HORL A,42HMOV 60H,A ;将转换低8位结果存入60H中POP ACCRET;转换值源码,晶振为22.1184MHz,时间为0.013055msZHUANHUA1:PUSH ACCMOV R2,#00H ;十六进制转换十进制MOV R3,#00HMOV R4,#16YI1: MOV A,60HRLC AMOV 60H,AMOV A,61HRLC AMOV 61H,AMOV A,R2ADDC A,R2DA AMOV R2,AMOV A,R3ADDC A,R3DA AMOV R3,ADJNZ R4,YI1MOV A,R3MOV B,#16 ;取出千位百位DIV ABMOV 50H,AMOV 51H,BMOV A,R2MOV B,#16 ;取出十位个位DIV ABMOV 52H,AMOV 53H,BMOV R0,#50HPOP ACCRETDISP:MOV DPTR,#TAB;显示千位CLR P1.4MOV R0,#50HMOV A,@R0MOVC A,@A+DPTRMOV P2,AACALL DELAYSETB P1.4CLR P1.5 ;显示百位INC R0MOV A,@R0MOVC A,@A+DPTRMOV P2,AACALL DELAYSETB P1.5SETB P1.3CLR P1.6 ;显示十位INC R0MOV A,@R0MOVC A,@A+DPTRMOV P2,AACALL DELAYSETB P1.6CLR P1.7 ;显示个位INC R0MOV A,@R0MOVC A,@A+DPTRMOV P2,AACALL DELAYSETB P1.7RET;开启转换电源延时时间,晶振为22.1184MHz,时间为0.090833msDELAY:MOV R2,#02HDL5:MOV R3 ,#8FHDL2:MOV R4 ,#18HDL1:NOPNOPDJNZ R4,DL1DJNZ R3,DL2DJNZ R2,DL5RETTAB:DB 44H , 0DEH , 62H , 52H , 0D8H , 51H , 41H , 0D6H , 40H ,50H,04H,9EH,22H,12H,98H,11H,01H,96H,00H,10H ;前10位不带小数点后19为带小数点字码表END。

STC12C5A系列AD转换C程序

STC12C5A系列AD转换C程序
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转换,
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while(1)
{
ADC_result = get_AD_result(1);//P1.1 为 A/D 当前通道, 测量并发送结果
Send_Byte(0xAA); //为便于观察, 发送 2 个 0xAA
Send_Byte(0xAA);
}
//---------------------------------------------------------------------
INT8U get_AD_result(INT8U channel)
{
INT8U AD_finished=0; //存储 A/D 转换标志
#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器 BRT 计数。
void initiate_RS232 (void) //串口初始化
{
ES = 0; //禁止串口中断
#include "NEW_8051.H"

stc12c5a56s2单片机AD转换+LED显示程序教案资料

stc12c5a56s2单片机AD转换+LED显示程序教案资料
为此,装潢美观,亮丽,富有个性化的店面环境,能引起消费者的注意,从而刺激顾客的消费欲望。这些问题在今后经营中我们将慎重考虑的。_nop_;
_nop_;
while (ADC_CONTR==0XB1) //判断AD是否转换完成
{
ADC_CONTR=0XA1; //对模数转换器转换结束标志位ADC_FLAG软件清零
delays(1);
ADC_RES=0;
ADC_RESL=0;
P1ASF=0x02;//选P1.1为AD模拟功能通道
ADC_CONTR=0XA1;//转换速度280时钟周期一次,选P1.1为AD通道
_nop_;
_nop_;
_nop_;
自制饰品一反传统的饰品消费模式Fra bibliotek引导的是一种全新的饰品文化,所以非常容易被我们年轻的女生接受。_nop_;
P2 = LED_W[7]; //点亮个位数码管
delays(3);
}
void main()
{
P0=0xff; //P0初始化
delays(3);
while(1)
{
ES=0;
TMOD=0X20;
SCON=0X50;
TH1=0XFB;
TL1=0XFB;
TR1=1;
ADC_CONTR=0X80;//打开AD转换电源
1、购买“女性化”delays(10); //延时后送LED显示,这里必须延时否则显示不稳定
与此同时,上海市工商行政管理局也对大学生创业采取了政策倾斜:凡高校毕业生从事个体经营的,自批准经营日起,1年内免交登记注册费、个体户管理费、集贸市场管理费、经济合同鉴证费、经济合同示范文本工本费等,但此项优惠不适用于建筑、娱乐和广告等行业。//Led_display(val); //显示转换后的数字值

STC12C5A60S2单片机c语言程序代码调试例程

STC12C5A60S2单片机c语言程序代码调试例程

//12T指的是每12个时钟加1与普通C51一样
//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只
能工作在定时器模式2下
//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2
//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2
//工作模式为1T
BRT = 0xff;
#if( Bus_clk == 12 )
CLK_DIV = 0x00;
#elif( Bus_clk == 6 )
CLK_DIV = 0x01;
#elif( Bus_clk == 3 )
CLK_DIV = 0x02;
#elif( Bus_clk == 1500 )
void Delay_ms( uint time )
{
uint t; //延时时间 = (time*1003+16)us while(time--)
{
for( t = 0; t < 82; t++ );
}
}
//***********************************//
//1T指的是每1个时钟加1,是普通C51的12倍
//12T指的是每12个时钟加1与普通C51一样
AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下
//T1定时器速度是普通8051的12倍,即工作在1T模式下
TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数
#define uchar unsigned char

stc12c5a60s2 AD 程序

stc12c5a60s2  AD 程序
//AD速度设置。
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define uchar unsigned char
#define uint unsigned int
/*LCD 各种端口的设置 */
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^3;
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC开始标志位。
/*可写入 4*8 汉字,x的范围是1到4,y的范围是1到8*/
void lcd_string(uchar x,uchar y,char*str)
{
static uchar flag = 0;
uchar i = 0;
if(!flag)
{
lcd_init();
flag = 1;
case 3 : temp = 0x88;
break;
case 4 : temp = 0x98;
break;
default : temp = 0x80;
break;
}
pos = temp + col-1;
LCD_0(0,pos);
}
}
/*字符位置的选定*/

s12单片机内部自带10位AD

s12单片机内部自带10位AD
void display(uint dat) //显示二位void display(uchar bai_c,uchar sh_c,uchar g_c)
{
unsigned long x;
unsigned int TMO;
x=(5000*(long)dat)/1024; //将得到的电压*1000
即:若低四位进行多通道测量 ,那么P1ASF则设置低四位为了,而当采样最低路时,则(CH2~CH0)均为0,选择最低通道
/*********************************************************************************************/
channel &= 0x07; //只取低三位
ADC_CONTR = AD_SPEED;
delay(3); //延时三个时钟周期,使得ADCONTR能及时写入
ADC_CONTR |= channel; //设置通道
}
ADC_CONTR &= 0xE7; //清除标志,一定要用软件清0,其它的不变
//return (ADC_RES);
result=ADC_RES*4+(ADC_RESL&0x03); //获取转换结果,高八位与低二位
/**********************************************************************************************/
#include<STC11F60XE.H> // 包含51单片机寄存器定义的头文件
dula=1;
dula=0;

STC12C5A60S2单片机的AD转换(8位)

STC12C5A60S2单片机的AD转换(8位)

A/D转换测试程序(ADC查询方式)#include “stc12c5a.h”//头文件在STC公司主页上下载#include ”intrins。

h"//与STC12C5A60S2单片机ADC相关的寄存器说明//Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器Sfr ADC_RES = 0xBD;//AD转换结果寄存器高Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位#define ADC_POWER 0x80 //ADC电源开#define ADC_FLAG 0x10 //ADC结束标志位#define ADC_START 0x08 //ADC启动控制位设为开#define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次#define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次#define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次#define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次void AD_init(void);void delay(unsigned int a);unsigned int AD_get(unsigned char n);float AD_work(unsigned char n);void main(){unsigned char i;AD_init();while(1){for(i=0;i<8;i++){AD_work(i);delay(20);}}}unsigned int AD_get(unsigned char n) //第n通道ADC采样函数{unsigned int adc_data;ADC_RES = 0; //清零ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换电源、设定转换速度、设定通道号、AD转换开始_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位由软件清0return 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_val/=100;AD_val=(AD_val*5)/256;//AD的参考电压是单片机上的5v,所以乘5即为实际电压值return AD_val;}void AD_init(void){P1ASF = 0xff;//P1口全部作为模拟功能A/D使用ADC_RES = 0; //清零转换结果寄存器高8位ADC_CONTR = ADC_POWER|ADC_SPEEDLL;delay(2);//等待1ms,让AD电源稳定}void delay(unsigned int a){unsigned int i;while (a-—){i=5000;while(i--);}}。

STC12C5A60S2单片机的AD转换(8位)

STC12C5A60S2单片机的AD转换(8位)

A/D转换测试程序(ADC查询方式)#include “stc12c5a.h”//头文件在STC公司主页上下载#include ”intrins.h”//与STC12C5A60S2单片机ADC相关的寄存器说明//Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器Sfr ADC_RES = 0xBD;//AD转换结果寄存器高Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位#define ADC_POWER 0x80 //ADC电源开#define ADC_FLAG 0x10 //ADC结束标志位#define ADC_START 0x08 //ADC启动控制位设为开#define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次#define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次#define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次#define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次void AD_init(void);void delay(unsigned int a);unsigned int AD_get(unsigned char n);float AD_work(unsigned char n);void main(){unsigned char i;AD_init();while(1){for(i=0;i〈8;i++){AD_work(i);delay(20);}}}unsigned int AD_get(unsigned char n) //第n通道ADC采样函数{unsigned int adc_data;ADC_RES = 0;//清零ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换电源、设定转换速度、设定通道号、AD转换开始_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位由软件清0return 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_val/=100;AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值return AD_val;}void AD_init(void){P1ASF = 0xff; //P1口全部作为模拟功能A/D使用ADC_RES = 0;//清零转换结果寄存器高8位ADC_CONTR = ADC_POWER|ADC_SPEEDLL;delay(2);//等待1ms,让AD电源稳定}void delay(unsigned int a){unsigned int i;while (a——){i=5000;while(i--);}}。

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

STC12C5A60S2单片机的10位AD转换程序
#include"stc12c5a.h" //头文件在STC公司主页上下载
#include"stdio.h" //输入输出函数
#include"intrins.h"
//------------------------------------------------------------------------------
void AD_init(); //初始化AD
void serial_init();
void delay(unsigned int a);
float AD_work(unsigned char channel);
unsigned int AD_get(unsigned char channel);
//------------------------------------------------------------------------------
void main() //主程序
{
AD_init();??? //A/D转换初始化
serial_init();?? //串口初始化
while(1)
{
?? unsigned char i;
?? for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值
?? {
??? TI=1;??? //使用printf函数前须先将发送标志位TI置1
??? printf("The P1.%bd voltage is %f\n",i,AD_work(i));
??? TI=0;
??? delay(1000); //延时约1s
?? }
}
}
//------------------------------------------------------------------------------
unsigned int AD_get(unsigned char channel)
{
ADC_CONTR=0x88|channel;??? //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG?? ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10));??? //等待转换完成
ADC_CONTR&=0xe7;????? //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL);?? //返回AD转换完成的10位数据(16进制)
}
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
{
float AD_val;???? //定义处理后的数值AD_val为浮点数
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(channel); //转换100次求平均值(提高精度)
AD_val/=100;
AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值return AD_val;
}
//------------------------------------------------------------------------------
void delay(unsigned int a) //延时约1ms
{
unsigned int i;
while (--a!=0)
for(i=600;i>0;i--);?? //1T单片机i=600,若是12T单片机i=125
}
//------------------------------------------------------------------------------
void serial_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd; //设置9600波特率
SCON=0x50; //串口方式1,允许接收
TR1=1;
}
//------------------------------------------------------------------------------
void AD_init()
{
P1ASF=0xff; //P1口全部作为模拟功能AD使用
ADC_RES=0;?? //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80;//开启AD电源
delay(2);?? //等待1ms,让AD电源稳定
}
/*。

相关文档
最新文档