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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機控制按鍵每按一次角度對應加10度

[復制鏈接]
跳轉到指定樓層
樓主
怎么通過ADD 和DEC按鍵 每按一次角度對應加10度?

  1. #include  <REG51.H>        
  2. #include  <math.h>    //Keil library  
  3. #include  <stdio.h>   //Keil library        
  4. #include  <INTRINS.H>
  5. #define   uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
  6. #define   uint unsigned int          //無符號整型 宏定義 變量范圍0~65535
  7. //使用的端口,請按照以下接線
  8. #define   DataPort P0        //LCD1602數據端口
  9. sbit        SCL=P3^6;      //IIC時鐘引腳定義
  10. sbit        SDA=P3^3;      //IIC數據引腳定義
  11. sbit    LCM_RS=P1^0;   //LCD1602命令端口               
  12. sbit    LCM_RW=P1^1;   //LCD1602命令端口               
  13. sbit    LCM_EN=P1^2;   //LCD1602命令端口
  14. sbit DQ=P2^7;//數據端
  15. sbit  BUZZ=P2^0; //蜂鳴器
  16. sbit ADD=P3^4;
  17. sbit DEC=P3^5;
  18. sbit LED_GREEN=P2^1;
  19. sbit LED_YELLOW=P2^2;
  20. uint tempL,tempH;

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

  24. unsigned char TxDate[4];
  25. unsigned int ReadTempDate;//讀取溫度


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

  29. void delay_ms(unsigned int t);
  30. void InitLcd();
  31. void Init_HMC5883(void);            //初始化5883

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

  36. void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //單個寫入數據
  37. //uchar Single_Read_HMC5883(uchar REG_Address);                 /單個讀取內部寄存器數據
  38. void  Multiple_Read_HMC5883();                                  //連續的讀取內部寄存器數據
  39. //以下是模擬iic使用函數-------------
  40. void Delay5us();
  41. void Delay5ms();
  42. void HMC5883_Start();
  43. void HMC5883_Stop();
  44. void HMC5883_SendACK(bit ack);
  45. bit  HMC5883_RecvACK();
  46. void HMC5883_SendByte(BYTE dat);
  47. BYTE HMC5883_RecvByte();
  48. void HMC5883_ReadPage();
  49. void HMC5883_WritePage();
  50. //-----------------------------------
  51. /**********************************************
  52.    DS18B20專用延時子函數
  53. **********************************************/
  54. void DDelay(uint t)
  55. {
  56.         uint n;
  57.         n=0;
  58.         while(n<t)
  59.         {
  60.           n++;
  61.         }
  62. }


  63. /*********************************************************
  64.         DS18B20復位函數
  65. **********************************************************/
  66. void Reset()
  67. {   
  68.         DQ=1;
  69.         DDelay(8);
  70.         DQ=0;
  71.         DDelay(85);
  72.         DQ=1;
  73.         DDelay(14);

  74. }
  75. /***********************************************************
  76.         DS18B20寫一個字節函數
  77. *********************************************************/
  78. void WriteChar(uchar dat)
  79. {
  80.           uint i;
  81.           for(i=8;i>0;i--)
  82.           {
  83.                 DQ=0;   
  84.                 DQ=dat&0x01;
  85.                 DDelay(5);
  86.                 DQ=1;
  87.                 dat>>=1;
  88.            }
  89.          DDelay(4);
  90. }
  91. /****************************************************
  92.          DS18B20讀一個字節函數
  93. ****************************************************/
  94. uint ReadChar()
  95. {                        
  96.         uchar i,dat=0;
  97.         for (i=8;i>0;i--)
  98.         {
  99.                 DQ=1;
  100.                 DDelay(1);
  101.                 DQ=0;  
  102.                 dat>>=1;
  103.                 DQ=1;
  104.                 if(DQ)
  105.                   dat=dat|0x80;
  106.                   DDelay(4);
  107.      }
  108. return(dat);
  109. }
  110. /***************************************************
  111.         DS18B20讀溫度程序
  112. ****************************************************/
  113. uint ReadTemperature()
  114. {
  115.     uint temperature;
  116.         Reset();
  117.         WriteChar(0xcc);
  118.         WriteChar(0x44);
  119.         DDelay(125);
  120.         Reset();
  121.         WriteChar(0xcc);
  122.         WriteChar(0xbe);
  123.         tempL=ReadChar();
  124.         tempH=ReadChar();
  125.         temperature=((tempH*256)+tempL)*0.0625*10;         
  126.         DDelay(200);
  127.         return(temperature); //返回的是0123格式
  128. }

  129. //*************************顯示在LCD的數據********************************
  130. void conversion(uint temp_data)  
  131. {  
  132.     wan=temp_data/10000+0x30 ;
  133.     temp_data=temp_data%10000;   //取余運算
  134.         qian=temp_data/1000+0x30 ;
  135.     temp_data=temp_data%1000;    //取余運算
  136.     bai=temp_data/100+0x30   ;
  137.     temp_data=temp_data%100;     //取余運算
  138.     shi=temp_data/10+0x30    ;
  139.     temp_data=temp_data%10;      //取余運算
  140.     ge=temp_data+0x30;         
  141. }


  142. void delay(unsigned int k)        
  143. {                                                
  144. unsigned int i,j;                                
  145. for(i=0;i<k;i++)
  146. {                        
  147. for(j=0;j<121;j++)                        
  148. {;}}                                                
  149. }





  150. /**************延時函數*****************/
  151. void Delay_ms(unsigned int t)        
  152. {                                                
  153.         unsigned int i,j;                                
  154.         for(i=t;i>0;i--)
  155.         for(j=121;j>0;j--);                                                
  156. }
  157. /***************等待LCD使能****************/
  158. void WaitForEnable(void)        
  159. {                                       
  160.         DataPort=0xff;               
  161.         LCM_RS=0;
  162.         LCM_RW=1;
  163.         _nop_();
  164.         LCM_EN=1;
  165.         _nop_();
  166.         _nop_();
  167.         while(DataPort&0x80);        
  168.         LCM_EN=0;                                
  169. }                                       
  170. /**************寫LCD內存命令函數*****************/
  171. void WriteCommandLCM(uchar CMD,uchar Attribc)
  172. {                                       
  173.         if(Attribc)WaitForEnable();        
  174.         LCM_RS=0;
  175.         LCM_RW=0;
  176.         _nop_();
  177.         DataPort=CMD;
  178.         _nop_();        
  179.         LCM_EN=1;
  180.         _nop_();
  181.         _nop_();
  182.         LCM_EN=0;
  183. }                                       
  184. /**************寫LCD數據寄存器*****************/
  185. void WriteDataLCM(uchar dataW)
  186. {                                       
  187.         WaitForEnable();               
  188.         LCM_RS=1;
  189.         LCM_RW=0;
  190.         _nop_();
  191.         DataPort=dataW;
  192.         _nop_();        
  193.         LCM_EN=1;
  194.         _nop_();
  195.         _nop_();
  196.         LCM_EN=0;
  197. }               
  198. /****************初始化LCD*******************/
  199. void InitLcd()                                
  200. {                        
  201.         WriteCommandLCM(0x38,1);        
  202.         WriteCommandLCM(0x08,1);        
  203.         WriteCommandLCM(0x01,1);        
  204.         WriteCommandLCM(0x06,1);        
  205.         WriteCommandLCM(0x0c,1);
  206. }                        
  207. /****************顯示一個字符*******************/
  208. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  209. {                                                
  210.         Y&=1;                                                
  211.         X&=15;                                                
  212.         if(Y)X|=0x40;                                       
  213.         X|=0x80;                        
  214.         WriteCommandLCM(X,0);                 
  215.         WriteDataLCM(DData);               
  216. }                                                

  217. /**************************************
  218. 延時5微秒(STC90C52RC@12M)
  219. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  220. 當改用1T的MCU時,請調整此延時函數
  221. **************************************/
  222. void Delay5us()
  223. {
  224.         _nop_();_nop_();_nop_();_nop_();
  225.         _nop_();_nop_();_nop_();_nop_();
  226.         _nop_();_nop_();_nop_();_nop_();
  227.         _nop_();_nop_();_nop_();_nop_();
  228.         _nop_();_nop_();_nop_();_nop_();
  229.         _nop_();_nop_();_nop_();_nop_();
  230.         _nop_();_nop_();_nop_();_nop_();
  231.         _nop_();_nop_();_nop_();_nop_();
  232. }

  233. /**************************************
  234. 延時5毫秒(STC90C52RC@12M)
  235. 不同的工作環境,需要調整此函數
  236. 當改用1T的MCU時,請調整此延時函數
  237. **************************************/
  238. void Delay5ms()
  239. {
  240.     WORD n = 560;

  241.     while (n--);
  242. }

  243. /**************************************
  244. 起始信號
  245. **************************************/
  246. void HMC5883_Start()
  247. {
  248.     SDA = 1;                    //拉高數據線
  249.     SCL = 1;                    //拉高時鐘線
  250.     Delay5us();                 //延時
  251.     SDA = 0;                    //產生下降沿
  252.     Delay5us();                 //延時
  253.     SCL = 0;                    //拉低時鐘線
  254. }

  255. /**************************************
  256. 停止信號
  257. **************************************/
  258. void HMC5883_Stop()
  259. {
  260.     SDA = 0;                    //拉低數據線
  261.     SCL = 1;                    //拉高時鐘線
  262.     Delay5us();                 //延時
  263.     SDA = 1;                    //產生上升沿
  264.     Delay5us();                 //延時
  265. }

  266. /**************************************
  267. 發送應答信號
  268. 入口參數:ack (0:ACK 1:NAK)
  269. **************************************/
  270. void HMC5883_SendACK(bit ack)
  271. {
  272.     SDA = ack;                  //寫應答信號
  273.     SCL = 1;                    //拉高時鐘線
  274.     Delay5us();                 //延時
  275.     SCL = 0;                    //拉低時鐘線
  276.     Delay5us();                 //延時
  277. }

  278. /**************************************
  279. 接收應答信號
  280. **************************************/
  281. bit HMC5883_RecvACK()
  282. {
  283.     SCL = 1;                    //拉高時鐘線
  284.     Delay5us();                 //延時
  285.     CY = SDA;                   //讀應答信號
  286.     SCL = 0;                    //拉低時鐘線
  287.     Delay5us();                 //延時

  288.     return CY;
  289. }

  290. /**************************************
  291. 向IIC總線發送一個字節數據
  292. **************************************/
  293. void HMC5883_SendByte(BYTE dat)
  294. {
  295.     BYTE i;

  296.     for (i=0; i<8; i++)         //8位計數器
  297.     {
  298.         dat <<= 1;              //移出數據的最高位
  299.         SDA = CY;               //送數據口
  300.         SCL = 1;                //拉高時鐘線
  301.         Delay5us();             //延時
  302.         SCL = 0;                //拉低時鐘線
  303.         Delay5us();             //延時
  304.     }
  305.     HMC5883_RecvACK();
  306. }

  307. /**************************************
  308. 從IIC總線接收一個字節數據
  309. **************************************/
  310. BYTE HMC5883_RecvByte()
  311. {
  312.     BYTE i;
  313.     BYTE dat = 0;

  314.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  315.     for (i=0; i<8; i++)         //8位計數器
  316.     {
  317.         dat <<= 1;
  318.         SCL = 1;                //拉高時鐘線
  319.         Delay5us();             //延時
  320.         dat |= SDA;             //讀數據               
  321.         SCL = 0;                //拉低時鐘線
  322.         Delay5us();             //延時
  323.     }
  324.     return dat;
  325. }

  326. //************************寫入單字節數據***************************

  327. void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
  328. {
  329.     HMC5883_Start();                  //起始信號
  330.     HMC5883_SendByte(SlaveAddress);   //發送設備地址+寫信號
  331.     HMC5883_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf
  332.     HMC5883_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf
  333.     HMC5883_Stop();                   //發送停止信號
  334. }

  335. //************************讀取內部寄存器*************************
  336. //uchar Single_Read_HMC5883(uchar REG_Address)
  337. //{   
  338. //        uchar REG_data;
  339. //  HMC5883_Start();                          //起始信號
  340. //  HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
  341. //  HMC5883_SendByte(REG_Address);            //發送存儲單元地址,從0開始        
  342. //  HMC5883_Start();                          //起始信號
  343. //  HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  344. //  REG_data=HMC5883_RecvByte();              //讀出寄存器數據
  345. //        HMC5883_SendACK(1);   
  346. //        HMC5883_Stop();                           //停止信號
  347. //  return REG_data;
  348. //}

  349. //******************************************************
  350. //連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
  351. //******************************************************
  352. void Multiple_Read_HMC5883(void)
  353. {   uchar i;
  354.     HMC5883_Start();                          //起始信號
  355.     HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
  356.     HMC5883_SendByte(0x03);                   //發送存儲單元地址,從0x3開始        
  357.     HMC5883_Start();                          //起始信號
  358.     HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  359.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  360.     {
  361.         BUF[i] = HMC5883_RecvByte();          //BUF[0]存儲數據
  362.         if (i == 5)
  363.         {
  364.            HMC5883_SendACK(1);                //最后一個數據需要回NOACK
  365.         }
  366.         else
  367.         {
  368.           HMC5883_SendACK(0);                //回應ACK
  369.        }
  370.    }
  371.     HMC5883_Stop();                          //停止信號
  372.     Delay5ms();
  373. }

  374. //初始化HMC5883,根據需要請參考說明書進行修改****
  375. void Init_HMC5883()
  376. {
  377.      Single_Write_HMC5883(0x02,0x00);  //
  378. }



  379. void show()
  380. {
  381.    InitLcd();
  382.    DisplayOneChar(1,0,'H');
  383.    DisplayOneChar(2,0,'e');
  384.    DisplayOneChar(3,0,'l');
  385.    DisplayOneChar(4,0,'l');
  386.    DisplayOneChar(5,0,'0');
  387.    DisplayOneChar(6,0,',');
  388.    DisplayOneChar(7,0,'W');
  389.    DisplayOneChar(8,0,'e');
  390.    DisplayOneChar(9,0,'l');
  391.    DisplayOneChar(10,0,'c');
  392.    DisplayOneChar(11,0,'o');
  393.    DisplayOneChar(12,0,'m');
  394.    DisplayOneChar(13,0,'e');
  395.    delay(1500);

  396.    DisplayOneChar(1,1,'X');     //顯示姓名或者學號
  397.    DisplayOneChar(2,1,'i');
  398.    DisplayOneChar(3,1,'a');
  399.         
  400.    DisplayOneChar(5,1,'Q');
  401.    DisplayOneChar(6,1,'i');
  402.    DisplayOneChar(7,1,'a');
  403.    DisplayOneChar(8,1,'n');
  404.          
  405.    DisplayOneChar(10,1,'C');
  406.    DisplayOneChar(11,1,'h');
  407.    DisplayOneChar(12,1,'e');
  408.    DisplayOneChar(13,1,'n');
  409.    DisplayOneChar(14,1,'g');
  410.    delay(500);
  411.             delay(1500);

  412.     InitLcd();           //清屏等

  413.     DisplayOneChar(1,0,'C');
  414.         DisplayOneChar(2,0,'o');
  415.         DisplayOneChar(3,0,'m');
  416.     DisplayOneChar(4,0,'p');
  417.         DisplayOneChar(5,0,'a');
  418.         DisplayOneChar(6,0,'s');
  419.         DisplayOneChar(7,0,'s');

  420.         DisplayOneChar(9,0,'S');
  421.         DisplayOneChar(10,0,'y');
  422.         DisplayOneChar(11,0,'s');
  423.         DisplayOneChar(12,0,'t');
  424.         DisplayOneChar(13,0,'e');
  425.         DisplayOneChar(14,0,'m');

  426.         DisplayOneChar(0,1,'T');
  427.     DisplayOneChar(1,1,':');
  428.     DisplayOneChar(6,1,'C');
  429. }


  430. //*********************************************************
  431. //主程序********
  432. //*********************************************************
  433. void main()
  434. { // bit sign_bit;
  435.    unsigned int i;
  436.    int x,y,z;
  437.    double angle;

  438.    Delay_ms(500);                        
  439.    InitLcd();
  440.    Init_HMC5883();
  441.    show(); //開機顯示界面
  442.   while(1)            //循環
  443.   {
  444.     Multiple_Read_HMC5883();      //連續讀出數據,存儲在BUF中
  445. //---------顯示X軸
  446.     x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register  最高有效位
  447.     z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
  448.     y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

  449.     angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
  450.     angle*=10;
  451.     conversion(angle);       //計算數據和顯示
  452.                
  453.         for (i=0;i<30000;i++);   //延時   
  454.           if(angle>=0&angle<900){
  455.              DisplayOneChar(9,1,'E');
  456.           }else if(angle>=900&angle<1800){
  457.              DisplayOneChar(9,1,'S');
  458.           }else if(angle>=1800&angle<2700){
  459.                  DisplayOneChar(9,1,'W');
  460.       }else if(angle>=2700&angle<=3600){
  461.                  DisplayOneChar(9,1,'N');
  462.           }else{
  463.                 DisplayOneChar(9,1,'f');
  464.           }
  465.         if(angle>=899&angle<=901){
  466.            BUZZ=0;
  467.            delay(500);
  468.            BUZZ=1;        

  469.         }  
  470.          
  471.          if(ADD==1)
  472.          {
  473.             delay (20);
  474.               if(ADD==1){
  475.                  angle=angle+50;
  476.                  
  477.                 LED_GREEN=1;}
  478.           else
  479.                
  480.                 LED_GREEN=0;
  481.         }
  482.         


  483.      if(DEC==1)
  484.            {
  485.             
  486.              delay (20);
  487.                 if(DEC==1){
  488.                    angle=angle-50;
  489.                     LED_YELLOW=1;}
  490.                 else
  491.                     
  492.                      LED_YELLOW=0;
  493.             }
  494.    
  495.      
  496.     DisplayOneChar(10,1,':');
  497.     DisplayOneChar(11,1,qian);
  498.     DisplayOneChar(12,1,bai);
  499.     DisplayOneChar(13,1,shi);
  500.     DisplayOneChar(14,1,'.');
  501.     DisplayOneChar(15,1,ge);

  502.     for (i=0;i<10000;i++);   //延時         

  503.         ReadTempDate=ReadTemperature();
  504.         
  505.         TxDate[0]=ReadTempDate/100+'0';
  506.         TxDate[1]=ReadTempDate%100/10+'0';
  507.         TxDate[2]='.';
  508.         TxDate[3]=ReadTempDate%100%10+'0';        

  509.           DisplayOneChar(2, 1, TxDate[0]);
  510.           DisplayOneChar(3, 1, TxDate[1]);        //顯示點
  511.           DisplayOneChar(4, 1, TxDate[2]);
  512.           DisplayOneChar(5, 1, TxDate[3]);
  513.     for (i=0;i<30000;i++);   //延時  
  514.    //        for (i=0;i<30000;i++);   //延時      
  515.    // for (i=0;i<30000;i++);   //延時  
  516.          // for (i=0;i<30000;i++);   //延時     
  517.    // for (i=0;i<30000;i++);   //延時  
  518.         



  519.   }
  520. }
