完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
是这样的,最近在摸索MMA7361,找到了一个程序,马马虎虎的看懂,还有几个问题向求教各路大神。1,红色字体为不太懂的地方
2.这是在网上搜的,我感觉有些解释不太对,请大家指教 3.万分感谢 //名称:单片机串口输出MMA7361角度值 //使用单片机:stc12c5a60s2 //晶振:11.0592m //X轴->(ADC0)P1.0 //Y轴->(ADC1)P1.1 //Z轴->(ADC1)P1.2 //用pc串口助手显示时,选择字符显示 //参考宏晶网址例程 #include "reg51.h" #include "intrins.h" #include #include //#define FOSC 18432000L #define FOSC 11059200L //晶振11.0592M #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; #define uchar unsigned char #define uint unsigned int ***it x=P1^0; ***it y=P1^1; ***it z=P1^2; ***it GS=P1^3; ***it OG=P1^4; ***it SL=P1^5; /*---------与STC12C5A60S2单片机ADC 相关的寄存器声明------------------*/ sfr AUXR1 = 0XA2; // AD 转换结果存储方式控制位 sfr ADC_CONTR = 0xBC; //AD 转换控制寄存器 sfr ADC_RES = 0xBD; //ADC high 8-bit result registerAD 转换结果寄存器高 sfr ADC_RESL = 0xBE; // AD 转换结果寄存器低 sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register sfr P1ASF = 0x9D; //P1口模数转换功能控制寄存器 //P1ASF 寄存器:8位,对应P1口8根口线,用于指定哪根口线用作ADC 功能 //哪个口用作ADC 就应置相应的位为“1”,注意:不能位寻址 /*Define ADC operation const for ADC_CONTR(定义ADC的操作常量为ADC_CONTR)*/ #define ADC_POWER 0x80 //ADC power control bit(ADC 电源开) #define ADC_FLAG 0x10 //ADC complete flag ( ADC 结束标志位) #define ADC_START 0x08 //ADC start control bit ADC 启动控制位设为开 #define ADC_SPEEDLL 0x00 //420 clocks #define ADC_SPEEDL 0x20 //280 clocks #define ADC_SPEEDH 0x40 //140 clocks #define ADC_SPEEDHH 0x60 //70 clocks 设为70个时钟周期ADC 一次 /* ADC_CTRL 寄存器: ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_STAR CHS2 CHS1 CHS0 1 2 3 4 5 6 7 8 第1 位: =1 打开ADC 电源;=0 关闭ADC 电源; ADC 前要一定要打开 第4-7位: =1 1 70个时钟周期ADC 一次; =1 0 140个时钟周期ADC 一次; =0 1 280个时钟周期ADC 一次; =0 0 420个时钟周期ADC 一次; 第2位: ADC 结束标志位,每次ADC 结束时自动=1,需要用软件清零才可以进行下一次ADC 第3位: ADC 启动控制位,置“1”则ADC 转换开始,转换结束后为0 第6-7-8位:ADC 通道选择000-->P1.0 ........111-->P1.7 */ void InitUart();//中断 void InitADC(); void SendData(BYTE dat); int GetADCResult(BYTE ch); void Delay(WORD n); uchar ge,shi,bai,qian,wan; //显示变量 void conversion(uint temp_data) { wan=temp_data/10000+0x30 ; temp_data=temp_data%10000; //取余运算 qian=temp_data/1000+0x30 ; temp_data=temp_data%1000; //取余运算 bai=temp_data/100+0x30 ; temp_data=temp_data%100; //取余运算 shi=temp_data/10+0x30 ; temp_data=temp_data%10; //取余运算 ge=temp_data+0x30; } /*---------------------------- Get ADC result ----------------------------*/ int GetADCResult(BYTE ch) //有参数输入 通道几 0-7 P1^0----P1^7 { int AD10bitResult; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; // 打开电源 设定转换速度 0-7 路任意一路 启动AD转换 _nop_(); //延时4个时钟 重要! _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//等待AD转换结束标志位置1 ADC_CONTR &= ~ADC_FLAG; //清除 AD 转换结束标志位 AD10bitResult=ADC_RES; AD10bitResult<<=8; AD10bitResult|=ADC_RESL; return AD10bitResult; //返回 ADC 数据 } /*---------------------------- Initial UART ----------------------------*/ void InitUart() { SCON = 0x5a; //8 bit data ,no parity bit TMOD = 0x20; //T1 as 8-bit auto reload TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate TR1 = 1; //T1 start running } /*---------------------------- Initial ADC sfr //P1^0 口为AD 输入 ----------------------------*/ void InitADC() { P1ASF = 0xff; //P1ASF = 0x60; P1^0置为模拟功能 8路都可以作为AD输入 AUXR1=AUXR1|0X04; //ad值左对齐 ADC_RES = 0; // 清除AD转换结果寄存器之前的转换数据 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //初次打开ADC电源要等待 } /*---------------------------- Send one byte data to PC Input: dat (UART data) Output:- ----------------------------*/ void SendData(BYTE dat) { while (!TI); //等待接收数据 TI = 0; //Clear TI flag SBUF = dat; //Send current data 发送当前数据 } /*---------------------------- Software delay function ----------------------------*/ void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } //****************************************************************************** void main() { int x,y,z; float Q,T,K,Roll,Pitch; InitUart(); //Init UART, use to show ADC result InitADC(); SL=0; //Init ADC sfr while (1) { x=GetADCResult(0); y=GetADCResult(1); z=GetADCResult(2); // 0-5v 对应 0-1024 // 3.3v/2 = 1.65v(0g时候值) // 1.65v ->= 338 (AD值即十进制338,十六进制0X0152) x-=0X0152; // y-=0X0152; z-=0X0152; Q=x; T=y; K=z; Q=-Q; Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180); Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180); conversion(Roll); //横滚角0-360度 conversion(Pitch); //俯仰角0-360度 SendData(bai); SendData(shi); SendData(ge); SendData(bai); SendData(shi); SendData(ge); SendData(0x0a); SendData(0x0b);//换行,回车 Delay(30); } } |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 15:00 , Processed in 0.671654 second(s), Total 73, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号