找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1775|回复: 2
打印 上一主题 下一主题
收起左侧

MMA7361角度传感器STC源程序 LCD1602显示

[复制链接]
跳转到指定楼层
楼主
ID:777263 发表于 2020-7-7 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51内核 STC 单片机角度传感器源程序,有需要的朋友拿走

单片机源程序如下:
  1. /************* MMA7361 *************
  2. ************** 三轴电压采集 三轴电压采集点 分别为P0.0 P0.1 P0.2 如遇到问题请先仔细看资料  *************
  3. //////////////////////// /***********************************************************************
  4. /*             LCD1602
  5. LCD1602显示  rs P3^5  rw P3^6  ep P3^7  P0口 为数据输出口

  6. ***********************************************************************///////////////////////
  7. //************** STC12 ADC电压采集测试程序 *************/


  8. #include "stc8.h"
  9. #include "intrins.h"

  10. #define uchar unsigned char  
  11. #define uint unsigned int

  12. uchar Vo,Vx,Vy; //A/D转换后换算的电压值
  13. int v=0,g;
  14. int i,e,h;




  15. sbit rw=P3^6;    //1602 IO口定义  这里用的数据口是P2口
  16. sbit rs=P3^5;
  17. sbit ep=P3^7;

  18. uchar code asc[] = "0123456789";  

  19. unsigned char code d[] = {"MMA7361  X: .  V"};

  20. unsigned char code b[]=  {"Y: .  V  Z: .  V"};




  21. /**************************** 延时函数 ***********************************/
  22. void delay(unsigned int a)
  23. {
  24. while(a--);
  25. }










  26. /*----------------------------
  27. Get ADC result
  28. ----------------------------*/
  29. uchar GetADCResult(uchar ch)
  30. {   
  31.   
  32.     ADC_CONTR = ADC_POWER | ADC_START | ch  ;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
  33.                                                          // 这么用语句的主要原因就是不能位寻址
  34.                                                          //   通道选择在后3位所以直接用一个整数表示ch
  35.                                                          //例如ch=6 那么对应的后三位就是110           
  36.     _nop_();         //Must wait before inquiry ,
  37.     _nop_(); //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
  38.     _nop_();
  39.     _nop_();
  40.     _nop_();
  41.     _nop_();
  42.     _nop_();
  43.     _nop_();
  44.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  45.    ADC_CONTR &= ~ADC_FLAG;         //Close ADC 将标志位清零等待下次硬件置1
  46.    //也可以写成 ADC_CONTR= ADC_CONTR & ( ~ADC_FLAG)

  47.    Vo=ADC_RES*4.7*100/256;                 //Return ADC result(为显示整数,这里将电压值扩大了十倍)
  48.    return Vo;
  49.   // return ADC_RES;
  50. }

  51. /*************************************************************************************/

  52. /*************************************************************************************/

  53. /*****************************     1602    *******************************************/
  54. bit lcd_busy()               //查忙 这部很重要 否则有的显示容易出现乱码                                             
  55. {                                                                          
  56.     bit result;                                                            
  57.     rs = 0;                                                            
  58.     rw = 1;                                                            
  59.     ep = 1;                                                            
  60.     delay(50);                                                            
  61.      result = (bit)(P0&0x80);                                             
  62.     ep = 0;                                                            
  63.     return result;             //返回值                                            
  64. }  







  65. void lcd_com(unsigned char com)//  地址
  66. {
  67. while(lcd_busy());
  68. rs=0;
  69. ep=0;
  70. rw=0;
  71. P0=com;
  72. delay(50);
  73. ep=1;
  74. delay(50);
  75. ep=0;
  76. }


  77. void lcd_date(unsigned char date)//采集输出数据
  78. {
  79. while(lcd_busy());
  80. rs=1;   //1是些数据 0是写指令
  81. rw=0;    // 1是读  0是写
  82. ep=0;    //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令      
  83. P0=date;
  84. delay(5);
  85. ep=1;
  86. delay(5);
  87. ep=0;
  88. }



  89. void lcd_pos(unsigned char pos)                                                   
  90. {                                                                          
  91.    lcd_com(pos|0x80);      //数据指针=80+地址变量                     
  92. }     








  93. void init()//1602初始化
  94. {
  95.                                                                
  96. lcd_com(0x38);
  97. delay(50);                                                              
  98. lcd_com(0x38);
  99. delay(50);

  100. lcd_com(0x38);
  101. delay(50);
  102. lcd_com(0x0c);
  103. delay(50);
  104. lcd_com(0x06);
  105. delay(50);
  106. lcd_com(0x01);




  107. }



  108. /************************************************************************/






  109. void main(void)
  110. {  
  111. //三个采集通道  P10 P11 P12配置为高阻状态
  112. P1M0=0X00;
  113. P1M1=0X03;


  114. TMOD=0x01;             //选择定时器T0 在工作方式1上 即16位定时器
  115. TH0=(65536-50000)/256;  //11.592M晶振的一个机器周期接近1us 这里5W就是0.05s
  116. TL0=(65536-50000)%256;
  117. EA=1;                   //开启总中断
  118. ET0=1;                  //开启定时器T0
  119. TR0=1;                 // 启动定时器 使其开始计算




  120.    init();                //1602初始化


  121. lcd_pos(0x00);            //显示字母
  122. i=0;
  123. while(d[i]!='\0')         
  124. {
  125. lcd_date(d[i]);
  126. i++;
  127. }


  128. lcd_pos(0x40);
  129. i=0;
  130. while(b[i]!='\0')
  131. {
  132. lcd_date(b[i]);
  133. i++;
  134. }




  135. while(1)
  136. {


  137. if(v==1)
  138. {

  139. lcd_pos(0x0B);
  140. lcd_date(asc[Vo/100]);
  141. lcd_pos(0x0D);
  142. lcd_date(asc[Vo%100/10]);
  143. lcd_date(asc[Vo%100%10]);
  144. delay(1000);
  145. }




  146. if(v==2)
  147. {

  148. lcd_pos(0x42);
  149. lcd_date(asc[Vo/100]);
  150. lcd_pos(0x44);
  151. lcd_date(asc[Vo%100/10]);
  152. lcd_date(asc[Vo%100%10]);
  153. delay(1000);
  154. }

  155. if(v==3)
  156. {

  157. lcd_pos(0x4b);
  158. lcd_date(asc[Vo/100]);
  159. lcd_pos(0x4d);
  160. lcd_date(asc[Vo%100/10]);
  161. lcd_date(asc[Vo%100%10]);
  162. delay(1000);
  163. }

  164. }


  165. }







  166. void ADCt0() interrupt 1 using 0
  167. {
  168. TH0 = (65536-50000)/256;
  169. TL0 = (65536-50000)%256;
  170. e++;
  171. if(e==6)
  172. ……………………

  173. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有程序51hei提供下载:
MMA7361角度传感器.rar (49.7 KB, 下载次数: 36)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:897819 发表于 2021-3-28 23:32 来自手机 | 只看该作者
有没有proteus的原理图啊?
回复

使用道具 举报

板凳
ID:385637 发表于 2021-3-29 11:26 | 只看该作者
以前没接触过角度传感器,好资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表