找回密码
 立即注册

QQ登录

只需一步,快速开始

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

太难了,单片机串口通信干扰定时器

[复制链接]
跳转到指定楼层
楼主
ID:472246 发表于 2019-10-20 07:13 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
小弟悬赏有限,请谅解,权当解难题
使用芯片stc15w408as
定时器0计数,定时器2为波特率9600
遇到问题,当串口接收数据时候,定时器0不工作,使用按键可以继续控制定时器。把波特率里面ES去掉,定时器正常工作,此时通信不能使用(或者去掉f++)
/*-----------------------------------------------------------------------------
* 实 验 名                 : RS232串口试验
* 实验说明     : 单片机串口接收数据控制灯亮灭
* 连接方式     :
* 注    意                 : 该试验使用的晶振是11.0592
*******************************************************************************/

#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int


bit flag;        //定义一个标志位
bit flag1;     //要完成无意义的改动还真是麻烦,思想有点乱,因为进一次中断只能接受一字符
         
code uchar PuZh0 [4] = "1000";
code uchar PuZh1 [4] = "1001";
code uchar PuZh2 [4] = "1002";
code uchar PuZh3 [4] = "1003";
code uchar PuZh4 [4] = "1004";
code uchar PuZh5 [4] = "1005";
code uchar PuZh6 [4] = "1006";
code uchar PuZh7 [4] = "1007";
code uchar PuZh8 [4] = "1008";
code uchar PuZh9 [4] = "1009";
code uchar PuZh10[4] = "1010";
code uchar PuZh11[4] = "1011";
code uchar PuZh12[4] = "1012";
code uchar PuZh13[4] = "1013";
code uchar PuZh14[4] = "1014";
code uchar PuZh15[4] = "1015";
code uchar PuZh16[4] = "1016";
code uchar PuZh17[4] = "1017";
code uchar PuZh18[4] = "1018";
code uchar PuZh19[4] = "1019";
code uchar PuZh20[4] = "1020";
uchar fs[4];  //从串口接收的数据
uchar f=0;    //指示串口接收个数
int ss=0,xx=0;

uchar aa=0,bb=0,cc=0;
//--定义使用的IO--//
sbit LED0=P1^3;
sbit LED1=P1^4;
sbit LED2=P1^5;


sbit k2=P1^6;
sbit k3=P1^7;
sbit k7=P3^7;
//--声明全局函数--//   
void UsartConfiguration();
void ykcsh();
void Delay_1ms(uint i);

void time0() interrupt 1   //定义定时器0
{
        char k;
        //IRtime++;                            //检测脉宽,1次为278us
                ss++;
                 if(ss==3600)          //大约1秒
                           {
                                   xx++;
                               ss=0;
                                }
                                        if(xx==1&&bb==1)
                                        {
                                                        LED0=~LED0;
                                                        for(k=0; k<4; k++)
                                                                                {
                                                                                        SBUF = PuZh0[k];   //将要发送的数据放入到发送寄存器
                                                                                        while(!TI);                    //等待发送数据完成
                                                                                        TI=0;                                //清除发送完成标志位
                                                                                        Delay_1ms(1);
                                                                                }
                                                        
                                                         xx=0;        
                                        }          //xx=5大约5秒
                                        if(xx==3&&bb==2)
                                        {
                                                        LED0=~LED0;
                                                        for(k=0; k<4; k++)
                                                                                {
                                                                                        SBUF = PuZh1[k];   //将要发送的数据放入到发送寄存器
                                                                                        while(!TI);                    //等待发送数据完成
                                                                                        TI=0;                                //清除发送完成标志位
                                                                                        Delay_1ms(1);
                                                                                }
                                                        
                                                         xx=0;        
                                        }          //xx=5大约5秒
                                        if(xx==6&&bb==3)
                                        {
                                                        LED0=~LED0;
                                                        for(k=0; k<4; k++)
                                                                                {
                                                                                        SBUF = PuZh2[k];   //将要发送的数据放入到发送寄存器
                                                                                        while(!TI);                    //等待发送数据完成
                                                                                        TI=0;                                //清除发送完成标志位
                                                                                        Delay_1ms(1);
                                                                                }

                                                         xx=0;        
                                        }          //xx=5大约5秒
                           



}

/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
//  static uchar i = 7;  //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变

        
  EA = 0;

        
  if(RI == 1) //当硬件接收到一个数据时,RI会置位
        {                 
                RI = 0;
            fs[f] = SBUF;  //这里减去48是因为从电脑中发送过来的数据是ASCII码。
        f++;
         
        }

         EA = 1;

}

        
               
                        



