久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5163|回復: 5
打印 上一主題 下一主題
收起左側

QMC5883L單片機LCD1602顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:273434 發表于 2018-6-30 21:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
QMC5883L單片機lcd顯示
首先,這個程序我調試好幾天成功的,用的89c52,11.0590MHZ,網上基本沒有現成的程序,為了滿足大家的需要。我把程序貼給大家,讓大家能受用。
注意這是QMC5833(芯片是DA5883)國產的

單片機源程序如下:
  1. //***************************************
  2. // HMC5883 IIC測試程序
  3. // 使用單片機STC89C51
  4. // 晶振:11.0592M
  5. // 顯示:LCD1602
  6. // 編譯環境 Keil uVision2
  7. // 參考宏晶網站24c04通信程序
  8. //****************************************
  9. #include  <REG51.H>        
  10. #include  <math.h>    //Keil library  
  11. #include  <stdio.h>   //Keil library        
  12. #include  <INTRINS.H>
  13. #define   uchar unsigned char
  14. #define   uint unsigned int        
  15. //使用的端口,請按照以下接線
  16. #define   DataPort P0        //LCD1602數據端口
  17. sbit        SCL=P1^0;      //IIC時鐘引腳定義
  18. sbit        SDA=P1^1;      //IIC數據引腳定義
  19. sbit    LCM_RS=P2^4;   //LCD1602命令端口               
  20. sbit    LCM_RW=P2^5;   //LCD1602命令端口               
  21. sbit    LCM_EN=P2^6;   //LCD1602命令端口

  22. #define        SlaveAddress   0x1a          //定義器件在IIC總線中的從地址
  23. typedef unsigned char BYTE;
  24. typedef unsigned short WORD;

  25. BYTE BUF[8];                         //接收數據緩存區              
  26. uchar ge,shi,bai,qian,wan;           //顯示變量
  27. int  dis_data;                       //變量

  28. void delay(unsigned int k);
  29. void InitLcd();
  30. void Init_HMC5883(void);            //初始化5883

  31. void WriteDataLCM(uchar dataW);
  32. void WriteCommandLCM(uchar CMD,uchar Attribc);
  33. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  34. void conversion(uint temp_data);

  35. void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //單個寫入數據
  36. uchar Single_Read_HMC5883(uchar REG_Address);                   //單個讀取內部寄存器數據
  37. void  Multiple_Read_HMC5883();                                  //連續的讀取內部寄存器數據
  38. //以下是模擬iic使用函數-------------
  39. void Delay5us();
  40. void Delay5ms();
  41. void HMC5883_Start();
  42. void HMC5883_Stop();
  43. void HMC5883_SendACK(bit ack);
  44. bit  HMC5883_RecvACK();
  45. void HMC5883_SendByte(BYTE dat);
  46. BYTE HMC5883_RecvByte();
  47. void HMC5883_ReadPage();
  48. void HMC5883_WritePage();
  49. //-----------------------------------

  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. void delay(unsigned int k)        
  65. {                                                
  66. unsigned int i,j;                                
  67. for(i=0;i<k;i++)
  68. {                        
  69. for(j=0;j<121;j++)                        
  70. {;}}                                                
  71. }
  72. /*******************************/
  73. void WaitForEnable(void)        
  74. {                                       
  75. DataPort=0xff;               
  76. LCM_RS=0;LCM_RW=1;_nop_();
  77. LCM_EN=1;_nop_();_nop_();
  78. while(DataPort&0x80);        
  79. LCM_EN=0;                                
  80. }                                       
  81. /*******************************/
  82. void WriteCommandLCM(uchar CMD,uchar Attribc)
  83. {                                       
  84. if(Attribc)WaitForEnable();        
  85. LCM_RS=0;LCM_RW=0;_nop_();
  86. DataPort=CMD;_nop_();        
  87. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  88. }                                       
  89. /*******************************/
  90. void WriteDataLCM(uchar dataW)
  91. {                                       
  92. WaitForEnable();               
  93. LCM_RS=1;LCM_RW=0;_nop_();
  94. DataPort=dataW;_nop_();        
  95. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  96. }               
  97. /***********************************/
  98. void InitLcd()                                
  99. {                        
  100. WriteCommandLCM(0x38,1);        
  101. WriteCommandLCM(0x08,1);        
  102. WriteCommandLCM(0x01,1);        
  103. WriteCommandLCM(0x06,1);        
  104. WriteCommandLCM(0x0c,1);
  105. }                        
  106. /***********************************/
  107. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  108. {                                                
  109. Y&=1;                                                
  110. X&=15;                                                
  111. if(Y)X|=0x40;                                       
  112. X|=0x80;                        
  113. WriteCommandLCM(X,0);               
  114. WriteDataLCM(DData);               
  115. }                                                

  116. /**************************************
  117. 延時5微秒(STC90C52RC@12M)
  118. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  119. 當改用1T的MCU時,請調整此延時函數
  120. **************************************/
  121. void Delay5us()
  122. {
  123.              _nop_();_nop_();_nop_();_nop_();
  124.              _nop_();_nop_();_nop_();_nop_();
  125.         _nop_();_nop_();_nop_();_nop_();
  126.         _nop_();_nop_();_nop_();_nop_();
  127.               _nop_();_nop_();_nop_();_nop_();
  128.         _nop_();_nop_();_nop_();_nop_();
  129.         _nop_();_nop_();_nop_();_nop_();
  130.              _nop_();_nop_();_nop_();_nop_();

  131. }

  132. /**************************************
  133. 延時5毫秒(STC90C52RC@12M)
  134. 不同的工作環境,需要調整此函數
  135. 當改用1T的MCU時,請調整此延時函數
  136. **************************************/
  137. void Delay5ms()
  138. {
  139.     WORD n = 560;

  140.     while (n--);
  141. }

  142. /**************************************
  143. 起始信號
  144. **************************************/
  145. void HMC5883_Start()
  146. {
  147.     SDA = 1;                    //拉高數據線
  148.     SCL = 1;                    //拉高時鐘線
  149.     Delay5us();                 //延時
  150.     SDA = 0;                    //產生下降沿
  151.     Delay5us();                 //延時
  152.     SCL = 0;                    //拉低時鐘線
  153. }

  154. /**************************************
  155. 停止信號
  156. **************************************/
  157. void HMC5883_Stop()
  158. {
  159.     SDA = 0;                    //拉低數據線
  160.     SCL = 1;                    //拉高時鐘線
  161.     Delay5us();                 //延時
  162.     SDA = 1;                    //產生上升沿
  163.     Delay5us();                 //延時
  164. }

  165. /**************************************
  166. 發送應答信號
  167. 入口參數:ack (0:ACK 1:NAK)
  168. **************************************/
  169. void HMC5883_SendACK(bit ack)
  170. {
  171.     SDA = ack;                  //寫應答信號
  172.     SCL = 1;                    //拉高時鐘線
  173.     Delay5us();                 //延時
  174.     SCL = 0;                    //拉低時鐘線
  175.     Delay5us();                 //延時
  176. }

  177. /**************************************
  178. 接收應答信號
  179. **************************************/
  180. bit HMC5883_RecvACK()
  181. {
  182.     SCL = 1;                    //拉高時鐘線
  183.     Delay5us();                 //延時
  184.     CY = SDA;                   //讀應答信號
  185.     SCL = 0;                    //拉低時鐘線
  186.     Delay5us();                 //延時

  187.     return CY;
  188. }

  189. /**************************************
  190. 向IIC總線發送一個字節數據
  191. **************************************/
  192. void HMC5883_SendByte(BYTE dat)
  193. {
  194.     BYTE i;

  195.     for (i=0; i<8; i++)         //8位計數器
  196.     {
  197.         dat <<= 1;              //移出數據的最高位
  198.         SDA = CY;               //送數據口
  199.         SCL = 1;                //拉高時鐘線
  200.         Delay5us();             //延時
  201.         SCL = 0;                //拉低時鐘線
  202.         Delay5us();             //延時
  203.     }
  204.     HMC5883_RecvACK();
  205. }

  206. /**************************************
  207. 從IIC總線接收一個字節數據
  208. **************************************/
  209. BYTE HMC5883_RecvByte()
  210. {
  211.     BYTE i;
  212.     BYTE dat = 0;

  213.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  214.     for (i=0; i<8; i++)         //8位計數器
  215.     {
  216.         dat <<= 1;
  217.         SCL = 1;                //拉高時鐘線
  218.         Delay5us();             //延時
  219.         dat |= SDA;             //讀數據               
  220.         SCL = 0;                //拉低時鐘線
  221.         Delay5us();             //延時
  222.     }
  223.     return dat;
  224. }

  225. //***************************************************

  226. void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
  227. {
  228.     HMC5883_Start();                  //起始信號
  229.     HMC5883_SendByte(SlaveAddress);   //發送設備地址+寫信號
  230.     HMC5883_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf
  231.     HMC5883_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf
  232.     HMC5883_Stop();                   //發送停止信號
  233. }

  234. //********單字節讀取內部寄存器*************************
  235. uchar Single_Read_HMC5883(uchar REG_Address)
  236. {  uchar REG_data;
  237.     HMC5883_Start();                          //起始信號
  238.     HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
  239.     HMC5883_SendByte(REG_Address);                   //發送存儲單元地址,從0開始        
  240.     HMC5883_Start();                          //起始信號
  241.     HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  242.     REG_data=HMC5883_RecvByte();              //讀出寄存器數據
  243.         HMC5883_SendACK(1);   
  244.         HMC5883_Stop();                           //停止信號
  245.     return REG_data;
  246. }
  247. //******************************************************
  248. //
  249. //連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
  250. //
  251. //******************************************************
  252. void Multiple_Read_HMC5883(void)
  253. {   uchar i;
  254.     HMC5883_Start();                          //起始信號
  255.     HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
  256.     HMC5883_SendByte(0x03);                   //發送存儲單元地址,從0x3開始        
  257.     HMC5883_Start();                          //起始信號
  258.     HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  259.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  260.     {
  261.         BUF[i] = HMC5883_RecvByte();          //BUF[0]存儲數據
  262.         if (i == 5)
  263.         {
  264.            HMC5883_SendACK(1);                //最后一個數據需要回NOACK
  265.         }
  266.         else
  267.         {
  268.           HMC5883_SendACK(0);                //回應ACK
  269.        }
  270.    }
  271.     HMC5883_Stop();                          //停止信號
  272.     Delay5ms();
  273. }

  274. //初始化HMC5883,根據需要請參考pdf進行修改****
  275. void Init_HMC5883()
  276. {
  277.      Single_Write_HMC5883(0x0B,0x01);
  278.          Single_Write_HMC5883(0x20,0x40);
  279.          Single_Write_HMC5883(0x21,0x01);
  280.          Single_Write_HMC5883(0x09,0x0d); //
  281. }
  282. //*********************************************************
  283. //主程序********
  284. //*********************************************************
  285. void main()
  286. { // bit sign_bit;
  287.    unsigned int i;
  288.    int x,y,z;
  289.    double angle;

  290.    delay(500);                        
  291.    InitLcd();
  292.    Init_HMC5883();
  293.   while(1)            //循環
  294.   {
  295.     Multiple_Read_HMC5883();      //連續讀出數據,存儲在BUF中
  296. //---------顯示X軸
  297.     x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register
  298.     y=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
  299.     z=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

  300.     angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
  301.     angle*=10;
  302.     conversion(angle);       //計算數據和顯示
  303.         DisplayOneChar(2,0,'A');
  304.     DisplayOneChar(3,0,':');
  305.     DisplayOneChar(4,0,qian);
  306.     DisplayOneChar(5,0,bai);
  307.     DisplayOneChar(6,0,shi);
  308.     DisplayOneChar(7,0,'.');
  309.         DisplayOneChar(8,0,ge);

  310.     for (i=0;i<10000;i++);   //延時                  
  311.   }
  312. }
