找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2411|回复: 0
打印 上一主题 下一主题
收起左侧

单片机红外对射传感器读取实验代码

[复制链接]
跳转到指定楼层
楼主
ID:449147 发表于 2018-12-18 18:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  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. //功能描述:检测红外对射传感器中间有无物体,用AD量表示,当返回值大于
  58. //500判定有物体         
  59. //**********************************************************************
  60. void        main(void)
  61. {
  62.         uint        j;
  63.         uart1_init();//初始化串口
  64.         P1ASF = (1 << ADC_CH0);        //STC12C5A16S2系列模拟输入(AD)选择ADC1(P1.0)
  65.         ADC_CONTR = ADC_360T | ADC_ON;
  66.         while(1)
  67.         {
  68.                            j = adc10_start(0);        //(P1.0)ADC1转换
  69.                         delay_ms(5);
  70.          if(flag==1)
  71.                         {                delay_ms(5);
  72.                                                                                                                                                 
  73.                                         if(RX0_Buffer[0x03] == 0x2C)
  74.                                         {
  75.                                                    
  76.                                                            mbus_Sendbuf[3] = 0x00;
  77.                                                            mbus_Sendbuf[4] = 0x00;
  78.                                                            if(j>500)
  79.                                                            mbus_Sendbuf[4] = 0x01;
  80.                                                            mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);                                                          
  81.                                                            mbus_Sendbuf[0] = RX0_Buffer[0];  
  82.                                                            mbus_Sendbuf[1] = 0x03;
  83.                                                              
  84.                                                        
  85.                                                            Crc_return_data=cal_crc(mbus_Sendbuf, 5);  //取得将要发送数据的CRC值
  86.                                                    Crc_buf[0]=((Crc_return_data >> 8)&0xff);  //取得CRC值的高8位
  87.                                                    Crc_buf[1]=(Crc_return_data & 0xff);   //取得CRC值的低8位
  88.                                                            mbus_Sendbuf[5]=Crc_buf[1];  //CRC值低8位赋值给将要发送的数据的倒数第二个字节
  89.                                                            mbus_Sendbuf[6]=Crc_buf[0];  //CRC值高8位赋值给将要发送的数据的最后一个
  90.                                                          for(i = 0; i < 7; i++)
  91.                                                            {            
  92.                                                                         Uart1_TxByte(mbus_Sendbuf[i]);       
  93.                                                            }
  94.                                                                 flag=0;                          
  95.                                                         uart1_wr=0;                  
  96.                                         }       
  97.                           }
  98.         }
  99. }
  100. //**********************************************************************
  101. //函数名:adc10_start(uchar channel)
  102. //输入  :ADC转换的通道
  103. //输出  :ADC值
  104. //功能描述:ADC转换
  105. //**********************************************************************
  106. uint        adc10_start(uchar channel)        //channel = 0~7
  107. {
  108.         uint        adc;
  109.         uchar        i;

  110.         ADC_RES = 0;
  111.         ADC_RESL = 0;

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

  127. {

  128.    unsigned char i, j;

  129.    unsigned int c,crc=0xFFFF;

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

  131.    {

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

  133.        crc ^= c;

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

  135.        {

  136.            if (crc & 0x0001)

  137.            {

  138.                crc>>=1;

  139.                crc^=0xA001;

  140.            }

  141.            else crc>>=1;

  142.        }

  143.    }   

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

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

  187.         }
  188. }

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

  204.         if(TI)
  205.         {
  206.                 TI = 0;
  207.                 B_TI = 1;
  208.         }
  209. }

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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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