这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » MMA7361 AD stc12c5a60s2转换+数码管显示问题,自平衡

共5条 1/1 1 跳转至

MMA7361 AD stc12c5a60s2转换+数码管显示问题,自平衡

菜鸟
2013-10-01 17:53:42     打赏

目的就是想用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采样转换了,没系统学过,求指导,求大神帮我看一下哪错了

 




关键词: MMA7361      AD转换     stc12c5a60    

高工
2013-10-01 18:21:20     打赏
2楼
与硬件连接也有有关系,,,

院士
2013-10-01 22:26:49     打赏
3楼

好长的代码啊~~

真心表示,看代码实在是太需要时间了……


专家
2013-10-01 22:49:13     打赏
4楼

1、先数码管循环显示0-9,确定数码管能正常显示;

2、利用串口或第一步数码管功能显示AD端口的值(取几个电压点,0、1、2、2.5等几个点的AD值),确定AD功能正常;

3、AD端口连接MMA7361的Z轴输出,通过数码管显示。


希望以上几点能对楼主有所帮助!


助工
2014-11-11 09:36:27     打赏
5楼
楼主玩不玩XS128?

共5条 1/1 1 跳转至

回复

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