标题:
STC单片机带x5045看门狗与串口效验框架源码
[打印本页]
作者:
yangyuan123
时间:
2018-9-23 10:39
标题:
STC单片机带x5045看门狗与串口效验框架源码
STC12C5A60S2串口通信带CRC效验,合适新手,希望有高手指点
单片机源程序如下:
/*
串口协议
功能:通过判断串口发送数据,按数组0到最后一位进行判断
,用特定一个数组判断选择,用break跳出循环,执行数据 */
#include "gobal.h"
#include "Uart_Handle.h"
#include "Uart.h"
#include "x5045.h"
void Uart_Handle(void) //通讯协议判断
{
uchar cmd_temp;
//if(Recdata[REC_CMD1] ==0x00) //判断设备地址
if((Recdata[REC_CMD1]==0x00)&&(Recdata[REC_CMD2]==0x0B)&&(Recdata[REC_CMD3]==0x01)&&(Recdata[REC_CMD4]==0x00)&&(Recdata[REC_CMD5]==0x01)
&&(Recdata[REC_CMD6]==0x0A)&&(Recdata[REC_CMD7]==0x00)&&(Recdata[REC_CMD8]==0x01)&&(Recdata[REC_CMD9]==0x01)&&(Recdata[REC_CMD10]==0x7F))
{
cmd_temp = Recdata[REC_CMD9]; //解析命令字
switch(cmd_temp)
{
case sj2://0x01开灯
sj1();
break;
case xj2://0x00关灯
xj1();
break;
case gkm://关看门狗命令
gkm1();
break;
case kkm://开看门狗命令
kkm1();
break;
default://other
break;
}
}
}
void sj1(void)//开灯
{
uchar To_PC_Data[12];
To_PC_Data[0] = 0xCC; //接收包头CC
To_PC_Data[1] = 0x00; //应答包字节数10
To_PC_Data[2] = 0x0C;//地址
To_PC_Data[3] = 0x01; //命令字
To_PC_Data[4] = 0x00;
To_PC_Data[5] = 0x01;
To_PC_Data[6] = 0x0A;
To_PC_Data[7] = 0x00;
To_PC_Data[8] = 0x00;
To_PC_Data[9] = 0x00;
To_PC_Data[10] = 0x00;
To_PC_Data[11] = 0x7F;
UART0_Send_String(To_PC_Data,12);
JDQ=1;
dogflag=1;
}
void xj1(void)//关灯
{
uchar To_PC_Data[12];
To_PC_Data[0] = 0xCC; //接收包头CC
To_PC_Data[1] = 0x00; //应答包字节数10
To_PC_Data[2] = 0x0C;//地址
To_PC_Data[3] = 0x01; //命令字
To_PC_Data[4] = 0x00;
To_PC_Data[5] = 0x01;
To_PC_Data[6] = 0x0A;
To_PC_Data[7] = 0x00;
To_PC_Data[8] = 0x00;
To_PC_Data[9] = 0x00;
To_PC_Data[10] = 0x00;
To_PC_Data[11] = 0x7F;
UART0_Send_String(To_PC_Data,12);
JDQ=0;
dogflag=0;
}
void gkm1(void)//开灯
{
WriteSR(0x32);
}
void kkm1(void)//开灯
{
WriteSR(0x12);
}
复制代码
#include "x5045.h"
#include "gobal.h"
/*****************************************************
函数功能:从X5045的当前地址读出数据
出口参数:x
***************************************************/
// unsigned char ReadCurrent(void)
// {
// unsigned char i;
// unsigned char x=0x00; //储存从X5045中读出的数据
// SCK=1; //将SCK置于已知的高电平状态
// for(i = 0; i < 8; i++)
// {
// SCK=1; //拉高SCK
// SCK=0; //在SCK的下降沿输出数据
// x<<=1; //将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据
// x|=(unsigned char)SO; //将SO上的数据通过按位"或"运算存入 x
// }
// return(x); //将读取的数据返回
// }
/*****************************************************
函数功能:写数据到X5045的当前地址
入口参数:dat
***************************************************/
void WriteCurrent(unsigned char dat)
{
unsigned char i;
SCK=0; //将SCK置于已知的低电平状态
for(i = 0; i < 8; i++) // 循环移入8个位
{
SI=(bit)(dat&0x80); //通过按位"与"运算将最高位数据送到S
//因为传送时高位在前,低位在后
SCK=0;
SCK=1; //在SCK上升沿写入数据
dat<<=1; //将y中的各二进位向左移一位,因为首先写入的是字节的最高位
}
}
/*****************************************************
函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
入口参数:rs; //储存寄存器状态值
***************************************************/
void WriteSR(unsigned char rs)
{
CS=0; //拉低CS,选中X5045
WriteCurrent(WREN); //写使能锁存器允许
CS=1; //拉高CS
CS=0; //重新拉低CS,否则下面的写寄存器状态指令将被丢弃
WriteCurrent(WRSR); //写状态寄存器
WriteCurrent(rs); //写入新设定的寄存器状态值
CS=1; //拉高CS
}
/********** *******************************************
函数功能:写数据到X5045的指定地址
入口参数:addr
***************************************************/
// void WriteSet(unsigned char dat,unsigned char addr)
// {
// SCK=0; //将SCK置于已知状态
// CS=0; //拉低CS,选中X5045
// WriteCurrent(WREN); //写使能锁存器允许
// CS=1; //拉高CS
// CS=0; //重新拉低CS,否则下面的写入指令将被丢弃
// WriteCurrent(WRITE); //写入指令
// WriteCurrent(addr); //写入指定地址
// WriteCurrent(dat); //写入数据
// CS=1; //拉高CS
// SCK=0; //将SCK置于已知状态
// }
/*****************************************************
函数功能:从X5045的指定地址读出数据
入口参数:addr
出口参数:dat
***************************************************/
// unsigned char ReadSet(unsigned char addr)
// {
// unsigned char dat;
// SCK=0; //将SCK置于已知状态
// CS=0; //拉低CS,选中X5045
// WriteCurrent(READ); //开始读
// WriteCurrent(addr); //写入指定地址
// dat=ReadCurrent(); //读出数据
// CS=1; //拉高CS
// SCK=0; //将SCK置于已知状态
// return dat; //返回读出的数据
// }
/*****************************************************
函数功能:看门狗复位程序
***************************************************/
void WatchDog(void)
{
CS=1; //拉高CS
CS=0; //CS引脚的一个下降沿复位看门狗定时器
CS=1; //拉高CS
}
///*****************************************************
//函数功能:主程序
//***************************************************/
//void main(void)
//{
// WriteSR(0x12); //写状态寄存器(设定看门狗溢出时间为600ms,写不保护)
// delaynms(10); //X5045的写入周期约为10ms
// while(1)
// {
// WriteSet(0xaa,0x10); //将数据"0xaa"写入指定地址"0x10"
// delaynms(10); //X5045的写入周期约为10ms
// P1=ReadSet(0x10); //将数据读出送P1口显示
// WatchDog(); //复位看门狗
// }
//}ssss
复制代码
所有资料51hei提供下载:
STC带CRC效验框架.rar
(59.8 KB, 下载次数: 10)
2018-9-23 10:36 上传
点击文件名下载附件
新手可以看看
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1