|
我板子上有10个按键,我是在检测到按键10按下去的时候
发送Uart_SendCMD(0x03 , 0 , 0x01) ;//播放第一首歌
然后我再按其他的按键,其他的按键都不响应了,先按其他的按键那些按键是响应的,只要按下10按键后,所有的按键就再也不响应了 请问这大概是什么原因 串口的波特率是用定时器二产生的
下面是串口的程序
/******************************************************************************************************************
- 实现功能:
- 目前进展:
- 日期 :2015-03-20
- 作者 :
- 运行环境:STC 晶振:11.0592M 波特率:9600
1、实现芯片上电分别指定播放第一曲和第二曲,基本的程序供用户测试
2、该测试程序必须是模块或者芯片方案中,有设备在线,譬如U盘、TF卡、FLASH等等
3、
******************************************************************************************************************/
#include "uart.h"
//运行晶振:11.05926MHZ
//#define COMM_BAUD_RATE 9600 //串口波特率
#define BAUD 9600 //串口波特率
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
static u8 Send_buf[10] = {0} ;
static u8 Recv_buf[10] = {0} ;
static u8 SendDataLen = 0 ;
static u8 ResendDataLen = 0 ;
/*****************************************************************************************************
- 功能描述: 串口1初始化
- 隶属模块: 外部
- 参数说明: 无
- 返回说明: 无
- 注: 都是9600波特率
*****************************************************************************************************/
void Serial_init(void)
{
SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验
PCON = 0x00; //PCON=0;
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;
;
T2L = (65536 - (MAIN_Fosc/4/BAUD)); //设置波特率重装值
T2H = (65536 - (MAIN_Fosc/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口一中断
EA = 1;
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
/*void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
//P22 = RB8; //P2.2显示校验位
}
if (TI)
{
TI = 0; //清除TI位
//busy = 0; //清忙标志
}
}*/
/********************************************************************************************
- 功能描述: 串口发送一个字节
- 隶属模块: 外部
- 参数说明:
- 返回说明:
- 注:
********************************************************************************************/
void Uart_PutByte(u8 ch)
{
SBUF = ch;
while(!TI){;}
TI = 0;
}
/*****************************************************************************************************
- 功能描述: 串口发送一帧数据
- 隶属模块: 内部
- 参数说明:
- 返回说明:
- 注:无
*****************************************************************************************************/
void SendCmd(u8 len)
{
u8 i = 0 ;
Uart_PutByte(0x7E); //起始
for(i=0; i<len; i++)//数据
{
Uart_PutByte(Send_buf[i]) ;
}
Uart_PutByte(0xEF) ;//结束
}
/********************************************************************************************
- 功能描述:求和校验
- 隶属模块:
- 参数说明:
- 返回说明:
- 注: 和校验的思路如下
发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码
接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验
字节。刚好为0.这样就代表接收到的数据完全正确。
********************************************************************************************/
void DoSum( u8 *Str, u8 len)
{
u16 xorsum = 0;
u8 i;
for(i=0; i<len; i++)
{
xorsum = xorsum + Str[i];
}
xorsum = 0 -xorsum;
*(Str+i) = (u8)(xorsum >>8);
*(Str+i+1) = (u8)(xorsum & 0x00ff);
}
/********************************************************************************************
- 功能描述: 串口向外发送命令[包括控制和查询]
- 隶属模块: 外部
- 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
feedback:是否需要应答[0:不需要应答,1:需要应答]
data:传送的参数
- 返回说明:
- 注:
********************************************************************************************/
void Uart_SendCMD(u8 CMD ,u8 feedback , u16 dat)
{
Send_buf[0] = 0xff; //保留字节
Send_buf[1] = 0x06; //长度
Send_buf[2] = CMD; //控制指令
Send_buf[3] = feedback;//是否需要反馈
Send_buf[4] = (u8)(dat >> 8);//datah
Send_buf[5] = (u8)(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) ;
}*/ |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|