打印
[51单片机]

定时器和串行通信

[复制链接]
3055|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小盼abc|  楼主 | 2014-12-6 19:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
yklstudent| | 2014-12-6 19:57 | 只看该作者
多半你自己的问题

使用特权

评论回复
板凳
NE5532| | 2014-12-6 20:07 | 只看该作者
“两个”定时器是指哪两个?

使用特权

评论回复
地板
小盼abc|  楼主 | 2014-12-6 20:27 | 只看该作者
NE5532 发表于 2014-12-6 20:07
“两个”定时器是指哪两个?

T1和T0,为什么么啊

使用特权

评论回复
5
小盼abc|  楼主 | 2014-12-6 20:28 | 只看该作者
yklstudent 发表于 2014-12-6 19:57
多半你自己的问题

单独都可以啊  ,这是为什么???

使用特权

评论回复
6
NE5532| | 2014-12-6 20:39 | 只看该作者
请描述你的“干扰”现象,51的这个结构在20年前就有了,楼主多怀疑自己的问题。

使用特权

评论回复
7
小盼abc|  楼主 | 2014-12-6 20:44 | 只看该作者
NE5532 发表于 2014-12-6 20:39
请描述你的“干扰”现象,51的这个结构在20年前就有了,楼主多怀疑自己的问题。 ...

我知道我的问题  但是没查出来
void time0_init()                        //定时器0初始化        和串口通信初始化
{
        EA=1;
        ET1=1;       
        ET0=1;
        TR1=1;
        TR0=1;
        ES=1;
//        PT1=1;

        TMOD|=0X20;
        TH1=0XFD;
        TL1=0XFD;

        SM0=0;                          //方式选择位
        SM1=1;                         //
        REN=1;                        //串行通信通信允许位

}

void time0()interrupt 1          //定时器0
{       
        static uchar i;       
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        i++;
        if(i==2)        //刷新数据为每100ms
        {
                i=0;
                shuaxin=1;
        }
}       

void uart()interrupt 4       //串行通信
{       
        static uchar i,temp;       
        if(RI)
        {
                RI=0;
                temp=SBUF;
                SBUF=temp;
                i++;
            time_uart=temp&0x0f;
                if(i==16)
                {
                        i=0;
                        biaozhi=1;
                }       
        }
        if(TI)
                TI=0;
}
void main(void)         //主函数
{       
        uchar i;
        time0_init();        //函数的初始化
        ds1302_init();
        ds_writeall();
        while(1)
        {
           display();
           if(biaozhi==1)
           {
                           for(i=0;i<8;i++)
                        {
                                time_begin=time_uart[2*i]*10+time_uart[2*i+1];
                        }
                        ds_writeall();       
                        biaozhi=0;
           }
           if(shuaxin==1)
           {
                           shuaxin=0;
                        ds_receiveall();
           }
           shu[0]=duanma[time_begin[4]/10];
           shu[1]=duanma[time_begin[4]%10];
           shu[2]=0x40;
           shu[3]=duanma[time_begin[5]/10];
           shu[4]=duanma[time_begin[5]%10];
           shu[5]=0x40;
           shu[6]=duanma[time_begin[6]/10];
           shu[7]=duanma[time_begin[6]%10];

        }
}这是程序的一部分我做的是串口发送数据调整数码管时间信息 问题在于同时使用T1和T0,数码管时钟无**常工作

使用特权

评论回复
8
NE5532| | 2014-12-6 20:53 | 只看该作者
请描述“无**常工作”的现象。

使用特权

评论回复
9
小盼abc|  楼主 | 2014-12-6 20:59 | 只看该作者
NE5532 发表于 2014-12-6 20:53
请描述“无**常工作”的现象。

就是如果T0 开启T1不开启数码管显示正常  如果T1开启T0不开启串口发送数据能接受,而如果同时开启要摸
数码管显示但是串口助手发送数据无效 要摸串口发送数据有效 但是数码管不显示  ,反正就是不能一起工作

