微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求高手帮忙修改一个程序,将温度显示改成频率显示

求高手帮忙修改一个程序,将温度显示改成频率显示

时间:10-02 整理:3721RD 点击:
原先的程序实现了无线传输,显示的是温度,但是现在要求显示无线传输的频率就可以了,这是同学那边拿来参考的,应该只要修改一下数码管显示部分就可以,希望高手可以帮个忙,本人小白看了快半个月了还么搞好,马上要中期检查,很急,希望高手们帮帮忙!不甚感激
程序如下:

  1. #include <reg52.h>
  2. #include <ABSACC.h>
  3. #include <intrins.h>
  4. #include <stdio.h>
  5. //----------------------------------------------------------------------------------------------------------------
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. //----------------------------------------------------------------------------------------------------------------
  9. #define BYTE_BIT0        0x01
  10. #define BYTE_BIT1        0x02
  11. #define BYTE_BIT2        0x04
  12. #define BYTE_BIT3        0x08
  13. #define BYTE_BIT4        0x10
  14. #define BYTE_BIT5        0x20
  15. #define BYTE_BIT6        0x40
  16. #define BYTE_BIT7        0x80
  17. //----------------------------------------------------------------------------------------------------------------
  18. bdata unsigned  char DATA_BUF;
  19. #define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
  20. #define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
  21. sbit        flag        =DATA_BUF^7;
  22. sbit        flag1        =DATA_BUF^0;
  23. //---------------------------------------------------nrf905控制指令列表-------------------------------------------
  24. #define WC                0x00
  25. #define RC                0x10
  26. #define WTP                0x20
  27. #define RTP                0x21
  28. #define WTA                0x22
  29. #define RTA                0x23
  30. #define RRP                0x24
  31. //---------------------------------------------------配置口定义---------------------------------------------------
  32. sbit        TXEN=P1^0;
  33. sbit        TRX_CE=P3^4;
  34. sbit        PWR=P1^1;
  35. sbit        MISO=P1^6;
  36. sbit        MOSI=P1^5;
  37. sbit        SCK=P1^7;
  38. sbit        CSN=P1^3;
  39. //---------------------------------------------------NRF905状态IO----------------------------------------------------
  40. sbit        AM=P1^4;
  41. sbit        DR=P3^2;
  42. sbit        CD=P1^2;
  43. //----------------------------------------------------按键-----------------------------------------------------------
  44. sbit        KEY0=P3^6;
  45. sbit        KEY1=P3^7;
  46. //----------------------------------------------------数码管位控制---------------------------------------------------
  47. sbit        led1=P2^2;
  48. sbit        led0=P2^3;
  49. sbit        led2=P2^1;
  50. sbit        led3=P2^0;

  51. sbit        led4=P2^4;           //指示灯LED2,低电平时亮,高电平时暗   
  52. sbit        led5=P2^7;                         //指示灯LED1,低电平时亮,高电平时暗     
  53.    
  54. sbit    BELL=P2^6;
  55. //----------------------------------------------------温度传感器(或者温湿度)--------------------------------------------------
  56. sbit    DQ=P3^5;
  57. //------------------------------------------------NRF905寄存器配置------------------------------------------------
  58. unsigned char idata RFConf[11]=
  59. {
  60.   0x00,                             //配置命令:SPI指令WC
  61.   0x4c,                             //CH_NO,配置频段在430MHZ
  62.   0x0c,                             //输出功率为10db,不重发,节电为正常模式
  63.   0x44,                             //地址宽度设置,为4字节
  64.   0x04,0x04,                        //接收发送有效数据长度为4字节
  65.   0xCC,0xCC,0xCC,0xCC,              //接收地址
  66.   0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
  67. };
  68. //-----------------------------------------------------------------------------------------------------------------
  69. uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
  70. //---------------------------------------------------发送数据缓冲区-------------------------------------------------
  71. #define TxRxBuf_Len 4
  72. uchar TxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,};
  73. code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};

  74. char tf;
  75. //------------------------------------------------延时------------------------------------------------------------
  76. static void Delay(uchar n)
  77. {
  78.         uint i;
  79.         while(n--)
  80.         for(i=0;i<80;i++);
  81. }
  82. //---------------------------------------------------SPI读函数-----------------------------------------------------
  83. unsigned char SpiRead(void)
  84. {
  85.         unsigned char j;
  86.         for (j=0;j<8;j++)
  87.         {
  88.         DATA_BUF=DATA_BUF<<1;
  89.                 SCK=1;
  90.                 if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
  91.                 {
  92.                         DATA_BUF|=BYTE_BIT0;
  93.                 }
  94.                 else
  95.                 {
  96.                         DATA_BUF&=~BYTE_BIT0;
  97.                 }
  98.                 SCK=0;
  99.          }
  100.          return DATA_BUF;
  101. }
  102. //-------------------------------------------------SPI写函数----------------------------------------------------------
  103. void SpiWrite(unsigned char send)
  104. {
  105.         unsigned char i;
  106.         DATA_BUF=send;
  107.         for (i=0;i<8;i++)
  108.         {
  109.                 if (DATA7)        //总是发送最高位
  110.                 {
  111.                         MOSI=1;
  112.                 }
  113.                 else
  114.                 {
  115.                         MOSI=0;
  116.                 }
  117.                 SCK=1;
  118.                 DATA_BUF=DATA_BUF<<1;
  119.                 SCK=0;
  120.         }
  121. }
  122. //------------------------------------------------------初始化nRF905---------------------------------------------
  123. void nRF905Init(void)
  124. {
  125.     CSN=1;                                                // Spi         disable
  126.         SCK=0;                                                // Spi clock line init low
  127.         DR=1;                                                // Init DR for input
  128.         AM=0;                                                // Init AM for input
  129.         CD=0;                                                // Init CD for input
  130.         PWR=1;                                        // nRF905 power on
  131.         TRX_CE=0;                                        // Set nRF905 in standby mode
  132.         TXEN=0;                                        // set radio in Rx mode
  133. }
  134. //-----------------------------------------------------初始化寄存器-----------------------------------------------
  135. void Config905(void)
  136. {
  137.         uchar i;
  138.         CSN=0;                                                // Spi enable for write a spi command
  139.         //SpiWrite(WC);                                // 因为RFConf[0]为0x00正好就是WC,所以不得把该语句注销
  140.         for (i=0;i<11;i++)        // Write configration words  写放配置字
  141.         {
  142.            SpiWrite(RFConf[i]);
  143.         }
  144.         CSN=1;                                        // Disable Spi
  145. }
  146. //-----------------------------------------------------发送数据打包---------------------------------------------------
  147. void TxPacket(uchar *TxRxBuf)
  148. {
  149.         uchar i;
  150.         CSN=0;
  151.         SpiWrite(WTP);                                // Write payload command
  152.         for (i=0;i<4;i++)
  153.         {
  154.                 SpiWrite(TxRxBuf[i]);                // Write 32 bytes Tx data
  155.         }// Spi enable for write a spi command
  156.         CSN=1;
  157.         Delay(1);                                                // Spi disable
  158.         CSN=0;                                                // Spi enable for write a spi command
  159.         SpiWrite(WTA);                                // 该部分地址必须和接收方初始配置的地址完全吻合配对才能建立通信
  160.         for (i=0;i<4;i++)                        // Write 4 bytes address
  161.         {
  162.                 SpiWrite(TxAddress[i]);
  163.         }
  164.         CSN=1;                                                // Spi disable
  165.         TRX_CE=1;                                        // Set TRX_CE high,start Tx data transmission
  166.         Delay(1);                                        // while (DR!=1);
  167.         TRX_CE=0;                                        // Set TRX_CE low
  168. }
  169. //----------------------------------------------------------设置发送状态---------------------------------------------
  170. void SetTxMode(void)
  171. {
  172.         TRX_CE=0;
  173.         TXEN=1;
  174.         Delay(1);                                         // delay for mode change(>=650us)
  175. }
  176. //-----------------------------------------------设置发送状态---------------------------------------------------
  177. void SetRxMode(void)
  178. {
  179.         TXEN=0;
  180.         TRX_CE=1;
  181.         Delay(100);                                         // delay for mode change(>=650us)
  182. }
  183. //-------------------------------------------------判断数据接收状态-----------------------------------------------------
  184. unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
  185. {
  186.         DR=1;      //通过对端口写1,可以使端口为输入状态,这51的 特性。不熟悉者可以参阅51相关书籍作证(将DR端口设置为输入状态。)
  187.         if (DR==1&&TRX_CE==1 && TXEN==0)
  188.         {
  189.                 return 1;
  190.         }
  191.         else
  192.         {
  193.                 return 0;
  194.         }
  195. }
  196. //----------------------------------------------------读NRF905接收数据------------------------------------------------------------
  197. void RxPacket(void)                                               
  198. {
  199.         uchar i;
  200.     TRX_CE=0;
  201.         CSN=0;                                                // Spi enable for write a spi command
  202.     Delay(1);
  203.         SpiWrite(RRP);
  204.         for (i = 0 ;i < 4 ;i++)
  205.         {
  206.                 TxRxBuf[i]=SpiRead();                // Read data and save to buffer      
  207.         }
  208.         CSN=1;
  209.     Delay(10);
  210.         TRX_CE=1;                                                       
  211. }
  212. //--------------------------------------------------------数据接收------------------------------------------------
  213. void  RX(void)
  214. {
  215.     SetRxMode();                        // Set nRF905 in Rx mode
  216. //while (CheckDR()==0);
  217.         Delay(10);
  218.         RxPacket();
  219.        
  220. if(TxRxBuf[0]==0x29)
  221.         {
  222.                 P0= seg[3];led5=0;Delay(50);led5=1;Delay(50);
  223.         }
  224. if(TxRxBuf[0]==0x30)
  225.         {
  226.                 P0= seg[4];led5=0;Delay(50);led5=1;Delay(50);
  227.         }
  228. }
  229. //-----------------------------------------------------------------------------------------------------------------
  230. void main(void)
  231. {
  232.         nRF905Init();
  233.              Config905();   
  234.                 BELL=0;
  235.                 P0= seg[0];led0=0;led1=0;led2=0;led3=0;
  236.                 Delay(50);
  237.         BELL=1;  
  238.         while(1)
  239.                 {
  240.                         RX();
  241.                    if(KEY0 ==0 )  //检测按键。当检测到按键时,给发送数据缓冲器赋值
  242.                          {       
  243.                                 TxRxBuf[0]=0x29;TxRxBuf[1]=0x30;TxRxBuf[2]=0x31;TxRxBuf[3]=0x32;  
  244.                                 tf = 1 ;P0= seg[1];
  245.                                  }
  246.                    if(KEY1 ==0 ) //不同按键,发送的命令也不同
  247.                          {       
  248.                                 TxRxBuf[0]=0x30;TxRxBuf[1]=0x31;TxRxBuf[2]=0x32;TxRxBuf[3]=0x29;  
  249.                                 tf = 1 ; P0= seg[2];
  250.                                  }
  251.                if (tf==1)
  252.                         {
  253.                 SetTxMode();               
  254.                             TxPacket(TxRxBuf);        // 发送数据
  255.                                 tf = 0;        TxRxBuf[0]=0;TxRxBuf[1]=0;TxRxBuf[2]=0;TxRxBuf[3]=0; //数据清零
  256.                                 led4=0;Delay(50);led4=1;Delay(50);
  257.                         }       
  258. }
  259. }

复制代码




已退回1积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top