|
STC12C5A60S2单片机电压表采集问题?
请问:
有谁用过STC12C5A60S2单片机的,我要用到内部的ad转换模块,我在网上弄了个一路通道的程序,可是我要采集两路的电压,然后对两个数据进行比较,得出最大的值,然后到单片机中进行处理,最后显示出来。
可是我不知道在选通一个ad通道后,得到数据。然后在采集第二个通道的数据。请各位前辈帮忙指点指点。谢谢!
下面是通过lcd1602实现的。
#include
#include
//接口定义
//1602的数据接口为P0
sbit RSPIN = P2^0;
sbit RWPIN = P2^1;
sbit EPIN = P2^2;
unsigned char xdata shuzi[]={'0','1','2','3','4','5','6','7','8','9'};
/////////// 延时函数/////////////////////////
void delay(unsigned int t) //毫秒延时(用在延时不需很精确地情况下)
{ unsigned int xdata j;
while(--t){
for(j=600;j>0;j--);}
}
//下面的是1602的驱动
void testbusy(void)//判忙
{
P0=0xff;
RSPIN=0;
RWPIN=1;
_nop_();
_nop_();
EPIN=1;
while((P0&0x80)==0x80);
EPIN=0;
}
void lcdcmd(unsigned char c) //写入命令字符的底层操作
{
RSPIN=0;
RWPIN=0;
P0=c;
_nop_();
_nop_();
EPIN=1;
_nop_();
_nop_();
EPIN=0;
}
void inputcmd(unsigned char c) //写入名令字符的底层函数
{
testbusy();
//delay(5);
lcdcmd(c);
}
void lcdwd(unsigned char d) //写入数据字符的底层函数
{ testbusy();
// delay(5);
RSPIN=1;
RWPIN=0;
P0=d;
_nop_();
_nop_();
EPIN=1;
_nop_();
_nop_();
EPIN=0;
}
void add (signed char x,signed char y)//确定字符的显示位置
{
signed char xdata a;
switch(x)
{
case 1:
a=y;
break;
case 2:
a=0x40+y;
break;
}
a+=0x80;
inputcmd(a);
}
void lcdreset() //液晶屏初始化
{
delay(50);
inputcmd(0x38); //0011 1000 四位总线 双行显示 5*7
inputcmd(0x38);
inputcmd(0x08); //0000 1000 关显示 关光标 光标不闪
inputcmd(0x01); //0000 0001 清屏
inputcmd(0x06); //0000 0110 光标右移 文字不移
inputcmd(0x0c); //0000 1100 开显示 关光标 光标不闪
}
//上面的1602驱动*********************************************************
//此函数用于显示屏幕上固定不变的字符
void _char()
{
add(1,0); //确定字符的显示位置
lcdwd('V');
lcdwd('1');
lcdwd('=');
add(2,0);
lcdwd('V');
lcdwd('2');
lcdwd('=');
}
//下面的也是我从杜洋工作室的网站上下载的stc12c5a60s2的ad转换有关的函数
/*********************************************************************************************
函数名:10位A/D转换初始化函数
调 用:Read_init (?)
参 数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结 果:开启ADC功能并设置ADC的输入端口
备 注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
void ADC_init (unsigned char CHA ) //CHA选择转换通道
{
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
_nop_();
_nop_();
ADC_CONTR |= CHA; //选择A/D当前通道
_nop_();
P1ASF=0x01; //选择A/D当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D电源
delay(1); //使输入电压达到稳定(1ms即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调 用:ADC_Read ();
参 数:无
返回值:无(10位ADC数据高8位存放在ADC_RES中,低2位存放在ADC_RESL中)
结 果:读出指定ADC接口的A/D转换值,并返回数值
备 注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
void ADC_Read (void){
unsigned char xdata AD_FIN=0; //存储A/D转换标志
ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FIN ==0){ //等待A/D转换结束
AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
}
/**********************************************************************************************/
void main () //主函数
{
unsigned long int v1;
EPIN=0; //1602能使端的初始状态
_nop_();
_nop_();
_nop_();
lcdreset(); //液晶屏初始化
ADC_init(0); //AD转化初始化 选择通道P1^0
inputcmd(0x01); //0000 0001 清屏
_char(); //确定要显示的固定不变的显示字符
while(1)
{
delay(500); //读取延时 (此处延时是因为读取电压的速度太快)
ADC_Read(); //AD转换启动函数
_nop_();
_nop_();
_nop_();
v1=ADC_RES*50000/256; //计算转换结果
add(1,3); //电压数值字符显示开始地址
lcdwd(shuzi[(v1/10000)]); //提取万位
v1=v1%10000; // 求余除掉万位
lcdwd('.'); //一下的数值为小数点后面的数字
lcdwd(shuzi[(v1/1000)]); //提取千位
v1=v1%1000; //求余去掉千位
lcdwd(shuzi[(v1/100)]); //提取百位
v1=v1%100; //求余去掉百位
lcdwd(shuzi[(v1/10)]); //提取十位
v1=v1%10; //求余去掉十位
lcdwd(shuzi[v1]);
lcdwd('v');
}
} |
|