【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 帮看看基于stc12c5a60s2的简单内部A/D转换程序错误在哪?

共20条 1/2 1 2 跳转至

帮看看基于stc12c5a60s2的简单内部A/D转换程序错误在哪?

助工
2014-05-31 19:35:15    评分
#include<stc12.h>
#define uchar unsigned char
#define uint unsigned int
main()
{
	unsigned long i;
	uchar status;
	ADC_CONTR|=0X80;              //打开A/D转换电源
	for(i=0;i<10000;i++);
	P1ASF=0x01;                 //选择P1^0作为A/D转换通道
	ADC_CONTR=0XE0;		    
	for(i=0;i<10000;i++);
	while()
	{
		ADC_CONTR|=0X08;        //重新启动A/D转换
		status=0;
		ADC_RES=0;			  //清除以前数据
		while(!(ADC_CONTR|=0X10));     //判断转换是否结束
		ADC_CONTR=0XE7;
		status=ADC_RES;
	}	
}

 以上是我写的stc12c5a60s2内部A/D转换程序,P1^0作为转换通道与传感器模块的AO端相连,麻烦看看有没有问题,下面是利用LCD1602显示光强传感器采集的光强数据程序,和运行结果,数据没有显示出来,拜托各位大神帮忙找找原因,做好能帮忙写一个A/D转换程序,急求············拜托了···········

显示程序:

#include<stc12.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="hello world!";
uchar code table1[]="guan:--.- C";
sbit en = P2^5;
sbit rs = P2^7;
sbit rw = P2^6;
uchar num;			
void delay(uint z)
{
	uint x, y;
	for(x = z;x > 0;x--)
	for(y = 110;y > 0;y--);
}

void write_c(uchar c)
{
	rs = 0;
	P0 = c;
	delay(5);
	en = 1;
	delay(5);
	en = 0;
}

void write_da(uchar date)
{
	rs = 1;
	P0 = date;
	delay(5);
	en = 1;
	delay(5);
	en = 0;
}
void init()
{ 
	rw = 0;
	en = 0;
	write_c(0x38);
	write_c(0x0c);
	write_c(0x06);
	write_c(0x01);
		write_c(0x80);
	for(num = 0;num < 12;num++)
	{
		 write_da(table[num]);
	 delay(5);
	}
	delay(20000);
	write_c(0x01);
	write_c(0x80);
		for(num = 0;num < 11;num++)
	{
	 write_da(table1[num]);
	delay(5);
	}
}



void yjxianshi(uint date)
{	
	uchar a, b, c;
//	ds = 0;
	a = date/100;
	b = date%100/10;
	c = date%10;
	write_c(0x80 + 5);
	write_da(0x30 + a);
	write_c(0x80 + 6);
	write_da(0x30 + b);
	write_c(0x80 + 8);
	write_da(0x30 + c);
}

uint guangqiang(void)
{
	unsigned long i;
	uint status;
	ADC_CONTR|=0X80;              //打开A/D转换电源
	for(i=0;i<10000;i++);
	P1ASF=0x01;                 //选择P1^0作为A/D转换通道
	ADC_CONTR=0XE0;		    
	for(i=0;i<10000;i++);
	ADC_CONTR|=0X08;        //重新启动A/D转换
	status=0;
	ADC_RES=0;
	while(!(ADC_CONTR|=0X10));
	ADC_CONTR=0XE7;
	status=ADC_RES;
	return(status);	
}

void main()
{
uint t = 0;
uchar e;
init();
while(1)
 {
	 for(e = 240;e > 0;e--)
	 yjxianshi(t);
	 t = guangqiang();
	}
}  

 

 




关键词: A/D          stc12c5a60s2     转换     程序    

高工
2014-06-01 09:42:48    评分
2楼

就给楼主贴一段,以前我调试没问题的程序啊。

void	ADC_INIT()
{
	P1ASF |= 0X40;				//ADC通道P1.6
	ADC_CONTR = 0x8E; 			//初始化ADC寄存器
	DELAY_5US();				//适当延时
	AUXR1 |= ADRJ;				//调整采样数据存储位置
	EADC = 1;					//允许中断
	ADC_RESL = 0X00;			//清空数据寄存器
}


/*****************************************************************
ADC中断
*****************************************************************/
void	ADC_CH()	interrupt 5
{
	ADC_CONTR &= 0XEF; 	
	DELAY_5US();
	ADC_DAT = ADC_RESL;
	ADC_CONTR |= 0X08;
}

 


专家
2014-06-01 10:29:09    评分
3楼

疑点: P1ASF=0x01;                 //选择P1^0作为A/D转换通道  


----->按照后面的注释,通道选择错了,应该为P1ASF=0x00;  


院士
2014-06-01 10:39:23    评分
4楼

助工
2014-06-01 10:48:46    评分
5楼
改后还是不行呀!

助工
2014-06-01 10:51:21    评分
6楼
看不懂!可不可以把通道改为P1^0口,程序也发全点。拜托了,急求

助工
2014-06-01 10:58:22    评分
7楼
拜托帮找找,错误就在A/D转换那一块

专家
2014-06-01 11:06:55    评分
8楼
不好意思  刚看错了  通道选择没错

专家
2014-06-01 11:15:38    评分
9楼
  1.   1\  while(!(ADC_CONTR|=0X10));  改为  while(!(ADC_CONTR&=0X10)); 
  2.   2\  ADC_CONTR=0XE7;  

1 2 两句交换下位置。



专家
2014-06-01 11:20:06    评分
10楼
这款单片机没用过,帮顶

共20条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]