新手求助了,关于stc单片机ADC转换的问题
看了杜洋的视频,感觉什么东西都没学到啊,主要的东西一点都没讲,尤其是ADC转换这一点,我根据他讲的用他的模板改的程序如下
P1.0接的是一个电位器,调节电位器控制led1亮灭,我想在P1.1上也接一个电位器来控制led2的亮灭,
也就是采集两路ADC数据,程序应该怎么改啊?看了好几遍杜洋关于ADC的视频也没弄明白,求助各位了,谢谢了
/****************************************包含头文件*******************************************/
#include<15f204ea.H>
#include <intrins.h> //51基本运算(包括_nop_空函数)
/*********************************************************************************************/
#define uchar unsigned char
#define uint unsigned int
uint m;
sbit led1 = P1^2;
sbit led2 = P1^3;
/*********************************************************************************************/
/*********************1ms延时程序(12MHz 10倍于51单片机速度时)********************************/
void delay (uint a)
{
uint i;
while( --a != 0)
{
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换初始化函数
调用:Read_init (?);
参数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结果:开启ADC功能并设置ADC的输入端口
备注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
/**********************************************************************************************/
void Read_init (unsigned char CHA){
unsigned char AD_FIN=0; //存储A/D转换标志
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
_nop_();
ADC_CONTR |= CHA; //选择A/D当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D电源
delay(1); //使输入电压达到稳定(1ms即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调用:? = ADC_Read();
参数:无
返回值:10位ADC数据高(从0到1023(十进制))
结果:读出指定ADC接口的A/D转换值,并返回数值
备注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
unsigned int Read (void){
unsigned char 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转换,
return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}
/************************************主函数***************************************************/
void main(void)
{
P1M1 = 0x01;//
Read_init (0);
while(1)
{
m = Read ();
if(m>=30&&m<=90)
{
led1=0;
}
else
{
led1=1;
}
}
}
/*********************************************************************************************/
没人能帮帮我吗 你看看stc的技术文档,比看教程明了。我昨天看的,今天基本上就明白的差不多了 iphone4 发表于 2013-1-4 18:23
你看看stc的技术文档,比看教程明了。我昨天看的,今天基本上就明白的差不多了 ...
在看了,貌似明白一点了 他的网站上有例程下载,写的很简明。对着pdf看,一会就明白个大概了
我刚开始学这个,没有个老师真是痛苦啊。什么都要自己看~~~ STC的文档就够用了 topark 发表于 2013-1-4 21:23
STC的文档就够用了
主要是有些地方看不明白阿 程序基本上可以直接拿来用 把主函数这样改一下看行不?
Read_init (0); 这句应该就是改ADC通道及设置的,所以放到循环里。
:
/************************************主函数***************************************************/
void main(void)
{
P1M1 = 0x03; / P1M1=#0000011B; p1.0,p1.1改为高阻输入 /
while(1)
{
Read_init (0);
m = Read ();
if(m>=30&&m<=90)
{
led1=0;
}
else
{
led1=1;
}
Read_init (1);
m = Read ();
if(m>=30&&m<=90)
{
led2=0;
}
else
{
led2=1;
}
}
}
/*********************************************************************************************/
本帖最后由 bbssilverkey 于 2013-1-5 14:46 编辑
函数名:10位A/D转换初始化函数
调用:Read_init (?);
参数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结果:开启ADC功能并设置ADC的输入端口
备注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
/**********************************************************************************************/
void Read_init (unsigned char CHA){
unsigned char AD_FIN=0; //存储A/D转换标志
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
_nop_();
ADC_CONTR |= CHA; //选择A/D当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D电源
delay(1); //使输入电压达到稳定(1ms即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调用:? = ADC_Read();
参数:无
返回值:10位ADC数据高(从0到1023(十进制))
结果:读出指定ADC接口的A/D转换值,并返回数值
备注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
unsigned int Read (void){
unsigned char 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转换,
return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}
/************************************很傻,不过估计可行***************************************************/
void led0_turn()
{
Read_init (0);
if(Read()>=30 && Read()<=90)
{
led0=0;
}
else
{
led0=1;
}
}
void led1_turn()
{
Read_init (1);
if(Read()>=30 && Read()<=90)
{
led1=0;
}
else
{
led1=1;
}
}
/************************************主函数***************************************************/
void main(void)
{
P1M0 = 0x00; //整个P1我都调高阻了,太懒
P1M1 = 0xFF;
while(1)
{
led0_turn();
led1_turn();
}
}
楼主有没有杜洋的很贵,能不能给我看看? bbssilverkey 发表于 2013-1-5 14:36
函数名:10位A/D转换初始化函数
调用:Read_init (?);
参数:输入的端口(0000 0XXX 其中XXX是设置输入 ...
个人感觉还不如看郭的 问题已经解决,感谢各位的帮忙 void readadc()
{
uchar i,b;
uint ad_shu;
for(b=0;b<4;b++) //采集四个通道AD值
{
ad_shu=0;
ADC_CONTR=adc_chanle;
//ADC_CONTR=0xe6; //开A/D转换器,并定义P1.6为AD输入端口
for(i=0;i<32;i++)//采集32次后取均值
{
ADC_CONTR|=0x08;//启动AD转换
while((ADC_CONTR&0x10)==0);//等待AD转换结束
ADC_CONTR&=0xe7;//置0
// ad_shu=ADC_DATA;//高8位赋值
// ad_shu<<=2; //左移2位
// ad_shu+=ADC_LOW2;//低2位赋值
// adc_val+=ad_shu;
ad_shu+=(ADC_DATA<<2)+ADC_LOW2;
}
adc_val=ad_shu/32;
}
vvc=(ulong)adc_val*2964/1000;//adc*(30V/1012(30V时测得的AD值))
vva=(ulong)adc_val*3706/10000;//adc*(3.78A/1020(3.78A时测得的AD值))
} 楼上的, 还没有看明白
页:
[1]