找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2356|回复: 0
收起左侧

STC12C5A60S2单片机烟雾检测感器读取实验代码

[复制链接]
ID:393699 发表于 2018-12-18 18:12 | 显示全部楼层 |阅读模式
  1. /**********************************************************/
  2. //晶振频率:11.0592MHz
  3. //文件名  :Main.c
  4. //功能说明:烟雾检测感器读取实验
  5. /**********************************************************/

  6. #include <STC12C5A60S2.h>


  7. #define                BUF_LENTH        128                //定义串口接收缓冲长度
  8. #define     uint unsigned int
  9. #define     uchar unsigned char
  10. unsigned char         uart1_wr;                //写指针
  11. unsigned char         uart1_rd;                //读指针
  12. unsigned char         xdata RX0_Buffer[BUF_LENTH];        //接收缓冲
  13. unsigned char flag;
  14. unsigned char i;
  15. unsigned char   xdata mbus_buffer[255];
  16. unsigned char   xdata mbus_Sendbuf[255];
  17. unsigned char   xdata Crc_buf[2];  //声明存储CRC校验值的高8位及低8位的缓存
  18. unsigned int  Crc_return_data;  //声明CRC校验值
  19. bit                B_TI; //发送完成标志
  20. sbit  P1_0 = P1^0;//定义P1.0端口
  21. //                                                                7       6      5       4         3      2    1    0   Reset Value
  22. //sfr ADC_CONTR = 0xBC;                ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000        //AD 转换控制寄存器
  23. #define ADC_OFF()        ADC_CONTR = 0
  24. #define ADC_ON                (1 << 7)
  25. #define ADC_90T                (3 << 5)
  26. #define ADC_180T        (2 << 5)
  27. #define ADC_360T        (1 << 5)
  28. #define ADC_540T        0
  29. #define ADC_FLAG        (1 << 4)        //软件清0
  30. #define ADC_START        (1 << 3)        //自动清0
  31. #define ADC_CH0                0
  32. #define ADC_CH1                1
  33. #define ADC_CH2                2
  34. #define ADC_CH3                3
  35. #define ADC_CH4                4
  36. #define ADC_CH5                5
  37. #define ADC_CH6                6
  38. #define ADC_CH7                7

  39. uint adc10_start(uchar channel);
  40. void        uart1_init(void);
  41. void Uart1_TxByte(unsigned char dat);
  42. void Uart1_String(unsigned char code *puts);
  43. void delay_ms(unsigned char ms);
  44. unsigned int cal_crc(unsigned char *snd, unsigned char num);
  45. /*************** 用户定义参数 *****************************/

  46. #define MAIN_Fosc                11059200UL       
  47. #define Baudrate0                9600UL               
  48.                                                                        
  49. /**********************************************************/


  50. /****************** 编译器自动生成,用户请勿修改 ************************************/

  51. #define BRT_Reload                        (256 - MAIN_Fosc / 16 / Baudrate0)                //Calculate the timer1 reload value ar 1T mode


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

  53. //**********************************************************************
  54. //函数名:main(void)
  55. //输入  :无
  56. //输出  :无
  57. //功能描述:烟雾检测传感器采用MQ-2,当有可燃气体或者烟雾的时候,ADC1的采样值大于
  58. //          85,即判定有烟雾,输出字符串“YanWu”.         
  59. //**********************************************************************
  60. void        main(void)
  61. {
  62.         uint        j;
  63.         uart1_init();//初始化串口
  64.         P1ASF = (1 << ADC_CH1);        //STC12C5A16S2系列模拟输入(AD)选择ADC1(P1.1)
  65.         ADC_CONTR = ADC_360T | ADC_ON;
  66.         while(1)
  67.         {
  68.           
  69.          if(flag==1)
  70.                         {                delay_ms(5);
  71.                                                                                                                                                 
  72.                                         if(RX0_Buffer[0x03] == 0x34)
  73.                                         {
  74.                                                     j = adc10_start(1);        //(P1.1)ADC1转换
  75.                                                            mbus_Sendbuf[3] = ((j>>8)&0xff);
  76.                                                            mbus_Sendbuf[4] = j&0xff;
  77.                                                            mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);                                                          
  78.                                                            mbus_Sendbuf[0] = RX0_Buffer[0];  
  79.                                                            mbus_Sendbuf[1] = 0x03;
  80.                                                              
  81.                                                        
  82.                                                            Crc_return_data=cal_crc(mbus_Sendbuf, 5);  //取得将要发送数据的CRC值
  83.                                                    Crc_buf[0]=((Crc_return_data >> 8)&0xff);  //取得CRC值的高8位
  84.                                                    Crc_buf[1]=(Crc_return_data & 0xff);   //取得CRC值的低8位
  85.                                                            mbus_Sendbuf[5]=Crc_buf[1];  //CRC值低8位赋值给将要发送的数据的倒数第二个字节
  86.                                                            mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位赋值给将要发送的数据的最后一个
  87.                                                          for(i = 0; i < 7; i++)
  88.                                                            {            
  89.                                                                         Uart1_TxByte(mbus_Sendbuf[i]);       
  90.                                                            }
  91.                                                                 flag=0;                          
  92.                                                         uart1_wr=0;                  
  93.                                         }       
  94.                           }
  95.         }
  96. }
  97. //**********************************************************************
  98. //函数名:adc10_start(uchar channel)
  99. //输入  :ADC转换的通道
  100. //输出  :ADC值
  101. //功能描述:ADC转换
  102. //**********************************************************************
  103. uint        adc10_start(uchar channel)        //channel = 0~7
  104. {
  105.         uint        adc;
  106.         uchar        i;

  107.         ADC_RES = 0;
  108.         ADC_RESL = 0;

  109.         ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
  110.         i = 250;
  111.         do{
  112.                 if(ADC_CONTR & ADC_FLAG)
  113.                 {
  114.                         ADC_CONTR &= ~ADC_FLAG;
  115.                         adc = (uint)ADC_RES;
  116.                         adc = (adc << 2) | (ADC_RESL & 3);
  117.                         return        adc;
  118.                 }
  119.         }while(--i);
  120.         return        1024;
  121. }
  122. /*****************************CRC校验计算函数********************************/
  123. unsigned int cal_crc(unsigned char *snd, unsigned char num)

  124. {

  125.    unsigned char i, j;

  126.    unsigned int c,crc=0xFFFF;

  127.    for(i = 0; i < num; i ++)

  128.    {

  129.        c = snd[i] & 0x00FF;

  130.        crc ^= c;

  131.        for(j = 0;j < 8; j ++)

  132.        {

  133.            if (crc & 0x0001)

  134.            {

  135.                crc>>=1;

  136.                crc^=0xA001;

  137.            }

  138.            else crc>>=1;

  139.        }

  140.    }   

  141.    return(crc);
  142. }
  143. //**********************************************************************
  144. //函数名:uart1_init(void)
  145. //输入  :无
  146. //输出  :无
  147. //功能描述:串口初始化函数,通信参数为9600 8 N 1
  148. //**********************************************************************
  149. void        uart1_init(void)
  150. {
  151.         PCON |= 0x80;                //UART0 Double Rate Enable
  152.         SCON = 0x50;                //UART0 set as 10bit , UART0 RX enable
  153.         AUXR |=  0x01;                //UART0 使用BRT
  154.         AUXR |=  0x04;                //BRT set as 1T mode
  155.         BRT = BRT_Reload;
  156.         AUXR |=  0x10;                //start BRT       

  157.         ES  = 1;
  158.         EA = 1;
  159. }
  160. //**********************************************************************
  161. //函数名:Uart1_TxByte(unsigned char dat)
  162. //输入  :需要发送的字节数据
  163. //输出  :无
  164. //功能描述:从串口发送单字节数据
  165. //**********************************************************************
  166. void Uart1_TxByte(unsigned char dat)
  167. {
  168.     B_TI = 0;
  169.         SBUF = dat;
  170.         while(!B_TI);
  171.         B_TI = 0;
  172. }
  173. //**********************************************************************
  174. //函数名:Uart1_String(unsigned char code *puts)
  175. //输入  :字符串首地址
  176. //输出  :无
  177. //功能描述:从串口发送字符串
  178. //**********************************************************************
  179. void Uart1_String(unsigned char code *puts)
  180. {
  181.     for(; *puts != 0; puts++)
  182.         {
  183.         Uart1_TxByte(*puts);

  184.         }
  185. }

  186. //**********************************************************************
  187. //函数名:UART1_RCV (void)
  188. //输入  :无
  189. //输出  :无
  190. //功能描述:串口中断接收函数
  191. //**********************************************************************
  192. void UART1_RCV (void) interrupt 4
  193. {
  194.         if(RI)
  195.         {
  196.                 RI = 0;
  197.                 RX0_Buffer[uart1_wr++] = SBUF;
  198.                 //if(++uart0_wr >= BUF_LENTH)        uart0_wr = 0;
  199.                 flag = 1;
  200.         }

  201.         if(TI)
  202.         {
  203.                 TI = 0;
  204.                 B_TI = 1;
  205.         }
  206. }

  207. void delay_ms(unsigned char ms)
  208. {
  209.     unsigned int i;
  210.         do{
  211.             i = MAIN_Fosc /1400;
  212.                 while(--i);
  213.         }while(--ms);
  214. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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