谁有c8051f单片机AD转换(c)急用!

作者&投稿:况霭 (若有异议请与网页底部的电邮联系)
跪求会C8051F020单片机的,要用C语言写出测量电压,就是AD转换的程序~

/*****************************************************************************
LCD1602 4线AD显示实验 本实验采用AIN0输入 实验时将跳线帽接至+5V
将J16短接EF0 J14短接内部基准 *****************************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define SYSCLK 22118400#define DataPort P0
sbit LCM_V0=P0^0;
sbit LCM_RS=P0^1;
sbit LCM_RW=P0^2;
sbit LCM_EN=P0^3;
bit aa;ulong AD;
uint mm;
uchar count=0;
uchar temp_l;
uchar temp_h;
uchar dispbuf[6];
uchar code shen[]={"AIN0: mV"};
uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};
void PORT_Init (void)
{
XBR2 = 0x40; //使能交叉开关
//推挽输出
P0MDOUT = 0xff;
}void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*打开外部晶体振荡器*/
for (i=0; i < 256; i++) ; /*延时*/
while (!(OSCXCN & 0x80)) ; /*查询外部晶体是否稳定起振*/
OSCICN = 0x88; /*用外部晶体作为系统时钟,并使能时钟丢失检测*/
}/*******************************/
void delay(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<121;y++);
}
/*******************************/
void EN1(void)
{
LCM_EN=1;
delay(100);
LCM_EN=0;
delay(100);
}
/*******写命令**********/
void lcd_wmc(uchar CMD)
{
DataPort=(CMD& 0xf0);
LCM_RS=0;
LCM_V0=0;
EN1();
DataPort=(CMD& 0x0f)<<4;
LCM_RS=0;
LCM_V0=0;
EN1();
}
/*******写数据***********/void lcd_wmd(uchar dataW)
{
DataPort=(dataW& 0xf0);
LCM_RS=1;
LCM_V0=0;
EN1();
DataPort=(dataW& 0x0f)<<4;
LCM_RS=1;
LCM_V0=0;
EN1();
}/*******更新缓冲区子程序*******/
void newbuf()
{
dispbuf[0]=AD/1000;
dispbuf[1]=(AD%1000)/100;
dispbuf[2]=(AD%100)/10;
dispbuf[3]=AD%10;
AD=0;
mm=0;
}
/*******显示子程序**********/
void disp(uchar dispadd)
{
uchar tmp,i;
lcd_wmc(dispadd);/*******写命令 主要是写地址**********/ for(i=0;i<4;i++)/*******显示4位数据**********/
{
tmp=dispbuf[i];
tmp=word[tmp];
lcd_wmd(tmp);
}
}/*******初始化液晶*******/
void lcd_init()
{
uchar i;
lcd_wmc(0x01);
lcd_wmc(0x28);
lcd_wmc(0x0c);
lcd_wmc(0x06);
lcd_wmc(0x80);
for(i=0;i<12;i++)
lcd_wmd(shen[i]);
lcd_wmc(0xc0);
}//函数功能: 定时器3初始化
//入口参数: int countsvoid Timer3_Init (int counts)
{
TMR3CN = 0x00;
TMR3RLL = -counts; //初始化重载值
TMR3L = 0xffff; //设置自动重载值
TMR3CN |= 0x04;
}//函数功能: ADC0初始化
void ADC_Init(void)
{
ADC0CN |=0x84; /*ADC0使能,定时器3溢出使能模/数转换*/
REF0CN |=0x03; /*内部电压基准提供从VREF脚输出,ADC0电压基准取自VREF0*/
ADC0CF |=0x50; /*转换周期和增益为1*/
AMX0CF |=0x00; /*单端输入*/
EIE2 |=0x02; /*ADC0转换结束中断*/
}//函数功能: AD中断服务程序
void ADC_ISR (void) interrupt 15
{ AD0INT=0; //清A/D中断标志
temp_l=ADC0L;
temp_h=ADC0H;
mm=temp_h*256+temp_l;
AD+=mm;
count++;
if(count==20)
{
AD=AD/20;
AD=AD*2430/4096;
aa=1;
count=0;
}
}void main (void)
{
uchar i;
WDTCN = 0xde;
WDTCN = 0xad; //禁止看门狗定时器
SYSCLK_Init ();
PORT_Init();
lcd_init();
LCM_V0=0;
Timer3_Init (SYSCLK / 25000 );
ADC_Init();
EA = 1;
AMX0SL |=0x00; //通道0
delay(1);
while (1)
{
if(aa)
{
newbuf();
disp(0x86);
aa=0;
}
}
}

