找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC单片机带x5045看门狗与串口效验框架源码

[复制链接]
跳转到指定楼层
楼主
ID:401506 发表于 2018-9-23 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC12C5A60S2串口通信带CRC效验,合适新手,希望有高手指点

单片机源程序如下:
  1. /*
  2. 串口协议
  3. 功能:通过判断串口发送数据,按数组0到最后一位进行判断
  4. ,用特定一个数组判断选择,用break跳出循环,执行数据  */
  5. #include "gobal.h"
  6. #include "Uart_Handle.h"
  7. #include "Uart.h"
  8. #include "x5045.h"
  9. void Uart_Handle(void)    //通讯协议判断
  10. {
  11.   uchar cmd_temp;
  12.   //if(Recdata[REC_CMD1] ==0x00)   //判断设备地址
  13.                 if((Recdata[REC_CMD1]==0x00)&&(Recdata[REC_CMD2]==0x0B)&&(Recdata[REC_CMD3]==0x01)&&(Recdata[REC_CMD4]==0x00)&&(Recdata[REC_CMD5]==0x01)
  14.                         &&(Recdata[REC_CMD6]==0x0A)&&(Recdata[REC_CMD7]==0x00)&&(Recdata[REC_CMD8]==0x01)&&(Recdata[REC_CMD9]==0x01)&&(Recdata[REC_CMD10]==0x7F))
  15.   {
  16.    
  17.       cmd_temp = Recdata[REC_CMD9]; //解析命令字
  18.       switch(cmd_temp)
  19.                 {
  20.         case sj2://0x01开灯
  21.           sj1();
  22.           break;  
  23.         case xj2://0x00关灯
  24.           xj1();
  25.           break;  
  26.                           case gkm://关看门狗命令
  27.           gkm1();
  28.           break;  
  29.         case kkm://开看门狗命令
  30.           kkm1();
  31.           break;
  32.         default://other
  33.           break;
  34.       }
  35.   }
  36. }


  37. void sj1(void)//开灯
  38. {
  39.                                 uchar To_PC_Data[12];        
  40.                                 To_PC_Data[0] = 0xCC;         //接收包头CC
  41.                                 To_PC_Data[1] = 0x00;                         //应答包字节数10
  42.                                 To_PC_Data[2] = 0x0C;//地址
  43.                                 To_PC_Data[3] = 0x01;                         //命令字
  44.                                 To_PC_Data[4] = 0x00;
  45.                                 To_PC_Data[5] = 0x01;
  46.                                 To_PC_Data[6] = 0x0A;
  47.               To_PC_Data[7] = 0x00;
  48.               To_PC_Data[8] = 0x00;
  49.               To_PC_Data[9] = 0x00;
  50.               To_PC_Data[10] = 0x00;
  51.               To_PC_Data[11] = 0x7F;
  52.                                 UART0_Send_String(To_PC_Data,12);
  53.                JDQ=1;
  54.         dogflag=1;
  55. }

  56. void xj1(void)//关灯
  57. {
  58.                                 uchar To_PC_Data[12];        
  59.                                 To_PC_Data[0] = 0xCC;         //接收包头CC
  60.                                 To_PC_Data[1] = 0x00;                         //应答包字节数10
  61.                                 To_PC_Data[2] = 0x0C;//地址
  62.                                 To_PC_Data[3] = 0x01;                         //命令字
  63.                                 To_PC_Data[4] = 0x00;
  64.                                 To_PC_Data[5] = 0x01;
  65.                                 To_PC_Data[6] = 0x0A;
  66.               To_PC_Data[7] = 0x00;
  67.               To_PC_Data[8] = 0x00;
  68.               To_PC_Data[9] = 0x00;
  69.               To_PC_Data[10] = 0x00;
  70.               To_PC_Data[11] = 0x7F;
  71.                                 UART0_Send_String(To_PC_Data,12);
  72.         JDQ=0;
  73.         dogflag=0;
  74. }
  75. void gkm1(void)//开灯
  76. {
  77.         WriteSR(0x32);
  78. }
  79. void kkm1(void)//开灯
  80. {
  81.         WriteSR(0x12);
  82. }
