各位大侠,问下stc12c5a60s2 的ad问题??
本帖最后由 squn 于 2012-5-9 17:10 编辑最近在用stc12c5a60s2做东西,可是用到它的ad是程序不知道怎么回事都不行、程序是根据datasheet写的,各位大侠帮忙看下哈
//****************************************STC12C5A60S2 AD转换***********************************************//
#include"stc12c5a60s2.h" //头文件在STC公司主页上下载
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#include "lcd1602.h"
/*****************************************************************
函数:delayms()
用途:延时xms
传人参数: xms是所需要延时的时间
******************************************************************/
void delayms(unsigned int x)
{
unsigned int y, z;
for(y=x; y>0; y--)
for(z=110; z>0; z--) ;
}
/*****************************************************************
函数: adInit()
用途: 初始化ad端口
******************************************************************/
void adInit(void)
{
P1ASF=0x07; //P1.0/P1.1/P1.2口全部作为模拟功能AD使用
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80;//开启AD电源
delayms(1); //等待1ms,让AD电源稳定
}
//------------------------------------------------------------------------------
unsigned int getAd(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 寄存器
// ADC_RES=0xdf;
// ADC_RESL=0xef;
while(!(ADC_CONTR&0x10)); //等待转换完成
ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)
}
/*****************************************************************
函数: averageValueVolgate()
用途: 求多次采集电压平均值
传入参数:chan是端口号
返回值:Val_Av是多次采样的电压值平均值
******************************************************************/
float averageValueVolgate(uchar chan)
{
float voltageValue=0;
uchar num;
for(num=100;num>0;num--)
{
voltageValue+=getAd(chan);
}
voltageValue/=100.0;
voltageValue=voltageValue*5.0/1024;
return (voltageValue);
}
/***********************************************************************
主函数
***********************************************************************/
void main()
{
adInit();
lcdInit();
display(0,averageValueVolgate(0));
while(1);
}
/**********************************************************************************
下面是lcd1602的程序可以用
**********************************************************************************/
sbit rs=P3^5;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]="0123456789";
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void write_com(uchar com)
{
P0=com;
rs=0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void write_data(uchar date)
{
P0=date;
rs=1;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
void lcdInit()
{
dula=0;
wela=0;
write_com(0x38);
delay(20);
write_com(0x0f);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
void display(uchar ch,float vol)
{
int temp = (int)(vol*10);
if(ch==0)
write_com(0x80);
else if(ch==1)
write_com(0x80+8);
else if(ch==2)
write_com(0x80+0x40);
write_data(table);
write_data(':');
write_data(' ');
write_data(table);
write_data(table);
write_data('.');
write_data(table);
}
液晶那块能用,就是我下进去后,显示一个数,关掉电源再打开变另一个了,而且跟输入电压都不一样,这是为什么呢???
原来是在单片机上,被别的元器件影响了,换到最小系统板上就可以了、、累啊
页:
[1]