搜索
bottom↓
回复: 4

请教stc单片机串口问题

[复制链接]

出5入10汤圆

发表于 2015-3-20 16:27:28 | 显示全部楼层 |阅读模式
我板子上有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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2015-3-20 16:48:02 | 显示全部楼层
本帖最后由 lcw_swust 于 2015-3-20 16:50 编辑

楼主使能了串口中断却把中断服务函数去掉了?
按键处理在哪?main 在哪?

出0入0汤圆

发表于 2015-3-20 16:52:46 来自手机 | 显示全部楼层
取消中断程序,禁止中断。

出5入10汤圆

 楼主| 发表于 2015-3-20 16:59:29 | 显示全部楼层
jxcrg_t35 发表于 2015-3-20 16:52
取消中断程序,禁止中断。

我没去掉中断的时候也不正常

出5入10汤圆

 楼主| 发表于 2015-3-20 17:07:32 | 显示全部楼层
谢谢楼上两位大哥,我搞好了,中断函数还得加上
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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