复制代码
  1. #include "x5045.h"
  2. #include "gobal.h"

  3. /*****************************************************
  4. 函数功能:从X5045的当前地址读出数据
  5. 出口参数:x
  6. ***************************************************/
  7. // unsigned char ReadCurrent(void)
  8. // {
  9. //           unsigned char i;
  10. //         unsigned char x=0x00;      //储存从X5045中读出的数据
  11. //         SCK=1;                     //将SCK置于已知的高电平状态
  12. //    for(i = 0; i < 8; i++)
  13. //         {
  14. //            SCK=1;                 //拉高SCK
  15. //            SCK=0;                 //在SCK的下降沿输出数据        
  16. //            x<<=1;  //将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据           
  17. //                 x|=(unsigned char)SO;  //将SO上的数据通过按位"或"运算存入 x      
  18. //         }
  19. //         return(x);   //将读取的数据返回
  20. //  }
  21. /*****************************************************
  22. 函数功能:写数据到X5045的当前地址
  23. 入口参数:dat
  24. ***************************************************/
  25. void WriteCurrent(unsigned char dat)
  26. {
  27.    unsigned char i;
  28.         SCK=0;                 //将SCK置于已知的低电平状态
  29.   for(i = 0; i < 8; i++)  // 循环移入8个位
  30.         {
  31.          SI=(bit)(dat&0x80);   //通过按位"与"运算将最高位数据送到S
  32.                                     //因为传送时高位在前,低位在后
  33.          SCK=0;
  34.          SCK=1;               //在SCK上升沿写入数据
  35.     dat<<=1;   //将y中的各二进位向左移一位,因为首先写入的是字节的最高位
  36.   }
  37. }

  38. /*****************************************************
  39. 函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
  40. 入口参数:rs;  //储存寄存器状态值
  41. ***************************************************/
  42. void WriteSR(unsigned char rs)
  43. {
  44.          CS=0;                 //拉低CS,选中X5045
  45.          WriteCurrent(WREN);   //写使能锁存器允许
  46.          CS=1;                 //拉高CS
  47.          CS=0;                 //重新拉低CS,否则下面的写寄存器状态指令将被丢弃
  48.          WriteCurrent(WRSR);   //写状态寄存器
  49.          WriteCurrent(rs);     //写入新设定的寄存器状态值
  50.          CS=1;                 //拉高CS
  51. }

  52. /********** *******************************************
  53. 函数功能:写数据到X5045的指定地址
  54. 入口参数:addr
  55. ***************************************************/
  56. // void WriteSet(unsigned char dat,unsigned char addr)
  57. // {
  58. //           SCK=0;                 //将SCK置于已知状态
  59. //     CS=0;                  //拉低CS,选中X5045
  60. //         WriteCurrent(WREN);    //写使能锁存器允许
  61. //         CS=1;                  //拉高CS
  62. //     CS=0;                  //重新拉低CS,否则下面的写入指令将被丢弃
  63. //         WriteCurrent(WRITE);   //写入指令
  64. //         WriteCurrent(addr);    //写入指定地址
  65. //         WriteCurrent(dat);     //写入数据
  66. //         CS=1;                  //拉高CS
  67. //    SCK=0;                 //将SCK置于已知状态
  68. // }

  69. /*****************************************************
  70. 函数功能:从X5045的指定地址读出数据
  71. 入口参数:addr
  72. 出口参数:dat
  73. ***************************************************/
  74. // unsigned char ReadSet(unsigned char addr)
  75. // {
  76. //  unsigned char dat;
  77. //  SCK=0;                 //将SCK置于已知状态
  78. //  CS=0;                 //拉低CS,选中X5045
  79. //  WriteCurrent(READ);   //开始读
  80. //  WriteCurrent(addr);   //写入指定地址
  81. //  dat=ReadCurrent();    //读出数据
  82. //  CS=1;                 //拉高CS
  83. //  SCK=0;                //将SCK置于已知状态
  84. //  return dat;           //返回读出的数据
  85. //  }

  86. /*****************************************************
  87. 函数功能:看门狗复位程序
  88. ***************************************************/
  89. void WatchDog(void)
  90. {
  91. CS=1;    //拉高CS
  92. CS=0;    //CS引脚的一个下降沿复位看门狗定时器
  93. CS=1;    //拉高CS
  94. }
  95. ///*****************************************************
  96. //函数功能:主程序
  97. //***************************************************/
  98. //void main(void)
  99. //{
  100. //  WriteSR(0x12);        //写状态寄存器(设定看门狗溢出时间为600ms,写不保护)  
  101. //  delaynms(10);         //X5045的写入周期约为10ms
  102. //  while(1)
  103. //  {
  104. //         WriteSet(0xaa,0x10);  //将数据"0xaa"写入指定地址"0x10"
  105. //         delaynms(10);         //X5045的写入周期约为10ms
  106. //   P1=ReadSet(0x10);      //将数据读出送P1口显示
  107. //    WatchDog();           //复位看门狗
  108. //  }
  109. //}ssss

复制代码


所有资料51hei提供下载:
STC带CRC效验框架.rar (59.8 KB, 下载次数: 10)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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