欢迎光临~啄木鸟电子科技

软件设计

软件:串口指令测试 校验

1:校验和;
2:串口发码;

#include "STK6037.h"

//运行晶振:11.05926MHZ
#define TIMER0_H   		(65536-1800)/256//定时2Ms
#define TIMER0_L   		(65536-1800)%256

#define SYS_Fosc        11059200  //晶振频率			   
#define COMM_BAUD_RATE  9600      //串口波特率
#define OSC_FREQ        11059200  //11059200  

static INT8U Send_buf[10] 	= {0} ;
static INT8U Recv_buf[10] 	= {0} ;
static INT8U SendDataLen 	= 0 ;
static INT8U ResendDataLen 	= 0 ;

/******************************串口1的波特率********************************/
//T1作波特率发生器  //在波特率加倍情况下 
#define BAUD_57600    			256 - (OSC_FREQ/192L)/57600L    // 254 FF
#define BAUD_28800    			256 - (OSC_FREQ/192L)/28800L    // 254 FE
#define BAUD_19200    			256 - (OSC_FREQ/192L)/19200L    // 253 FD
#define BAUD_14400    			256 - (OSC_FREQ/192L)/14400L    // 252 FC
#define BAUD_9600     			256 - (OSC_FREQ/192L)/9600L     // 250 FA

void Delay_Us(INT32U z)
{
	while(z--);
}

void Delay_Ms(INT32U z)
{
	INT32U x=0 , y=0;
	for(x=110 ; x>0 ;x--)
	for(y=z; y>0;y-- );
}
/*****************************************************************************************************
 - 功能描述: 串口1初始化  9600波特率
*****************************************************************************************************/
void Serial_init(void)
{
	TMOD = 0x20;                // 设置 T1 为波特率发生器
	SCON = 0x50;                // 0101,0000 8位数据位, 无奇偶校验				   		
	PCON = 0x00;                //PCON=0;

	TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);	//设置为9600波特率
	TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);

    TR1     = 1; 			   //定时器1打开
    REN     = 1;			   //串口1接收使能
    ES      = 1;			   //串口1中断使能
}
/*****************************************************************************************************
 - 功能描述: 串口发送一帧数据
*****************************************************************************************************/
void SendCmd(INT8U len)
{
    INT8U i = 0 ;

    Uart_PutByte(0x7E); 				//起始 串口发送 起始位;
    
    for(i=0; i<len; i++)				//数据
    {
		Uart_PutByte(Send_buf[i]) ;  	//  串口发送一个字节 
    }
     
    Uart_PutByte(0xEF) ;				//结束 串口发送 结束位;
}

Uart_SendCMD(0x03 , 0 , 0x01) ;	
/********************************************************************************************
 - 功能描述:求和校验
思路如下:发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码
接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验
字节。刚好为0.这样就代表接收到的数据完全正确。
********************************************************************************************/
void DoSum( INT8U *Str, INT8U len)
{
    INT16U xorsum = 0;
    INT8U i;

    for(i=0; i<len; i++)
    {
        xorsum  = xorsum + Str[i];
    }
	xorsum     = 0 - xorsum;
	
	*(Str+i)   = (INT8U)(xorsum >>8);
	*(Str+i+1) = (INT8U)(xorsum & 0x00ff);
}
/********************************************************************************************
 - 功能描述: 串口发送一个字节
 - 隶属模块: 外部  - 参数说明: - 返回说明: - 注:	      
********************************************************************************************/
void Uart_PutByte(INT8U ch)
{
    SBUF  = ch;
    while(!TI){;}
    TI = 0;
}
/********************************************************************************************
 - 功能描述: 串口向外发送命令[包括控制和查询]
 - 隶属模块: 外部
 - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
              feedback:是否需要应答[0:不需要应答,1:需要应答]
              data:传送的参数 
********************************************************************************************/
void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat)
{
    Send_buf[0] = 0xff;    				//保留字节 
    Send_buf[1] = 0x06;    				//长度
    Send_buf[2] = CMD;     				//控制指令
    Send_buf[3] = feedback;				//是否需要反馈
    Send_buf[4] = (INT8U)(dat >> 8);	//datah
    Send_buf[5] = (INT8U)(dat);     	//datal
    DoSum(&Send_buf[0],6);          	//校验	
    SendCmd(8);       					//发送此帧数据
}

void main()
{ 
	Delay_Us(1) ;
	Delay_Ms(1) ;

	Serial_init() ;
    Delay_Ms(1000) ;//延时大概6S
    
    Uart_SendCMD(0x03 , 0 , 0x01) ;			//播放第一首    
    Delay_Ms(1000) ;//延时大概6S
    
    Uart_SendCMD(0x03 , 0 , 0x02) ;			//播放第二首
    Delay_Ms(1000) ;//延时大概6S

    Uart_SendCMD(0x03 , 0 , 0x04) ;			//播放第四首

    while(1) ;
}


联系我们

联系人:客服在线

手机:全工:13903011251

电话:李R:13530006400

邮箱:729986191@qq.com

地址: GUANGDONG PROVINCE

用手机扫描二维码关闭
二维码