/*******************************************************************************
* 函 数 名       : main
* 函数功能                   : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void main()
{

        uchar k,old=0;
        UsartConfiguration();//初始化串口
        ykcsh();
        while(1)
          {

                 if(old!=f){old=f;}
                Delay_1ms(30);//一段时间之后仍然相等,表示上位机发来的一串数据结束

        if(old==f){if(f) break;}


              if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='0' )
                          {         
                                          LED0=~LED0;        
                                         for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh0[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }

                                    break;
                                                
                                }

              if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='1' )
                          {                  
                                          LED1=~LED1;        
                                         for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh1[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }

                                    break;
                                                
                                }            
               if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='2' )
                          {
                                          LED2=~LED2;
                                        if(LED2==0)
                                        {        LED0=~LED0;}        
                                         for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh2[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }
                                        Delay_1ms(250);

                                    break;
                                }
                                
              if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='3' )
                          {         
                                          LED0=1;        
                                         for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh3[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }

                                    break;
                                                
                                }

              if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='4' )
                          {                  
                                          LED0=0;        
                                         for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh4[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }

                                    break;
                                                
                                }            
               if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='5' )
                          {
                                          LED0=~LED0;
                                        if(LED2==0)
                                        {        LED0=~LED0;}        
                                         for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh5[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }
                                        Delay_1ms(250);

                                    break;
                                }               
                                                                  
                                
                                
                                
                                
                                
                                                
                                                                  


                 if(k2==0)
                         {               
                                 Delay_1ms(100);
                                if(k2==0)
                                 {        //EA = 0;
                                        LED0=~LED0;
                                        for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh0[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }
                                        //EA = 1;         
                                }
                        while(!k2);           
                         }

        if(k3==0)
                         {
                         Delay_1ms(100);
                                if(k3==0)
                                 {
                  ++bb;
                                  if(bb==1)
                                        {  
                                        for(k=0; k<2; k++)
                                                         {
                                                         LED0=~LED0;
                                                         Delay_1ms(50);
                                                         }
                                        LED0=1;
                                        xx=0;
                                        }
                                  if(bb==2)
                                        {  
                                        for(k=0; k<6; k++)
                                                         {
                                                         LED0=~LED0;
                                                         Delay_1ms(200);
                                                         Delay_1ms(200);
                                                         }
                                         LED0=1;
                                         xx=0;
                                         }
                                  if(bb==3)
                                        {
                                        for(k=0; k<12; k++)
                                                         {
                                                         LED0=~LED0;
                                                         Delay_1ms(200);
                                                         Delay_1ms(200);
                                                         }
                                         LED0=1;
                                         xx=0;
                                        }

                                 
                                 
                                  if(bb==4)
                                  {
                                        for(k=0; k<6; k++)
                                                 {
                                                 LED0=~LED0;
                                                 Delay_1ms(50);
                                                  }
                                                 LED0=1;
                                                 bb=0,xx=0;
                                  }
                                 
                                  //EA        = 1;//总中断允许
                                 }
                                while(!k3);
                                
                         }

        if(k7==0)
                         {               
                                 
                                 //        EA = 0;
                                        LED2=~LED2;
                                        if(LED2==0)
                                        {        LED0=~LED0;}
                                        for(k=0; k<4; k++)
                                        {
                                                SBUF = PuZh2[k];   //将要发送的数据放入到发送寄存器
                                                while(!TI);                    //等待发送数据完成
                                                TI=0;                                //清除发送完成标志位
                                                Delay_1ms(1);
                                        }
                                //        EA = 1;        
                                
                                }
     
                }  
}
        
/*******************************************************************************
* 函 数 名       : UsartConfiguration()
* 函数功能                   : 设置串口
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void UsartConfiguration()
{        

    SCON = 0x50;                //8位数据,可变波特率
    AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
    AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
    T2L = 0xE0;                //设定定时初值
    T2H = 0xFE;                //设定定时初值
    AUXR |= 0x10;                //启动定时器2
        ES = 1;         //开串口中断
          EA = 1;         //开总中断
}
void ykcsh()                          //红外遥控初始化
{


        TMOD |= 0x02; //定时器0工作方式2,8位自动重装
        TH0 = 0x00;  //高8位装入0那么定时器溢出一次的时间是256个机器周期
        TL0 = 0x00;
        ET0 = 1;           //定时器0中断
        TR0 = 1;     //启动定时器0

        IT0 = 1;           //设置外部中断0为跳沿触发方式,来一个下降沿触发一次
        EX0 = 1;           //启动外部中断0
                EA        = 1;//总中断允许
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms
* x * 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
  uchar x,j;
  
  for(j=0;j<i;j++)
    for(x=0;x<=148;x++);
}

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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