我以前写的C8095F040的模块,你自己看看吧,里边有ADC0的模块,都是调试好能用的

C8051F同时实现AD和串口收发的程序

#include <C8051F020.h>
#include "stdio.h"

sfr16 TMR3RL = 0x92; //定时器3重装载寄存器
sfr16 TMR3 = 0x94; //定时器3计数器
sfr16 DP =0x82;
sfr16 ADC0 =0xbe;
sfr16 ADC0GT =0xc4;
sfr16 ADCOLT =0xc6;
sfr16 RCAP2 =0xca;
sfr16 T2 =0xcc;
sfr16 RCAP4 =0xe4;
sfr16 T4 =0xf4;
sfr16 DAC0 =0xd2;
sfr16 DAC1 =0xd5;

#define uchar unsigned char
#define uint unsigned int

//----------------------------------------------------------------------
//参数设置区
//----------------------------------------------------------------------
#define BAUDRATE 9600 //波特率bps
#define SYSCLK 11059200 //外部晶振,修改也要修改OSCXCN
#define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL
#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1
#define TXVAL (256-SYSCLK*(SMODVAL+1)/BAUDRATE/384) //定时器初值
#define MAX_LEN 1//每次接收/发送字符串的长度
#define SAMPLERATE0 5000
#define NUM_SAMPLES 1
#define TURE 1
#define FALSE 0

//---------------------------------------------------------------------
//全局变量
//---------------------------------------------------------------------
sbit LED = P1^6; //LED '1'亮 '0'灭
bit readFlag = 0; //读标志
uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较
uchar idATa trdATa[MAX_LEN]; //要接收/发送的字符串
xdATa unsigned samples[NUM_SAMPLES];

bit ADC0_DONE;

//----------------------------------------------------------------------
//子函数声明
//----------------------------------------------------------------------
void SYSCLK_Init(void); //系统时钟初始化
void PORT_Init(void); //端口初始化
void UART0_Init(void); //串口UART0初始化
void Send_Char(uchar ch); //发送单个字符
void Send_String(uchar * str, uint len); //发送一个字符串
void UART0_ISR(); //串口中断服务程序,接收字符
void Timer3_Init(uint counts); //定时器3初始化
void Timer3_ISR(void); //定时器3中断服务程序
void ADC0_Init (void);
//----------------------------------------------------------------------
//主函数
//----------------------------------------------------------------------
void main(void)
{unsigned short i;
floAT temp,k;
WDTCN = 0xde; //禁止看门狗
WDTCN = 0xad;
P6&=0x02;
here:
i=0;
SYSCLK_Init(); //时钟初始化
PORT_Init(); //端口初始化
UART0_Init(); //串口初始化
Timer3_Init(SYSCLK/12/10); //定时器初始化
EA = 1; //开全局中断
ADC0_Init();
AD0INT=0;
AD0BUSY=1;
while(AD0INT==0);
temp=ADC0;
k=(temp*2.4)/4096;
printf("\n");
printf("voltage%f",k);
printf("\n");
i=0;
while(1)

{

{if(readFlag) //已经读取
{
readFlag = 0; //清零
Send_String(trdATa,MAX_LEN); //发送字符串
i++;
if(i==10000){goto here;}
}

}

}}
//----------------------------------------------------------------------
//子函数具体实现
//----------------------------------------------------------------------