復制代碼


新建 Microsoft Word 文檔 (2).doc

89 KB, 下載次數: 3

新建 Microsoft Word 文檔 (2).doc

47.5 KB, 下載次數: 3

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人国产在线视频 | 欧美黄色网 | 999视频在线播放 | 久久夜夜| 日韩在线一区二区 | 亚洲一区二区在线电影 | 日本又色又爽又黄的大片 | 国产综合视频 | 成人精品在线观看 | av日韩在线播放 | 99精品久久久久 | 精精国产xxxx视频在线播放 | 精品一区二区三区中文字幕 | 亚洲精品视频三区 | 操久久 | 亚洲高清在线 | 亚洲精品一区国语对白 | 天天操夜夜操 | 亚洲欧美网站 | 九九热免费视频在线观看 | 波多野吉衣在线播放 | 妞干网视频| 欧美在线色视频 | 国产98色在线 | 日韩 | 亚洲国产精品久久久久婷婷老年 | 欧美精品一区二区在线观看 | av国产精品毛片一区二区小说 | 免费观看日韩精品 | 欧美日韩国产高清视频 | 国产一二三区精品视频 | 狠狠躁躁夜夜躁波多野结依 | 一区二区日本 | 成人精品视频在线观看 | 日韩精品视频一区二区三区 | 日韩精品免费在线观看 | 日本电影免费完整观看 | 欧洲妇女成人淫片aaa视频 | 91深夜福利视频 | 国产色网站 | 欧美h视频 | 午夜在线 |