打印

串口通信 数码管闪烁

[复制链接]
3001|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shiba1986|  楼主 | 2013-5-27 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shiba1986 于 2013-5-27 14:59 编辑

上位机每一次发一个01给单片机,单片机就给上位机发一次数据(当前显示值),但是每发一次数据时候 数码管就会闪烁一次
用的波特率是2400 数码管每1s刷新一次显示值
用的AT89C55WD单片机 12M晶振
void transmit(void)
{
                int n,k;
                if(RI)
                {
                        RI=0;
                        transmit_temp=SBUF;
                }
                if(transmit_temp==0x01)//判断是不是地址
                        {
                                transmit_receive_flag=1;//开启发送
                                transmit_temp=0x00;
                        }
                if(transmit_temp==0xff)
                        {
                                transmit_receive_flag=0;//关闭发送
                                transmit_temp=0x00;
                        }
                //if(transmit_flag==1)
                if(transmit_receive_flag==1)
                {               
                        //if(transmit_receive_flag==1)
                        //if(transmit_temp==0x01)
                        {       
                                //EA=0;
                                ES=0;//发送时取消中断
                                transmit_receive=1;//485处于接收状态把单片机数据发到ab线上
                                for(n=0;n<4;n++)
                                {
                                        SBUF=0xFF;
                                        while(!TI);//发送完T1会被置1
                                        TI=0;//选择不进中断一直发
                                }//0xFF 0xFF 0xFF 0xFF
                                for(k=0;k<3;k++)
                                        {
                                                if(k==1)
                                                {
                                                        SBUF=k;
                                                        while(!TI);//发送完T1会被置1
                                                        TI=0;//选择不进中断一直发
                                                        for(n=0;n<4;n++)
                                                        {
                                                                if(n<2)
                                                                {
                                                                        SBUF=0x00;
                                                                }
                                                                else
                                                                {
                                                                        SBUF=transmit_data[n-2];        //先传浓度
                                                                               
                                                                }
                                                                while(!TI);//发送完T1会被置1
                                                                TI=0;//选择不进中断一直发
                                                        }
                                                }//31 00 00 HUM1 HUM2
                                                else if(k==2)
                                                {
                                                        SBUF=k;
                                                        while(!TI);//发送完T1会被置1
                                                        TI=0;//选择不进中断一直发
                                                        for(n=0;n<4;n++)
                                                        {
                                                                if(n<2)
                                                                {
                                                                        SBUF=0x00;
                                                                }
                                                                else
                                                                {
                                                                        SBUF=transmit_data[n];        //后传电压
                                                                        //pdata+=1;                                       
                                                                }
                                                                while(!TI);//发送完T1会被置1
                                                                TI=0;//选择不进中断一直发
                                                        }               
                                                }
                                                else
                                                {
                                                        SBUF=k;
                                                        while(!TI);//发送完T1会被置1
                                                        TI=0;//选择不进中断一直发
                                                        for(n=0;n<4;n++)
                                                        {
                                                                SBUF=0x00;
                                                                while(!TI);//发送完T1会被置1
                                                                TI=0;//选择不进中断一直发
                                                        }
                                                }
                                       
                                        }

                                        }
                transmit_receive_flag=0;
                //transmit_flag=0;
                //EA=1;
                //ES=1;//重新打开中断       
                }
                transmit_receive=0;//485处于接收状态
}














相关帖子

沙发
ayb_ice| | 2013-5-27 15:21 | 只看该作者
就你这程序结构不闪才怪呢,
中断进去,半天都不出来

使用特权

评论回复
板凳
shiba1986|  楼主 | 2013-5-27 15:39 | 只看该作者
ayb_ice 发表于 2013-5-27 15:21
就你这程序结构不闪才怪呢,
中断进去,半天都不出来

应该是什么结构 我现在是想上位机给我发个数 然后和我预设的数据01 比较对上的话就传数据

使用特权

评论回复
地板
shiba1986|  楼主 | 2013-5-27 15:40 | 只看该作者
ayb_ice 发表于 2013-5-27 15:21
就你这程序结构不闪才怪呢,
中断进去,半天都不出来

void ser(void) interrupt 4
{//
        //TH1=0xfd;//0xF3;
           //TL1=0xfd;//0xF3;//2400波特率重装初值
           if(RI==1)//如果收到了数单片机置1,软件软件清0
        {
        RI=0;//收到数据后硬件置1后 中断置0
           transmit_temp=SBUF;//SBUF//关键之**定是否影响显示值更新
           }
           //transmit_flag=1;
           //transmit_receive=1;
} 这个是我的串口中断函数

使用特权

评论回复
5
shiba1986|  楼主 | 2013-5-27 15:40 | 只看该作者
ayb_ice 发表于 2013-5-27 15:21
就你这程序结构不闪才怪呢,
中断进去,半天都不出来

初始化是
void init_int(void)
{//中断初始化
         ////TR0=1;                        //        启动T0
         EA=1;                  //  开总中断
         ET0=1;                        //  允许T0中断
         TR0=1;                        //        启动T0/////
         //TR1=1;                        //启动T1定时器
         //REN=1;                        //允许串口发送
         //SM0=0;SM1=1;//串口方式1
         //ES=0;//不用串行口中断
         //ES=1;//使用串行口中断
         //ET2=1;        //  允许T2中断
         //TR2=1;        //启动T2
         //EXEN2=0;
         //TF2=0;
         //C_T2=0;
         //PT2   = 0;        //  T2为高级中断
         PS    = 0;//串行中断
         //PT1   = 0;//定时器1中断
         //PX1   = 0;//外部中断1
         PT0   = 1;//定时器0中断为高优先级
         //PX0   = 0;//外部中断0
         //定时器1中断和串口中断
         ET1=1;                        //允许T1中断
         TR1=1;                        //启动T1定时器
         REN=1;                        //允许串口发送
         SM0=0;SM1=1;//串口方式1
         //ES=0;//不用串行口中断
         ES=1;//使用串行口中断
         transmit_receive=0;//处于接收状态
         //transmit_receive=0;
}

使用特权

评论回复
6
ayb_ice| | 2013-5-27 16:12 | 只看该作者
闪烁应该是显示的问题,
数码管显示一定要通过定时中断刷新才行的,并且还要双缓冲结构才好,
就是中断从专用的缓冲区读取数据,主循环将要显示的数据(主缓冲区)一次全部送给中断缓冲区

使用特权

评论回复
7
shiba1986|  楼主 | 2013-5-28 07:40 | 只看该作者
ayb_ice 发表于 2013-5-27 16:12
闪烁应该是显示的问题,
数码管显示一定要通过定时中断刷新才行的,并且还要双缓冲结构才好,
就是中断从专用 ...

现在情况是,如果把串口发送去掉,显示正常,

使用特权

评论回复
8
shiba1986|  楼主 | 2013-5-28 08:47 | 只看该作者
ayb_ice 发表于 2013-5-27 16:12
闪烁应该是显示的问题,
数码管显示一定要通过定时中断刷新才行的,并且还要双缓冲结构才好,
就是中断从专用 ...

显示我是用的定时器0刷新的

使用特权

评论回复
9
ayb_ice| | 2013-5-28 09:12 | 只看该作者
shiba1986 发表于 2013-5-28 08:47
显示我是用的定时器0刷新的

那就要双缓冲,我说的很明白了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

1

粉丝