//系统时钟初始化
void SYSCLK_Init(void)
{
uint i;
OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111
for(i=0;i<256;i++); //等待>1ms
while(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定
OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000
}

//端口初始化
void PORT_Init(void)
{
XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100
XBR1 = 0x00;
XBR2 = 0x40; //交*开关使能
P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011
P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口 0100,0000
}

//串口初始化

void UART0_Init(void)
{
SCON0=0x50;
TMOD=0x20;
TH1=-(SYSCLK/BAUDRATE/16);
TR1=1;
CKCON|=0x10;
PCON|=0x80;
TI0=1;
TR0 = 1;
ES0 =1; //UART0中断开启 ADC时候要屏蔽
TR1 = 1; //启动定时器T1
}

//定时器初始化
void Timer3_Init(uint counts)
{
TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基
TMR3RL = -counts; //初始化重装载值
TMR3 = 0xffff; //设置为立即重装载
EIE2 |= 0x01; //T3中断开启
TMR3CN |= 0x04; //启动T3
}

//发送单个字符
void Send_Char(uchar ch)
{
SBUF0 = ch; //送入缓冲区1
while(TI0 == 0); //等待发送完毕
TI0 = 0; //软件清零
}

//发送字符串,调用Send_Char() len字符串长度
void Send_String(uchar * str,uint len)
{
uint k = 0;
do
{
Send_Char(*(str + k));
k++;
} while(k < len);

}

//定时器3中断服务程序
void Timer3_ISR(void) interrupt 14 using 0
{
TMR3CN &= ~(0x80); //清TF3
LED = ~LED;
}

//UART0中断服务程序. 接收字符
void UART0_ISR(void) interrupt 4 using 1
{
uchar rxch;
if(RI0) //中断标志 RI0=1 数据完整接收
{
RI0 = 0; //软件清零
rxch = SBUF0; //读缓冲
if(readCounts>=MAX_LEN)
{
readCounts = 0;
readFlag = 1;
}
trdATa[readCounts] = rxch; //存入数组,供发送
readCounts++;
}
}

//ADC0_Init
//配置ADC0使用定时器3溢出作为转换启动信号,转换信号结束时候产生中断,使用左对齐输出方式
//允许ADC0,但保持ADC0转换结束中断为禁止状态

void ADC0_Init(void)
{
ADC0CN=0x04;
REF0CN=0x07;
AMX0SL=0x00;
ADC0CF=(SYSCLK/2500000)<<3;
ADC0CF&=~0x07;
EIE2&=~0x02;
AD0EN=1;
}
//-------------------------------------------------------------
//程序结束
//-----------------------------------------------------

/***************************************************************
功能:实现ADC采样芯片外的模拟电压,通过LCD显示,并通过串口(J13)发送到PC机
注:试验时把ADC0的工作基准VREF0(J7_5和J7_6或J7_2和J7_6)和LCD电源跳线(J18_1和J18_2)联接好!
作者:ZDP
时间:2005-11-30
版本:V1.0
用外部基准:
J7
NC 1 2 内部VREF
外部VREF 3 4 内部DAC工作基准输入
外部VREF 5 6 内部ADC0工作基准输入
外部VREF 7---8 内部ADC1工作基准输入
或用内部基准:
J7
NC 1 2- 内部VREF
外部VREF 3 4 | 内部DAC工作基准输入
外部VREF 5 6 | 内部ADC0工作基准输入
外部VREF 7 8- 内部ADC1工作基准输入
***************************************************************/
#include <c8051f020.h> // SFR declarations
#include <stdio.h>
#include <INTRINS.H>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------

sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
sfr16 T4 = 0xf4; // Timer4
sfr16 DAC0 = 0xd2; // DAC0 data
sfr16 DAC1 = 0xd5; // DAC1 data

#define BAUDRATE 115200 // Baud rate of UART in bps
#define SYSCLK 22118400 // SYSCLK frequency in Hz
#define SAMPLE_RATE 50000 // Sample frequency in Hz
#define INT_DEC 256 // integrate and decimate ratio
#define AMX0SL_AIN 8 // 0=AIN0....7=AIN7,8=TEMP

void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void ADC1_Init (void);
void Timer3_Init (int counts);
void ADC1_ISR (void);
void LCD_Init(void);

unsigned char NCDdata[3]={0x30,0x30,0x30};
unsigned char result;
unsigned char *lcdpoint; //指向 lcddata数组的指针
unsigned char lcd_data_count; //要显示的数据个数

void main (void) {
unsigned int temperature,x;
unsigned char data1;

WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;

SYSCLK_Init (); // initialize oscillator
PORT_Init (); // initialize crossbar and GPIO
UART0_Init (); // initialize UART0
Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
// sample rate

ADC1_Init (); // init ADC

AD0EN = 1; // enable ADC

EA = 1;
while(result==0); //等于0,侧等待
while (1) {
EA = 0; // 关中断
temperature = result;
temperature&=0x00ff;
//LCD显示数据处理

NCDdata[0]=result/100+0x30;
NCDdata[1]=(result%100)/10+0x30;
NCDdata[2]=(result%100)%10+0x30;
EA = 1; //开中断
//转换为实际温度数据
printf ("Temperature is %u\n", temperature);//把温度数据通过串口发送至PC机

LCD_Init(); //LCD初始化
P2 = 0xA0; //准备送数据
lcdpoint=&NCDdata; //取地址
for(lcd_data_count=3;lcd_data_count>0;lcd_data_count--)
{
data1=*lcdpoint; //读出数据
P3 = data1; //写数据到端口
P2 = 0X20;
P2 = 0XA0; //控制LCD
lcdpoint++;
for(x=0;x<0x5000;x++);
}
for(data1=0;data1<50;data1++)
{
for(x=0;x<0xffff;x++)
{_nop_();}
}
}
}

//-----------------------------------------------------------------------------
// SYSCLK配置
//-----------------------------------------------------------------------------
// 配置系统时钟使用外部晶振22.1184MHz
void SYSCLK_Init (void)
{
int i; // delay counter

OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)

while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle

OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}

