找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1848|回复: 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 单片机教程网

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