STC12四路并行AD转换参考程序段
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;
STC单片机AD转换结果

PIASF=0 ; //关闭ADC通道
EA=1 ; //打开总中断使能 } Nhomakorabea{
while(--t);
}
unsigned char ADC_run(unsigned char pass) //只要输入0到7它就可以把AD结果返回
{
unsigned char temp ;
AUXR1=0x04 ;// 取10位AD的低8位结果
EA=0 ; //总中断关闭
//选择是那个通道
temp=0x01<<pass ; //先把通道放在临时寄存器上
PIASF=temp ; //把P1.0设定为AD输入
temp=0xe0+pass ;
ADC_CONTR=temp; //启动ADC转换电源同时先择一路
Delay2xus(30); //延时一会
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h> //
sfr ADC_CONTR = 0xbc ; //AD控制位 不可位寻址
sfr ADC_RES = 0xbd ; //AD转换结果8位寄存器
temp=0xe8+pass ;
ADC_CONTR=temp ; //开始转换
Delay2xus(30); //延时一会
while(ADC_CONTR&0x08==0); //等待 //P1.0路转换结束
// return ADC_RES; //返回ADC_RES
return ADC_RESL; //返回ADC_RESL
stc12c5a56s2单片机AD转换+LED显示程序教案资料

_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官方手册AD程序(中文注释)

sfr ADC_RES = 0xBD; //ADC的高8位结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC的低2位结果寄存器
sfr P1ASF = 0x9D; //P1辅助功能控制寄存器
/*ADC操作定义常量*/
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
void InitUart();
void SendData(BYTE dat); void Delay(WORD n);
}
/*----------------------------
Uart初始化
----------------------------*/
void InitUart()
{
SCON = 0x5a; //8位数据,无校验位
TMOD = 0x20; //T1为8位自动重载
void InitADC( )
{
P1ASF = 0xff; //设置所有P1为模拟输入端口
ADC_RES = 0; //清除先前的结果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC 延迟启动和启动/转换的电源
while (1);
}
/*----------------------------
ADC函数中断服务例程
用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工程里。
基于STC12C56系列单片机的AD转换C程序

P1M0|=0x10;P1M1|=0x10;ADC_CONTR=0xe4;break;case5:
P1M0|=0x20;P1M1|=0x20;ADC_CONTR=0xe5;br|=0x40;ADC_CONTR=0xe6;break;case7:
//延时1msswitch(Channel){case0:P1M0|=0x01;P1M1|=0x01;//设置开漏
ADC_CONTR=0xe0;//选择AD转换通道break;case1:
P1M0|=0x02;P1M1|=0x02;ADC_CONTR=0xe1;break;case2:
P1M0|=0x04;P1M1|=0x04;ADC_CONTR=0xe2;break;case3:
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
P1M0|=0x80;P1M1|=0x80;ADC_CONTR=0xe7;break;}delay_us(100);
ADC_DATA=0x00;ADC_CONTR|=0x08;//启动AD转换delay_us(200);//等待
转换完成ADC_CONTR=0xe7;//清0ADC_FLAG,ADC_START位,停止AD
基于STC12C56系列单片机的AD转换C程序
/****************STC12c56 AD转换
入口参数:通道数(0,1,2,3,4,5,6,7)返回值:AD转换结果
*****************/
#includereg51.h
sfrADC_CONTR=0xc5;//AD转换寄存器sfrADC_DATA=0xc6;//AD转换结
STC12C5A60S2的AD转换,PWM电压控制,液晶显示程序
/*---------------------------------------------------------------------------------------------------------------------------*//*--************************功能【AD转换,PWM电压控制,液晶显示】**************************--*/ /*--************************芯片:【STC12C5A60S2】******************************--*//*--************************液晶:【LCD1602】***********************************--*//*--************************ADC管脚:【P1.7 】***************************--*//*--************************检测范围:【0.00~12.5V】***************************--*//*---------------------------------------------------------------------------------------------------------------------------*/#include "stc12c5a60s2.h"#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define _Nop() _nop_()/*------------------------以下为LCD1602显示模块定义-----------------------*/unsigned char data_char_table[]= {"0123456789ABCDEF"}; //LCD数据unsigned char Lcd_Dis1_table[] = {"Setvalue: V"}; //第一行显示框架unsigned char pos_char_table[] = {" 9A.C0 "}; // 显示位置unsigned char Lcd_Dis2_table[] = {"V oltage : V"}; //第二行显示框架unsigned char num_char_table[] = {" 9A.CD V"}; // 显示位置float show;float NUM;static uchar ldata=50; //作为显示的数据sbit lcd_rs_port = P2^0; //定义LCD控制端口,根据硬件调整sbit lcd_rw_port = P2^1;sbit lcd_en_port = P2^2;#define lcd_data_port P0sbit key1 = P3^7; //定义按键1sbit key2 = P3^6; //定义按键2sbit key3 = P3^5; //定义按键3sbit key4 = P3^4; //定义按键4sbit key5 = P3^3; //定义按键5sbit key6 = P3^2; //定义按键6/************定义相应操作位***************/#define ADC_POWER 0x80 //ADC电源控制位,0:关闭,1:打开#define ADC_FLAG 0x10 //ADC结束标志位#define ADC_START 0x08 //ADC启动控制位#define ADC_SPEEDLL 0x00 //540 clocks___________选择转换速度/*------------------------以下为相关函数声明------------------------------*/void InitADC(); //ADC初始化uint GetADCResult(uchar ch);void Delay(uint n); //延时程序void delay_1ms(uchar x);void lcd_delay(uchar ms); //LCD1602 延时void lcd_busy_wait(); //LCD1602 忙等待void lcd_command_write(uint command); //LCD1602 命令字写入void lcd_system_reset(); //LCD1602 初始化void lcd_char_write(uint x_pos,y_pos,lcd_dat); //LCD1602 字符写入void lcd_bad_check(); //LCD1602 坏点检查void Num_to_Disp(uint i, uint Num); //显示数据处理void LcdDisp(uint j, uint num); //液晶显示函数void DelayMs(uchar ms);void init_PWM();void PWM1_change(uchar type,uchar change);void PWM1_set(uchar empty);/*-------------------------------- ADC 取值------------------------------*/uint GetADCResult(uchar ch){ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;_nop_(); //Must wait before inquiry_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flagADC_CONTR &= ADC_FLAG; //Close ADCreturn (ADC_RES*4 + ADC_RESL); //Return ADC result}/*---------------------------- 初始化ADC特殊功能寄存器-------------------*/void InitADC( ){P1ASF = 0x80; //Set P1.7 as input portADC_RES = 0; //Clear previous resultADC_RESL = 0;ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;Delay(20); //ADC power-on delay and Start A/D conversion}/*---------------------------- LCD1602相应函数---------------------------*////////////////以下为LCD显示数据处理/////////////////void Num_to_Disp(uint i, uint Num){int xx, yy, zz;NUM = (Num * 4.68/ 1024.0); //计算公式:10-bit A/D Conversion Result = 1024 x (Vin / Vcc) NUM =NUM *29.1/9.9;xx = (int)NUM;yy = (int)((NUM - (float)(xx)) * 10);zz = (int)((NUM - (float)(xx)) * 100)%10;/********************第一行数字*******************************/pos_char_table[9]= data_char_table[i/100]; //输入值十位pos_char_table[10]= data_char_table[i%100/10]; //输入值个位pos_char_table[12]= data_char_table[i%10]; //输入值小数点后一位/********************第二行数字*******************************/num_char_table[9] = data_char_table[xx / 10]; //电压值十位num_char_table[10]= data_char_table[xx % 10]; //电压值个位num_char_table[12]= data_char_table[yy]; //电压值小数点后一位num_char_table[13]= data_char_table[zz]; //电压值小数点后两位}//////////////////以下为LCD显示////////////////////void LcdDisp(uint j, uint num){uint i=0;for (i=0;i<16;i++){lcd_char_write(i,0,Lcd_Dis1_table[i]);lcd_char_write(i,1,Lcd_Dis2_table[i]); //显示框架(固定文字)}Num_to_Disp(j, num);for(i = 9; i < 14; i++){lcd_char_write(i,0,pos_char_table[i]); //显示输入值}for(i = 9; i < 14; i++){lcd_char_write(i,1,num_char_table[i]); //显示电压}delay_1ms(100);}//////////////以下是LCD1602驱动程序////////////////void lcd_delay(uchar ms) /*LCD1602 延时*/{uchar j;while(ms--){for(j=0;j<250;j++){;}}}void lcd_busy_wait() /*LCD1602 忙等待*/{lcd_rs_port = 0;lcd_rw_port = 1;lcd_en_port = 1;lcd_data_port = 0xff;while (lcd_data_port&0x80);lcd_en_port = 0;}void lcd_command_write(uint command) /*LCD1602 命令字写入*/ {lcd_busy_wait();lcd_rs_port = 0;lcd_rw_port = 0;lcd_en_port = 0;lcd_data_port = command;lcd_en_port = 1;lcd_en_port = 0;}void lcd_system_reset() /*LCD1602 初始化*/{lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_command_write(0x0c);}void lcd_char_write(uint x_pos,y_pos,lcd_dat) /*LCD1602 字符写入*/ {x_pos &= 0x0f; /* X位置范围0~15 */y_pos &= 0x01; /* Y位置范围0~ 1 */if(y_pos==1) x_pos += 0x40;x_pos += 0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port = 1;lcd_rw_port = 0;lcd_en_port = 0;lcd_data_port = lcd_dat;lcd_en_port = 1;lcd_en_port = 0;}void lcd_bad_check() /*LCD1602 坏点检查*/{char i,j;for(i=0;i<2;i++){for(j=0;j<16;j++) {lcd_char_write(j,i,0xff);}}lcd_delay(200);lcd_delay(200);lcd_delay(200);lcd_delay(100);lcd_delay(200);lcd_command_write(0x01); /* clear lcd disp */}//////////////////以上是LCD1602驱动程序/////////////////*----------------------------- 延时程序---------------------------*/ void Delay(uint n){uint x;while (n--){x = 500;while (x--);}}/*1MS为单位的延时程序*/void delay_1ms(uchar x){uchar j;while(x--){for(j=0;j<125;j++){;}}}void DelayMs(uchar ms) //延时程序{uint i;while(ms--){for(i = 0; i < 850; i++);}}void init_PWM(){CCON=0X00;CH=0;CL=0;CMOD=0X02; //0X00:以系统时钟/12 为时钟源,0X02:系统时钟/2,0x08:系统时钟PWM1_set(0X80);//起始占空比,0XC0:占空比为25%,0X80:占空比为50%,0X40:占空比为75% CCAPM1=0X42; //0X42:8位PWM P1.4输出,无中断;0X53:8位PWM输出,下降沿产生中断;0X63:上升沿产生中断;0X73:跳变沿产生中断CR=1; //计时器开始工作}void PWM1_set(uchar empty) //直接设置占空比{CCAP1L=empty;CCAP1H=empty;}void PWM1_change(uchar type,uchar change) //type=0减占空比,1增加占空比change: 0X0C约5%,0X05约2%{if(type==0){CCAP1L+=change;CCAP1H+=change;}else{CCAP1L-=change;CCAP1H-=change;}}void main(){init_PWM(); //初始化,PWM输出lcd_system_reset(); //LCD1602 初始化lcd_bad_check(); //LCD1602 坏点检查InitADC(); //初始化ADC特殊功能寄存器while(1) //按键增减PWM占空比{if(key1==0) //按键1按下{DelayMs(1); //按键消抖while(key1==0); //按键释放才跳出执行下一步ldata++; //显示数据加0.1}else if(key2==0) //按键2按下{DelayMs(1); //按键消抖while(key2==0); //按键释放才跳出执行下一步ldata--; //显示数据减0.1}else if(key3==0) //按键3按下{DelayMs(1); //按键消抖while(key3==0); //按键释放才跳出执行下一步ldata+=10; //显示数据加1}else if(key4==0) //按键4按下{DelayMs(1); //按键消抖while(key4==0); //按键释放才跳出执行下一步ldata-=10; //显示数据减1}else if(key5==0) //按键5按下{DelayMs(1); //按键消抖while(key5==0); //按键释放才跳出执行下一步ldata=0; //清0}LcdDisp(ldata,GetADCResult(7)); //液晶1602显示输入电压值和AD采集电压值(P1.7)NUM=10*NUM;show=ldata;if((NUM<(show-0.1))||(NUM>(show+0.1))){if(NUM<(show-0.1)){if((show-0.1)-NUM>1)PWM1_change(1,0X05);elsePWM1_change(1,0X01);}else{if(NUM-(show+0.1)>1)PWM1_change(0,0X05);elsePWM1_change(0,0X01);}Delay(500);}else{Delay(2000);}}}。
STC12C5410AD单片机的AD程序两位数码管显示
STC12C5410AD单片机的AD程序两位数码管显示/*用的是主程序中转换AD,在以后的使用中要用中断的方法才能节约CPU的使用率,本程序中是用P1.0为输入,用的是单片机本身的10位AD,最大1024分辨率,除以10后最大为102,用两位的数码管,所以只能在99以内,在程序中大于99的数,就只能显示99,也可用三位数码管显示.*/#include;#define uchar unsigned char#define uint unsigned int#define duan P1 //数码管段码输出端sfr ADC_CONTR = 0xc5;sfr ADC_DATA = 0xc6;sfr ADC_LOW2 = 0xbe;sfr P1M0 =0x91;sfr P1M1 =0x92;sbit sw=P2^7; //数码管的十位选通sbit gw=P2^6; //数码管的个位选通uint shu,ad_shu;uchar code tab[]={ 0xEE,/*0*/0x48,/*1*/0xD6,/*2*/0xDC,/*3*/0x78,/*4*/0xBC,/*5*/0xBE,/*6*/0xC8,/*7*/0xFE,/*8*/0xFC,/*9*/};void delay( ){uchar a;for(a=10;a>;0;a--); }void desplay(int bb) {uint ab;ab=bb;if(ab>;99) ab=99; duan=tab[ab/10];sw=0;delay();sw=1;duan=tab[ab%10];gw=0;delay();gw=1;}void main(){ADC_CONTR=0xe0; //开A/D转换器P1M0=0x01; //定义P1.0为AD输入端口,让P1.0为高阻态P1M1=0x01; //定义P1.0为AD输入端口,让P1.0为高阻态while(1){ADC_CONTR|=0x08;while((ADC_CONTR & 0x10)==0);ADC_CONTR&=0xe7;ad_shu=ADC_DATA;ad_shu。
STC12C2052AD AD转换C程序 +PWM输出功能实现
STC12C2052AD AD转换C程序+PWM输出功能实现
功能:STC12C2052AD AD转换C程序+PWM输出功能成功使用。
应用:AD检测电压进行过欠压保护(继电器控制)+PWM把直流电压斩波成脉动直流。
板子功能:给手机电池充电。
降压用的LM317,小电流应用应该够了。
没时间去买开关管,就用的9013开关。
图纸:
//以下是成功了的程序。
如果你需要应用在你自己的项目中,您只需要更改io就能直接应用了
//程序的完整版本下载地址:
#include //stc单片机专用的头文件
#include
#define uchar unsigned char
#define uint unsigned int
#define AD_SPEED 0x60 //0110,0000 1 1 270个时钟周期转换一次,
/************河北正定欢迎您!少占鱼欢迎您!******************************/
//
sbit M=P1 ; //过压指示灯
sbit N=P1 ; //欠压指示灯
sbit LED=P1 ; //工作正常灯
sbit CONTRL=P3 ; //输出控制端
sbit PWM=P3 ;
/****************************************************************/
void pwm();
void delayms(uint);
uint ADC();。
宏晶12c5a32s2_AD转换程序
{
ADC_result = get_AD_result(1);//P1.1 为 A/D 当前通道, 测量并发送结果
Send_Byte(0xAA); //为便于观察, 发送 2 个 0xAA
Send_Byte(0xAA);
//#include <REG52.H>
#include <intrins.H>
#include "NEW_8051.H"
//---------------------------------------------------------------------
typedef unsigned char INT8U;
#define Fosc 18432000
#define BAUD 115200 //波特率
#define RELOAD_115200 (256 - (Fosc/16*10/BAUD+5)/10 ) //1T模式, 波特率加倍
#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快 12 倍
// 本程序演示 STC12C5AxxAD 系列 MCU 的 A/D 转换功能。时钟 18.432MHz
// 转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。
//---------------------------------------------------------------------
#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器 BRT 计数。
void initiate_RS232 (void) //串口初始化