//-----------------------------------------------------------------------------
// PORT配置
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x04; // Enable UART0
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P1MDIN = 0xFE;
P0MDOUT |= 0x01; // enable TX0 as a push-pull output
P2MDOUT = 0xe0; // P2口设为推挽方式
P3MDOUT = 0xff; // P2口设为推挽方式
}

//-----------------------------------------------------------------------------
// UART0配置
//-----------------------------------------------------------------------------
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
void UART0_Init (void)
{
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD00 = 1
TI0 = 1; // Indicate TX0 ready
}

//-----------------------------------------------------------------------------
// ADC0配置,T3定时启动ADC
//-----------------------------------------------------------------------------
void ADC1_Init (void)
{
ADC1CN = 0x82; // ADC0 T3定时采样
REF0CN = 0x07; // 启用内部基准源
AMX1SL = AMX0SL_AIN; // 选择采样输入源
ADC1CF = 0xB1; // PGA gain = 1,1MHz转换频率
EIE2 |= 0x08; // 启用 ADC 中断
}

//-----------------------------------------------------------------------------
// Timer3配置,T3定时启动ADC
//-----------------------------------------------------------------------------
void Timer3_Init (int counts)
{
TMR3CN = 0x02;
TMR3RL = -counts;
TMR3 = 0xffff;
EIE2 &= ~0x01;
TMR3CN |= 0x04;
}

