求STC12C5204单片机AD功能如何使用,例如,用其中一个I/O做为AD采样一个2V左右的电压,并通过数码管显示

核心提示//本程序主要演示了//1、12864液晶的编程与使用,包括显示定位、4位整数、显示浮点数等//2、STC12C5A32S2单片机的ADC 采样功能(以第0、1通道为例)////注:本示例仅仅演示如何进行ADC 和显示,每ADC 一次就显示

//本程序主要演示了

//1、12864液晶的编程与使用,包括显示定位、4位整数、显示浮点数等

//2、STC12C5A32S2单片机的ADC 采样功能(以第0、1通道为例)

//

//注:本示例仅仅演示如何进行ADC 和显示,每ADC 一次就显示一次,实际应用时,

//应多次ADC 并进行相应处理,比如取平均值后,才能得到比较稳定的AD 值

//广西民族大学物电学院李映超2010.5.26

#include <reg52.h>

#include<intrins.h>

#include<lcd12864s.h>

#define uint unsigned int

#define uchar unsigned char

sbit light=P2^7;//定义工作指示灯与单片机的连接脚

//---------与STC12C5A32S2单片机ADC 相关的寄存器声明------------------

sfr P1ASF =0x9d; //P1口模数转换功能控制寄存器

sfr ADC_ConTR =0xbc; //AD 转换控制寄存器

sfr ADC_RES =0xbd; //AD 转换结果寄存器高

sfr ADC_RESL =0xbe; //AD 转换结果寄存器低

sfr AURX1 =0xa2; //AD 转换结果存储方式控制位

//------------------------------------------------------------------

//P1ASF 寄存器:8位,对应P1口8根口线,用于指定哪根口线用作ADC 功能

//哪个口用作ADC 就应置相应的位为“1”,注意:不能位寻址

//------------------------------------------------------------------

#define ADC_POWER 0x80 //ADC 电源开

#define ADC_SPEED 0x60 //设为90个时钟周期ADC 一次

#define ADC_START 0x08 //ADC 启动控制位设为开

#define ADC_FLAG 0x10 //ADC 结束标志位

//-------------------------------------------------------------

void ADC_int(uchar n) //第n 通道ADC 初始化函数

{

n&=0x07; //确保n=0----7通道

AURX1|=0x04; //转换结果存储格式:数据的高2位放ADC_RES,低8位放ADC_RESL

P1ASF=1<<n; //将P1.n 设为ADC 采样功能

}

//---------------------------------------------------------------

uint ADC_GET(unsigned char n) //第n 通道ADC 采样函数

{

unsigned int adc_data;

n&=0x07; //确保n=0----7通道

ADC_RES=0; //清零

ADC_RESL=0; //清零

ADC_ConTR=0; //清零,以便重构

ADC_ConTR|=(ADC_POWER|ADC_SPEED|n|ADC_START); //打开AD 转换电源,设定转换速度、设定通道号、AD 转换开始

_nop_();

_nop_();

_nop_();

_nop_();

_nop_(); //延时4个时钟周期左右

while(!(ADC_CONTR&ADC_FLAG)); //等待转换结束=0x10 ADC_FLAG 位=1

adc_data=(ADC_RES&0x03)*256+ADC_RESL; //转换结果计算,取高位结果存储器的低2位+ 低位结果存储器

ADC_CONTR&=~ADC_FLAG;//清零转换结束标志位(ADC_FLAG 位=0)

return adc_data; //返回ADC 的值(0----1023)

}

void lcd_4_char(unsigned int data_4_char) //在1602LCD 上显示一个4位的整数

{

unsigned char lcd_table[4];

lcd_table[0]=data_4_char/1000; //获得千位的数字

lcd_table[1]=data_4_char%1000/100; //获得百位的数字

lcd_table[2]=data_4_char%100/10; //获得十位的数字

lcd_table[3]=data_4_char%10; //获得个位的数字

Lcd_WriteData(lcd_table[0]+0x30); //显示千位

Lcd_WriteData(lcd_table[1]+0x30); //显示百位

Lcd_WriteData(lcd_table[2]+0x30); //显示十位

Lcd_WriteData(lcd_table[3]+0x30); //显示个位

}

void main()

{ unsigned int ad_0,ad_1;

ad_0=0;

ad_1=0;

Lcd_Init(); //12864液晶模块初始化

light=0;delayms(1000);light=1; //灯闪一下,表示上电准备工作

ADC_int(0); //ADC 通道0初始化

ADC_int(1); //ADC 通道1初始化

while(1)

{

ad_0=ADC_GET(0);//第0通道进行ADC 采样

ad_1=ADC_GET(1);

hanzi_disp(0,1,"单片机转换");

hanzi_disp(1,0,"通道0:");

lcd_4_char(ad_0);

//while(1){;};

//delay_ms(30000);

hanzi_disp(2,0,"通道1:");

lcd_4_char(ad_1);

hanzi_disp(3,1,"--------");

//delayms(1000); //适当延时后再进行下一循环

}

}

双路供电就是一个负载有两个电源可以给它供电,两个电源之间可以切换,在其中一个电源失电的情况下可以投切到另个电源供电 .

不知道是否对题,题目太广义了点.希望是你想要的

这样的话我说的就没有错了。

需要有一个双回路投切开关。

回答者:zhanggaolei08 - 举人 五级 12-27 17:11

 
友情链接
鄂ICP备19019357号-22