目的就是想用stc12c5a60s转换MMA7361的数据,计算出倾角,送数码管显示,下面附程序
/****************************************************
**STC12C5A32S2或STC12C5A60S2等单片机ADC采样功能示例**
1、P1口为8路10位AD转换口
2、用LCD1602显示:数据口为P0,RW接P2.5,
RS接P2.6,EN接P2.7
3、亲手编写、亲自调试,完全可行
*****************************************************/
#include<reg52.h>
#include<intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit sleep=P2^0;
uint ge ,shi,bai;
void delay_ms(uint x); //ms延时子函数
/*****stc12c5a32s2相关的寄存器说明*****/
sfr P1ASF = 0x9D; //P1口模数转换功能控制寄存器
sfr ADC_CONTR = 0xBC; //AD转换控制寄存器
sfr ADC_RES = 0xBD; //AD转换结果寄存器高位
sfr ADC_RESL = 0xBE; //AD转换结果寄存器低位
sfr AURX1 = 0xA2; //AD转换结果存储方式控制位
/***P1ASF寄存器:8位,对应P1口8根线,用于指定那根线用作ADC功能
******哪根线用作ADC就应置相应的位为1,注意:不能位寻址******/
#define ADC_POWER 0x80 //ADC电源开
#define ADC_SPEED 0x40 //设置为180个周期,ADC一次
#define ADC_START 0x08 //ADC启动控制位设为开
#define ADC_FLAG 0X10 //ADC结束标志位
sbit q=P1^0;
sbit w=P1^1;
sbit e=P1^2;
unsigned code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//***第n通道ADC初始化函数***//
uint ad_0 = 0;
/********延时子函数:xms********/
void delay(uint x)
{
uint y;
for(;x>0;x--)
for(y=0;y<125;y++);
}
void shuma()
{
P0=bai;
q=0;
delay(10);
q=1;
delay(10);
P0=shi;
w=0;
delay(10);
w=1;
delay(10);
P0=ge;
e=0;
delay(10);
e=1;
delay(10);
}
void ADC_int(n)
{
n&= 0x07; //确保是第0~7通道
AURX1|= 0x04; //转换结果存储方式:高2位放ADC_RES,低8位放ADC_RESL
P1ASF = 1<<n; //将P1.n设为ADC采样功能
}
void xianshi()
{
bai=ad_0/100;
shi=ad_0%100/10;
ge=ad_0%10;
bai=SEG7[bai];
shi=SEG7[shi];
ge=SEG7[ge];
}
//***第n通道ADC采样函数***//
uint ADC_GET(n)
{
uint adc_data;
n&= 0x07;//确保是第0~7通道
sleep=1;
ADC_RES = 0; //清存放结果存储器
ADC_RESL = 0; //清存放结果存储器
ADC_CONTR = 0; //AD转换控制寄存器清0,以便重置
ADC_CONTR |= (ADC_POWER|ADC_SPEED|n|ADC_START);//打开AD转换电源,设定转换速度,设定通道号,AD转换开始
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延时4个时钟周期左右
while(!((ADC_CONTR & ADC_FLAG) == 0x10)) //等待转换结束
adc_data = (ADC_RES & 0x03) * 256 + ADC_RESL;//唤峁扑?
ad_0=asin(adc_data)*180/3.1415926;
ADC_CONTR &= 0xef; // 转换结束标志清0
//adc_data的值(0~1023)
}
/***如果需要释放P1口为普通IO口,则需要本函数***/
/*
void ADC_END()
{
P1ASF = 0;
P1_CONTR = 0;
}
*/
/**************主函数***************/
void main()
{
while(1)
{
ADC_int(0); //ADC的通道0初始化
ADC_GET(5); //AD转换处理后的数据存放于ad_0中
xianshi();
shuma();
delay_ms(20); //延时
}
}
但数码管稳定显示两个零,其他没任何反应,本人新手,自学的单片机,向AD采样转换了,没系统学过,求指导,求大神帮我看一下哪错了