//-----------------------------------------------------------------------------
// ADC0采样中断
//-----------------------------------------------------------------------------
void ADC0_ISR (void) interrupt 17
{
static unsigned int_dec=INT_DEC;
static int accumulator=0L;

ADC1CN &= ~0x20; // 清 ADC 中断标志位

accumulator += ADC1; // 累加ADC采样数据
int_dec--; // 指针减1

if (int_dec == 0) { // 累加完了吗?
int_dec = INT_DEC; // 指针复位
result = accumulator>>8;
accumulator = 0; // 累加和变量清0
}
}
//LCD初始化
void LCD_Init(void)
{unsigned long x;
P2 = 0X80;
for(x=0;x<1000;x++);
//P7 = 0x30; /*一行显示*/
P3 = 0x38; /*两行显示*/
P2 = 0X00;//0x08;
P2 = 0X80;//0x09;
for(x=0;x<1000;x++);
P3 = 0x0e;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<1000;x++);
P3= 0x06;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<5000;x++);
P3 = 0x01;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<5000;x++);
}


51单片机一定需要外加震荡电路才能工作的么???
这个不一定的,要看什么型号的单片机了,有些单片机内部有RC震荡电路的,但内部RC电路的精准度不高,所以对频率准确性要求高肯定要外接震荡电路的

希望推荐一种51单片机?
你到代码不到4k,推荐at89s52,8k闪存,支持isp(可以省去昂贵的编程器投入)烧录,价格也便宜,5元左右,也可以用stc的89c52rc,这个支持串口下载,但贵一点,7元左右。这两款都是51系列目前较流行的,因为不用专用编程器就可以写程序。

C8051F310单片机问题,怎样烧写到单片机中
1、看看编出来的代码生成了没有,生成的路径对不读。2、仿真器 和主板 有没有链接到你电脑,如果没有那肯定不能下载代码。3、建议你早点学习ARM + Linux,这样有前途写,单片机貌似只有小公司和便宜的东西才会用。

哪位大哥帮我翻译这段英文说明书
地址范围(重叠为8K的界限) 。外部数据存储器地址空间可以映射到 采用片上存储器只,场外晶片记忆体,或两者的结合(地址,最多为8K指示onchip ,以上为8K指示emif ) 。该emif也可配置为复用或非复用 地址\/数据线。关于c8051f12x和c8051f130 \/一日起,在单片机的程序存储器的128 k字节库 快闪记忆...

单片机中 ADC 是如何进行采集的???
nRF2401是单片射频收发芯片,工作于2.4GHz~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片功耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA。其独有的DuoCeiver技术使nRF2401可以使用同一天线...

新型8位单片机主要在哪些方面有所发展,给系统应用带来什么好处?_百度...
1、运算速度大大提高,很多都是单机周指令,最高速度在51的12倍以上,最多可以达到20-25MIPS(C8051F,STM8),51是1 MIPS;2、RAM、ROM容量,优秀的单片机片内程序存储器可以达到62K或者64K,RAM最高达到8K,有1K、2K RAM的比比皆是;3、精简指令集,指令比51少很多;4、更多的IO口;5、更多...

8051的技术发展
形成了嵌入式系统应用热潮。在这个技术潮流中,8051又扮演了嵌入式系统内核的重要角色。在MCU向SoC过渡的数、模混合集成的过程中,ADI公司推出了ADμC8xx系列,而公司则实现了向SoC的C8051F过渡;在PLD向SoC发展过程中,Triscend公司在可配置系统芯片CSoC的E5系列中便以8052作为处理器内核。

C8051F310单片机如何实现秒、分、小时计时的?
用定时器计时,计算很麻烦,而且误差大,断电后时间丢失等,最好的办法是用片外时钟芯片,最通用的如DS1302,国产的有HYM1302,使用一样,很简单,熟悉后对做具体的产品设计也很有帮助,因为做产品都是用专业时钟芯片的

目前新型8位单片机的种类、特点及其适用场合
8位单片机还是51占统治地位,其主要特点是集成了较为丰富的常用外设,包括AD,PWM,COMPARE,SPI,I2C,等。其主要使用于传感器前端的数据采集和简单的逻辑功能控制,主要的优势在于成本低,每片成本可控制在3-5元RMB。

