
求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!
求解STC12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!(本人已经纠结了很久了,求救呀!!!)(程序是实现AD转化...
求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!
(本人已经纠结了很久了,求救呀!!!)
(程序是实现AD转化,通过不同的模拟量输入,控制灯泡是否亮?
如能解决,追加奖励!!!!!!)
程序如下:
#include<STC_12c5a.H>
#define uint unsigned int
#define uchar unsigned char
uint s=0;
unsigned char ad_average_result; //AD转换十次的平均值
sbit out=P2^0;
uchar tp;
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms
{
uint i,j;
for(;delay1ms>0;delay1ms--)
for(i=0;i<7;i++)
for(j=0;j<210;j++);
}
void delay(uint delay) //STC11F60XE,22.1184M,延时170us
{
uint i,j;
for(;delay>0;delay--)
for(i=0;i<124;i++);
for(j=0;j<124;j++);
}
/*******************************************************
AD转换程序
*******************************************************/
void ADC_Power_On() //AD转换电
{
ADC_CONTR|=0x80;
delay(5); //必要的延时
}
void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据
{
uint i;
uchar q=0;
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
ad_average_result=q/10;
//ad_average_result=ad_average_result*4*5000/1024;
}
/************************AD转换结束***********************/
void main()
{
ADC_Power_On(); //开AD电源
P1ASF=0xff;
get_ad_result();
s=ad_average_result;
if(s>=0x80&&s<=0xff)
out=0;
else
out=1;
}
就是加模拟信号,灯泡不亮,不知道怎么回事,程序可以下载到单片机里 展开
(本人已经纠结了很久了,求救呀!!!)
(程序是实现AD转化,通过不同的模拟量输入,控制灯泡是否亮?
如能解决,追加奖励!!!!!!)
程序如下:
#include<STC_12c5a.H>
#define uint unsigned int
#define uchar unsigned char
uint s=0;
unsigned char ad_average_result; //AD转换十次的平均值
sbit out=P2^0;
uchar tp;
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms
{
uint i,j;
for(;delay1ms>0;delay1ms--)
for(i=0;i<7;i++)
for(j=0;j<210;j++);
}
void delay(uint delay) //STC11F60XE,22.1184M,延时170us
{
uint i,j;
for(;delay>0;delay--)
for(i=0;i<124;i++);
for(j=0;j<124;j++);
}
/*******************************************************
AD转换程序
*******************************************************/
void ADC_Power_On() //AD转换电
{
ADC_CONTR|=0x80;
delay(5); //必要的延时
}
void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据
{
uint i;
uchar q=0;
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
ad_average_result=q/10;
//ad_average_result=ad_average_result*4*5000/1024;
}
/************************AD转换结束***********************/
void main()
{
ADC_Power_On(); //开AD电源
P1ASF=0xff;
get_ad_result();
s=ad_average_result;
if(s>=0x80&&s<=0xff)
out=0;
else
out=1;
}
就是加模拟信号,灯泡不亮,不知道怎么回事,程序可以下载到单片机里 展开
展开全部
我最近也在弄STC的单片机,看了下代码,觉得以下这段似乎有点问题
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0;
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
你的意图是想做10次转换,然后取平均值作为最终结果吧, while(!tp) 就是说转换完成后将转换完成标志位清零接着再取出转换后的数,可是转换未完成的话就跳出while直接执行后面的语句了吧,不过这个就是有问题应该也不会导致完全没结果输出,也就是结果有问题的话灯应该也会亮的,还有是否确定模拟信号输入口是否和寄存器设置所选的一致,P1ASF这个寄存器我也找不到说明
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0;
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
你的意图是想做10次转换,然后取平均值作为最终结果吧, while(!tp) 就是说转换完成后将转换完成标志位清零接着再取出转换后的数,可是转换未完成的话就跳出while直接执行后面的语句了吧,不过这个就是有问题应该也不会导致完全没结果输出,也就是结果有问题的话灯应该也会亮的,还有是否确定模拟信号输入口是否和寄存器设置所选的一致,P1ASF这个寄存器我也找不到说明
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用这个程序试试,我刚刚调试是可以的,但采样一次就做判断了,你可以自己改成采样十次再判断
#include<STC_12c5a.H>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit out=P2^0;
/* ms级延时 */
/********************************/
void delay_ms(WORD n)
{
WORD i=0;
WORD j;
while(i<n)
{
for(j=0;j<1000;j++){}
i++;
}
}
/* AD初始化设定 */
/********************************/
void ad_init()
{
P1 = P1 | 0x01; // 0000,0001,要设置为 A/D 转换的P1.x 口,先设为高
P1_ADC_EN = 0x01; // 0000,0001, P1 的P1.0 设置为 A/D 转换输入脚
// 断开P1.0 内部上拉电阻
}
/* AD转换 */
/********************************/
void ad_test()
{
BYTE AD_finished ; // 存储 A/D 转换标志
ADC_RES = 0; // AD数据高8位
ADC_RESL = 0; // AD有效数据低2位
ADC_CONTR = 0x80; // 1000,0000 打开 A/D 电源并选择 A/D 当前通道P1.0
delay_ms(200); // 使输入电压达到稳定
ADC_CONTR |= 0x08; // 0000,1000 令 ADC_START = 1, 启动A/D 转换
AD_finished = 0;
while ( AD_finished == 0 ) // 等待A/D 转换结束
{
AD_finished = (ADC_CONTR & 0x10); // 0001,0000, ADC_FLAG ==1测试A/D转换结束否
}
ADC_CONTR &= 0xF7; // 1111,0111 令 ADC_START = 0, 关闭A/D 转换,
delay_ms(100);
if(ADC_RES>=0x80 && ADC_RES<=0xff) // 这里只采样一次就做判断
{out=0;}
else
{out=1;}
}
/* 主程序 */
/********************************/
main()
{
ad_init(); // AD初始化 ,设置P1.0作为AD输入
delay_ms(10);
while(1)
{
ad_test(); // AD测试
}
}
#include<STC_12c5a.H>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit out=P2^0;
/* ms级延时 */
/********************************/
void delay_ms(WORD n)
{
WORD i=0;
WORD j;
while(i<n)
{
for(j=0;j<1000;j++){}
i++;
}
}
/* AD初始化设定 */
/********************************/
void ad_init()
{
P1 = P1 | 0x01; // 0000,0001,要设置为 A/D 转换的P1.x 口,先设为高
P1_ADC_EN = 0x01; // 0000,0001, P1 的P1.0 设置为 A/D 转换输入脚
// 断开P1.0 内部上拉电阻
}
/* AD转换 */
/********************************/
void ad_test()
{
BYTE AD_finished ; // 存储 A/D 转换标志
ADC_RES = 0; // AD数据高8位
ADC_RESL = 0; // AD有效数据低2位
ADC_CONTR = 0x80; // 1000,0000 打开 A/D 电源并选择 A/D 当前通道P1.0
delay_ms(200); // 使输入电压达到稳定
ADC_CONTR |= 0x08; // 0000,1000 令 ADC_START = 1, 启动A/D 转换
AD_finished = 0;
while ( AD_finished == 0 ) // 等待A/D 转换结束
{
AD_finished = (ADC_CONTR & 0x10); // 0001,0000, ADC_FLAG ==1测试A/D转换结束否
}
ADC_CONTR &= 0xF7; // 1111,0111 令 ADC_START = 0, 关闭A/D 转换,
delay_ms(100);
if(ADC_RES>=0x80 && ADC_RES<=0xff) // 这里只采样一次就做判断
{out=0;}
else
{out=1;}
}
/* 主程序 */
/********************************/
main()
{
ad_init(); // AD初始化 ,设置P1.0作为AD输入
delay_ms(10);
while(1)
{
ad_test(); // AD测试
}
}
更多追问追答
追问
我试了一下,为什么编译显示“P1_ADC_EN” :undefined identifier
求解?
追答
P1_ADC_EN 是A/D转换功能允许寄存器,一般在头文件中定义,可能你的头文件中定义用的名称不同,可在程序中插入该语句,位置参考如下:
#include
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sfr P1_ADC_EN = 0x9D; //A/D转换功能允许寄存器
sbit out=P2^0;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
初始化不对
void InitADC( )
{
P1ASF = 0xff;//将P1.0口全部设置为ad口
ADC_RES = 0;//清除结果寄存器
ADC_RESL = 0;//清除结果寄存器
ADC_CONTR = ADC_START |ADC_POWER | ADC_SPEEDHH | (ch&0x07);//接通电源设置速度设置通道
//ADC power-on delay and Start A/D conversion
IE|=EADC;
EA=1;Delay(2);
}
void InitADC( )
{
P1ASF = 0xff;//将P1.0口全部设置为ad口
ADC_RES = 0;//清除结果寄存器
ADC_RESL = 0;//清除结果寄存器
ADC_CONTR = ADC_START |ADC_POWER | ADC_SPEEDHH | (ch&0x07);//接通电源设置速度设置通道
//ADC power-on delay and Start A/D conversion
IE|=EADC;
EA=1;Delay(2);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询