復制代碼

所有資料51hei提供下載:
HMC5883成功.zip (2.52 MB, 下載次數: 49)


評分

參與人數 2黑幣 +55 收起 理由
不負時光~田 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:229445 發表于 2018-7-16 15:17 | 只看該作者
謝謝大佬
回復

使用道具 舉報

板凳
ID:229445 發表于 2018-7-16 15:18 | 只看該作者
你是更改的寄存器嗎
回復

使用道具 舉報

地板
ID:273434 發表于 2018-7-24 18:41 | 只看該作者
密碼忘了 發表于 2018-7-16 15:18
你是更改的寄存器嗎

自己慢慢調試的
回復

使用道具 舉報

5#
ID:387235 發表于 2018-9-13 14:55 | 只看該作者
你不是HMC5883 看寄存器應該是qmc5883。你這樣發出來會混淆視聽,坑害初學者
回復

使用道具 舉報

6#
ID:273434 發表于 2019-1-21 11:05 | 只看該作者
zhongshuai586 發表于 2018-9-13 14:55
你不是HMC5883 看寄存器應該是qmc5883。你這樣發出來會混淆視聽,坑害初學者

你看看我的文字,哪里說是HMC5883了,?你在逗我嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品福利视频 | 婷婷综合五月天 | 夜操| 特级生活片 | 国产一区二区三区四区在线观看 | 女同久久另类99精品国产 | av高清毛片 | 综合久久网| 国产精品久久a | 午夜www | 国产精品一区二区三区四区 | 久久国产精品免费视频 | 午夜伦4480yy私人影院 | 有码一区| 91久久精品一区二区二区 | 一区二区三区四区日韩 | 久久精品免费一区二区 | 久草精品视频 | 中国一级特黄视频 | 又黄又色| 成人午夜毛片 | 97国产精品视频人人做人人爱 | 亚洲综合色婷婷 | 国产免费一区二区三区 | 日日操夜夜操天天操 | 欧美色综合一区二区三区 | 国产97在线看 | 一区二区三区网站 | 色在线看| 在线日韩欧美 | 欧美电影免费观看高清 | 国产精品久久av | 亚洲va中文字幕 | 天天干天天操天天射 | 婷婷成人在线 | 超碰国产在线 | 久久精品日产第一区二区三区 | 国产目拍亚洲精品99久久精品 | h在线看 | 亚洲高清视频在线观看 | 欧美精品三区 |