单片机与soc有什么区别
soc是单片机发展的第三个阶段 也是目前的发展阶段 称之为片上系统(System on Chip)以前还有两个发展阶段 SCM即单片微型计算机(Single Chip Microcomputer)阶段 和 MCU即微控制器(Micro Controller Unit)阶段 MCU目前还是广泛运用的 单片机和soc 没有可比性 soc 只是单片机的一发展阶段 ...

麒麟区14718955361: 跪求会C8051F020单片机的,要用C语言写出测量电压,就是AD转换的程序 -
镇乔君士: void Timer3_Init() { TMR3CN = 0x02; TMR3R = -44236; //定时2ms TMR3 = 0xffff; EIE2 &= ~0x01; TMR3CN |= 0x04; } void ADC0_Init(void) { AMX0SL=0x00; //选择通道0 AMX0CF=0x00; //选择AIN0和AIN1为独立输入 REF0CN=0x03; //选择外...

麒麟区14718955361: 求C8051F300的AD转换函数 -
镇乔君士: #include<reg52.h> #include<absacc.h> #define uint unsigned int; #define uchar unsigne char; sbit rc = P0^0; sbit A0 = P0^1; sbit CS = p0^7; sbit adbusy=p3^0; void delay(uint ms) { while(--ms); } uint ad574(void) { uchar AD_h,AD_l; uint result; rc = 0...

麒麟区14718955361: 51系列有带ad转换的单片机吗 -
镇乔君士: STC系列有带AD的,也是51内核的单片机,下载程序比AT单片机简单

麒麟区14718955361: c8051f020单片机怎样把多个传感器上的模拟量进行AD转换...有没有哪个大侠有程序提供的啊. -
镇乔君士: F020的ADC0和ADC1都是8个模拟输入端的,你一个输入端连接一个传感器不行么?转换了一次后设置一下寄存器让下一个输入端连接到ADC再进行转换,有什么问题?

麒麟区14718955361: C8051F020单片机 进行A\D转换,三路模拟量输入与一路输入端口地址有什么区别?应怎么办 求指教 -
镇乔君士: 我的理解:应该是使用你这个C8051F020单片机一路输入ADC输入,然后使用外部CD4051模拟开关进行ADC输入转换,那么,这样的关系就比较明确了.

麒麟区14718955361: 单片机自带 AD模数 , DA数模转换 ,PWM?? -
镇乔君士: 比如说C8051F020芯片,带12bit ADC、12bit DAC,还有PCA控制的PWM.STC89C52上面没有ADC、DAC和PWM.现在很多高级的单片机都是同时有上面三个东西的,比如现在兴起的Cortex-M3单片机,STM32F103VET,12bit ADC有3个,12bit DAC有2个,PWM有十多路.

麒麟区14718955361: 那位大侠帮忙写一个单片机ad转换的c程序啊?要求的功能很简单,比如输入电压大于10v,输出1,小于10v,输出0 -
镇乔君士: 硬件设计好后,代码主要解决以下问题.【2】如果要AD的话,具体代码取决于选择的AD器件【1】请直接采用电压比较器(如,LM393,没有就普通运放也行)解决此问题.根据单片机系统的供电电压和输入电压范围,选择恰当的分压电阻.如果输入信号输出阻抗较大及速度要求高,接射随处理.比较器输出直接接单片机IO:AD的启动,检测转换结束信号,读取AD值.大概几句话就搞定

麒麟区14718955361: C8051F040单片机的A/D转换
镇乔君士: C8051F的ADC使用了MUX来改变输入的模拟量吧?那就好办了,找到MUX控制寄存器,修改其中的数值.

麒麟区14718955361: 请问有哪些带ad转换的51内核单片机 -
镇乔君士: 现在就比较多了 ,国外的 ATMEL ,PHILIP,TI,ST,等等,国内stc用过,还有台湾的 一些吧

麒麟区14718955361: 请问C8051F340的AD转换有几路输入啊? -
镇乔君士: AD转换模块只有一个,但是内部有一个模拟多路选择器,使得P2,P3,P4、内部温度传感器等都可以作为模拟输入通道,共20个输入选择

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网