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 }