STC单片机串口输出ADXL335角度值

STC单片机串口输出ADXL335角度值:

  1 //*****************************************************
  2 //名称:单片机串口输出ADXL335角度值
  3 //使用单片机:stc12c5a60s2
  4 //供电:电压5v
  5 //晶振:11.0592m
  6 //X轴->(ADC0)P1.0  
  7 //Y轴->(ADC1)P1.1 
  8 //Z轴->(ADC1)P1.2
  9 //用pc串口助手显示时,选择字符显示 
 10 //参考宏晶网址例程
 11 //*****************************************************
 12 #include "reg51.h"
 13 #include "intrins.h"
 14 #include  <math.h>    //Keil library  
 15 #include  <stdio.h>   //Keil library
 16 
 17 //#define FOSC    18432000L
 18 #define FOSC    11059200L  //晶振11.0592M
 19 #define BAUD    9600
 20 
 21 typedef unsigned char BYTE;
 22 typedef unsigned int WORD;
 23 
 24 #define   uchar unsigned char
 25 #define   uint unsigned int    
 26 
 27 /*Declare SFR associated with the ADC */
 28 sfr AUXR1       =   0XA2;
 29 sfr ADC_CONTR   =   0xBC;           //ADC control register
 30 sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
 31 sfr ADC_RESL    =   0xBE;
 32 sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
 33 sfr P1ASF       =   0x9D;           //P1 secondary function control register
 34 
 35 /*Define ADC operation const for ADC_CONTR*/
 36 #define ADC_POWER   0x80            //ADC power control bit
 37 #define ADC_FLAG    0x10            //ADC complete flag
 38 #define ADC_START   0x08            //ADC start control bit
 39 #define ADC_SPEEDLL 0x00            //420 clocks
 40 #define ADC_SPEEDL  0x20            //280 clocks
 41 #define ADC_SPEEDH  0x40            //140 clocks
 42 #define ADC_SPEEDHH 0x60            //70 clocks
 43 
 44 void InitUart();
 45 void InitADC();
 46 void SendData(BYTE dat);
 47 int GetADCResult(BYTE ch);
 48 void Delay(WORD n);
 49 uchar ge,shi,bai,qian,wan;           //显示变量
 50 
 51 void conversion(uint temp_data)  
 52 {  
 53     wan=temp_data/10000+0x30 ;
 54     temp_data=temp_data%10000;   //取余运算
 55     qian=temp_data/1000+0x30 ;
 56     temp_data=temp_data%1000;    //取余运算
 57     bai=temp_data/100+0x30   ;
 58     temp_data=temp_data%100;     //取余运算
 59     shi=temp_data/10+0x30    ;
 60     temp_data=temp_data%10;      //取余运算
 61     ge=temp_data+0x30;     
 62 }
 63 
 64 /*----------------------------
 65 Get ADC result
 66 ----------------------------*/
 67 int GetADCResult(BYTE ch)
 68 {   int AD10bitResult; 
 69     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
 70     _nop_();                        //Must wait before inquiry
 71     _nop_();
 72     _nop_();
 73     _nop_();
 74     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
 75     ADC_CONTR &= ~ADC_FLAG;         //Close ADC
 76 
 77     AD10bitResult=ADC_RES;
 78     AD10bitResult<<=8;
 79     AD10bitResult|=ADC_RESL;
 80     return AD10bitResult;                  //Return 10BIT ADC result
 81 }
 82 /*----------------------------
 83 Initial UART
 84 ----------------------------*/
 85 void InitUart()
 86 {
 87     SCON = 0x5a;                    //8 bit data ,no parity bit
 88     TMOD = 0x20;                    //T1 as 8-bit auto reload
 89     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
 90     TR1 = 1;                        //T1 start running
 91 }
 92 
 93 /*----------------------------
 94 Initial ADC sfr
 95 ----------------------------*/
 96 void InitADC()
 97 {
 98     P1ASF = 0xff;                   //Open 8 channels ADC function
 99 
100     AUXR1=AUXR1|0X04;              //ad值左对齐
101     ADC_RES = 0;                    //Clear previous result
102     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
103     Delay(2);                       //ADC power-on and delay
104 }
105 
106 /*----------------------------
107 Send one byte data to PC
108 Input: dat (UART data)
109 Output:-
110 ----------------------------*/
111 void SendData(BYTE dat)
112 {
113     while (!TI);                    //Wait for the previous data is sent
114     TI = 0;                         //Clear TI flag
115     SBUF = dat;                     //Send current data
116 }
117 
118 /*----------------------------
119 Software delay function
120 ----------------------------*/
121 void Delay(WORD n)
122 {
123     WORD x;
124 
125     while (n--)
126     {
127         x = 5000;
128         while (x--);
129     }
130 }
131 
132 //******************************************************************************
133 
134 void main()
135 {   int x,y,z;
136     float Q,T,K,Roll,Pitch;
137     InitUart();                     //Init UART, use to show ADC result
138     InitADC();                      //Init ADC sfr
139     while (1)
140     {
141         x=GetADCResult(0);
142         y=GetADCResult(1);
143         z=GetADCResult(2);
144         // 0-5v 对应 0-1024  
145         // 3.3v/2  = 1.65v(0g时候值)
146         // 1.65v ->= 338   (AD值即0X0152)
147         x-=0X0152; //
148         y-=0X0152;
149         z-=0X0152;    
150     Q=x;
151     T=y;
152     K=z;
153     Q=-Q;
154     Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180);
155     Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180);
156     conversion(Roll);    //横滚角0-360度
157   //conversion(Pitch); //俯仰角0-360度
158     SendData(bai);
159     SendData(shi);
160     SendData(ge);
161 
162     SendData(0x0d); 
163     SendData(0x0a);//换行,回车
164 
165     Delay(30);
166     }
167 }
原文地址:https://www.cnblogs.com/jikexianfeng/p/6385587.html