使用特权

评论回复
10
NE5532| | 2014-12-6 21:06 | 只看该作者
T1打开,T0关闭,数码管是停止扫描的,你怎么判断串口能接收数据的呢?另外你的数码管不显示是指显示完全熄灭,还是显示的东西不是你发送的,还是显示乱码?新同学要学会描述现象,不要像太婆修电视一样,只知道一句:就是不好使。

使用特权

评论回复
11
小盼abc|  楼主 | 2014-12-6 21:08 | 只看该作者
NE5532 发表于 2014-12-6 21:06
T1打开,T0关闭,数码管是停止扫描的,你怎么判断串口能接收数据的呢?另外你的数码管不显示是指显示完全熄 ...

不好意思啊  那个数码管就是完全不显示  串口成功发送有返回值

使用特权

评论回复
12
NE5532| | 2014-12-6 21:19 | 只看该作者
用串口写一个发送测试,放到扫描定时器中断里面,看这个中断是否在发生。

使用特权

评论回复
13
小盼abc|  楼主 | 2014-12-6 21:22 | 只看该作者
NE5532 发表于 2014-12-6 21:19
用串口写一个发送测试,放到扫描定时器中断里面,看这个中断是否在发生。 ...

原谅我是新手 可以说的详细一点吗  不太懂

使用特权

评论回复
14
NE5532| | 2014-12-6 21:39 | 只看该作者
简单来说就是要想办法证明你程序工作的要素都是存在的。楼主缺的是调试程序的方法,而不是具体调试一个程序。建议读本版精华“程序调试黑宝书”

使用特权

评论回复
15
小盼abc|  楼主 | 2014-12-6 22:56 | 只看该作者
NE5532 发表于 2014-12-6 21:39
简单来说就是要想办法证明你程序工作的要素都是存在的。楼主缺的是调试程序的方法,而不是具体调试一个程序 ...

谢谢

使用特权

评论回复
16
ningling_21| | 2014-12-7 14:50 | 只看该作者
小盼abc 发表于 2014-12-6 20:44
我知道我的问题  但是没查出来
void time0_init()                        //定时器0初始化        和串口通信初始化
{

T1用作串口波特率时,不要开T1中断,否则你没写中断函数,程序就会跳错

使用特权

评论回复
17
yueguang3048| | 2014-12-7 15:17 | 只看该作者
void time0_init()                        //定时器0初始化        和串口通信初始化
{
        TMOD | = 0x20;
        SCON &=0x50;//        //SM0=0; //方式选择位//SM1=1; // REN=1;                        //串行通信通信允许位
        TH1 = 0xFD;
        TL1 = 0XFD;
         TR1=1;
        TR0=1;        
        
//——>  ET1=1;——> 这里为什么要开启T1的中断呢? 定时器1不是已经是波特率发生器用了嘛!       
        ET0=1;
        ES=1;
        EA=1;
//     PT1=1;
}
应该是初始化的问题 同意楼上的看法
(PS:初始化结构写的很不规范,建议LZ看看大虾们的初始化如何写的;使用什么就只开什么,别的一概关闭,免得到时候出现乱七八糟的问题,可以在纸上罗列一番,无论程序大小。祝君成功!!!)

使用特权

评论回复
18
sedatefire| | 2014-12-7 19:13 | 只看该作者
对于复杂的问题,就是分成数步拆出来,
程序一步步叠加上去,看看哪个环节出错...
烧板千遍,其义自见...
所得的体会就是深刻的,具体的,永不再犯的..

使用特权

评论回复
19
ayb_ice| | 2014-12-8 09:24 | 只看该作者
T1不要开中断

开了,你至少要写个简单中断处理程序啊

使用特权

评论回复
20
wang168506| | 2014-12-8 15:39 | 只看该作者
中断响应优先级也别开了  

使用特权

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

本版积分规则

22

主题

86

帖子

0

粉丝