标题:
STC12C5A16AD模数转换
[打印本页]
作者:
daming
时间:
2014-12-30 01:06
标题:
STC12C5A16AD模数转换
#include<reg51.h>
#include<intrins.h>
#include "STC_NEW_8051.H"
#define uchar unsigned char
#define uint unsigned int
//以下选择 ADC 转换速率,只能选择其中一种
// SPEED1 SPEED0 A/D转换所需时间
//#define AD_SPEED 0x60 // 0110,0000 1 1 70 个时钟周期转换一次,
// CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次
#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次
code unsigned char digit[]={'0','1','2','3','4','5','6','7','8','9' };
/******************************************************************/
/* 定义端口 */
/******************************************************************/
sbit rs=P1^0; //显示数据端口P2
sbit rw=P1^1;
sbit en=P1^2;
/******************************************************************/
/* 函数声明 */
/******************************************************************/
void write_order(uchar order);
void write_date(uchar date);
void write_address(uchar x);
unsigned int get_AD_result_10F(unsigned char channel);
//延时
void delay(uchar m)
{
uchar i=100;
while(m--)
{
while(i--);
}
}
/******************************************************************/
/* 写命令 */
/******************************************************************/
void write_order(uchar order)
{
rs=0;
P2=order;
delay(4);
en=1;
delay(4);
en=0;
}
/******************************************************************/
/* 写数据 */
/******************************************************************/
void write_data(uchar date)
{
rs=1;
P2=date;
delay(4);
en=1;
delay(4);
en=0;
}
/******************************************************************/
/* 写地址 */
/******************************************************************/
void write_address(uchar x)
{
write_order(0x80+x);
}
/******************************************************************/
/* 1602 初始化 */
/******************************************************************/
void init_lcd()
{
rw=0;
en=0;
write_order(0x38);
write_order(0x0c);
write_order(0x06);
write_order(0x01);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main()
{
unsigned char ADC_result ;
unsigned long int gg ;
uchar g,s,b ;
P1ASF = 0x80; //1000 0000选择P1^7作为模拟输入口
//ADRJ = AUXR1^2:
// 0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
// 1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在
AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0
ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
delay(10);
init_lcd(); //lcd初始化
delay(15);
while(1)
{ /*
ADC_result = get_AD_result_10F(7); //P1.7为 A/D 当前通道, 接电压源进行测量
gg=(unsigned long int)((unsigned long int)ADC_result*465)/256; //“470”根据实际情况而定
b=(gg%1000)/100;
s=(gg%100)/10;
g=gg%10;
write_address(0x40);
write_data(digit[b]);
write_data('.');
write_data(digit[s]);
write_data(digit[g]); */
ADC_result = get_AD_result_10F(7); //P1.7为 A/D 当前通道, 接电压源进行测量
gg=(unsigned long int)((unsigned long int)ADC_result*485)/256; //“470”根据实际情况而定
b=(gg%1000)/100;
s=(gg%100)/10;
g=gg%10;
if(g>=5){
s++;
if(s==10)
{
s=0;
b++;
}
}
write_address(0x40);
write_data(digit[b]);
write_data('.');
write_data(digit[s]);
}
}
/****************************************************************************/
/* 10位AD带均值滤波转换 */
/*****************************************************************************/
unsigned int get_AD_result_10F(unsigned char channel)
{
unsigned char AD_finished=0; //存储 A/D 转换标志
unsigned int out=0;
unsigned int N=40;
unsigned int sum=0;
unsigned char m;
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); //使输入电压达到稳定
for(m=0;m<N;m++)
{ //均值滤波
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; //1110,0111 清 ADC_FLAG 位, 关闭A/D转换,
out= ADC_RES;
// out=(out<<2)+(ADC_RESL&0xfc);
sum=sum+out;
} //带均值滤波
return (sum/N); //返回 A/D 高 8 位转换结果
}
复制代码
头文件:
/**************************************************************************
STC_NEW_8051.H
************************************************************************/
sfr P1ASF = 0x9D; //P1 analog special function
sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000
//-----------------------------------
sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000
sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000
sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
复制代码
作者:
s360221867
时间:
2018-9-17 14:56
好好学习学习 可以使用一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1