找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时器和串口通信问题

[复制链接]
跳转到指定楼层
楼主
ID:679997 发表于 2020-3-11 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
这里用了两个定时器,一个定时器用来计时,一个用来做串口通信把时间发送给串口助手,但是串口助手收到的是00000,有没有大神看出问题在哪里,急求解决方法
#include<reg51.h>

unsigned long T;
unsigned char PuZhh[6] ;

void UsartConfiguration();
void Delay10ms(unsigned int c);   //误差 0us
void dispaly();

void SendData(char date)
{
            SBUF = date;   //将要发送的数据放入到发送寄存器
            while(!TI);                  //等待发送数据完成
                TI=0;                          //清除发送完成标志位


}

void time0() interrupt 1  //计时
{
        unsigned char m;
        TH0=0x3c;
        TL0=0xb0;         //50ms
        m++;
        if(m>19)
        {
          T++;
          P0=~P0;   //验证定时器0是否工作
          m=0;
        }
}

void main()
{
   unsigned char j;
             
   UsartConfiguration();
   dispaly();

   while(1)
   {
    for(j=0; j<6; j++)
                {
                        SBUF = PuZhh[j];   //将要发送的数据放入到发送寄存器
                        while(!TI);                  //等待发送数据完成
                        TI=0;                          //清除发送完成标志位
                }
       
                SendData(0x0d) ;     
                SendData(0x0a) ;
                SendData(0x0d) ;
                SendData(0x0a) ;       
                Delay10ms(50);                  //延时一下再发       

   }

}

void UsartConfiguration()
{
        IT0=1;        //INT0负跳变触发       
    TMOD=0x21;//定时器工作于方式1
        SCON=0X50;                        //设置为工作方式1
    PCON=0X80;                        //波特率加倍
        TH0=0x3c;          //50ms
        TL0=0xb0;
        TH1=0XF3;         //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        EA=1; //CPU开中断总允许
        ET0=1;//开定时中断
        EX0=1;//开外部INTO中断
    TR0=1;//启动定时
        TR1=1;
}

void dispaly()       
{
   PuZhh[0] =T/36000+'0';         //时
   PuZhh[1] =T%36000/3600+'0';
   PuZhh[2] =T%3600/600+'0';   //分
   PuZhh[3] =T%600/60+'0' ;
   PuZhh[4] =T%60/10+'0'  ;     //秒
   PuZhh[5] =T%10+'0';
}
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}

最佳答案

查看完整内容

这很简单,给你改一下。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-3-11 16:04 | 只看该作者
这很简单,给你改一下。
  1. #include<reg51.h>
  2. //unsigned long T;
  3. unsigned char PuZhh[]="00:00:00\n";
  4. unsigned char hour=0,min=0,sec=0;                        //定义时、分、秒变量
  5. bit flag=0;//中断标志
  6. /*
  7. void Delay10ms(unsigned int c) //误差 0us
  8. {
  9.         unsigned char a, b;
  10.         for (;c>0;c--)
  11.         {
  12.                 for (b=38;b>0;b--)
  13.                 {
  14.                         for (a=130;a>0;a--);
  15.                 }         
  16.         }      
  17. }*/

  18. void UsartConfiguration()
  19. {      
  20. //        IT0=1;        //INT0负跳变触发
  21.         TMOD=0x21;          //定时器工作于方式1
  22.         SCON=0X50;    //设置为工作方式1
  23.         PCON=0X80;    //波特率加倍
  24.         TH0=0x3c;     //50ms
  25.         TL0=0xb0;
  26.         TH1=0XF3;     //计数器初始值设置,注意波特率是4800的
  27.         TL1=0XF3;
  28.         EA=1;                                //CPU开中断总允许
  29.         ET1=0;                        //禁止定时器1中断
  30.         ET0=1;                        //开定时中断
  31. //        EX0=1;                        //开外部INTO中断
  32.         TR0=1;                        //启动定时
  33.         TR1=1;
  34. }

  35. void SendData(char date)
  36. {
  37.         SBUF = date;   //将要发送的数据放入到发送寄存器
  38.         while(!TI);                  //等待发送数据完成
  39.         TI=0;                          //清除发送完成标志位
  40. }

  41. void dispaly()        
  42. {
  43.    PuZhh[0]=hour/10+'0';   //时
  44.    PuZhh[1]=hour%10+'0';
  45.    PuZhh[3]= min/10+'0';   //分
  46.    PuZhh[4]= min%10+'0';
  47.    PuZhh[6]= sec/10+'0';   //秒
  48.    PuZhh[7]= sec%10+'0';
  49. }

  50. void main()
  51. {
  52.         unsigned char j;              
  53.         UsartConfiguration();
  54.         while(1)
  55.         {
  56.                 if(flag)
  57.                 {
  58.                         flag=0;
  59.                         dispaly();
  60.                         for(j=0;j<9;j++)
  61.                                 SendData(PuZhh[j]);
  62.                 }       
  63.         }
  64. }

  65. void time0() interrupt 1  //计时
  66. {
  67.         static unsigned char m=0;
  68.         TH0=0x3c;
  69.         TL0=0xb0;         //50ms
  70.         m++;
  71.         if(m>=20)
  72.         {
  73.                 m=0;
  74.                 sec++;
  75.                 P0=~P0;   //验证定时器0是否工作
  76.                 if(sec>=60)
  77.                 {
  78.                         sec=0;
  79.                         min++;
  80.                         if(min>=60)
  81.                         {
  82.                                 hour++;
  83.                                 if(hour>=24)
  84.                                         hour=0;
  85.                         }       
  86.                 }
  87.                 flag=1;
  88.         }
  89. }
复制代码
回复

使用道具 举报

板凳
ID:700687 发表于 2020-3-11 17:59 | 只看该作者
波特率设置错了吧,系统频率是多少?
回复

使用道具 举报

地板
ID:612392 发表于 2020-3-11 18:28 | 只看该作者
明显中断程序有问题,你的LED灯状态也不会变吧?
回复

使用道具 举报

5#
ID:679997 发表于 2020-3-11 20:30 | 只看该作者
cjjdemon 发表于 2020-3-11 18:28
明显中断程序有问题,你的LED灯状态也不会变吧?

状态是会改变的
回复

使用道具 举报

6#
ID:679997 发表于 2020-3-11 20:32 | 只看该作者
mark002 发表于 2020-3-11 17:59
波特率设置错了吧,系统频率是多少?

波特率是对的,12M的晶振4800的波特率,没开另一个定时器时发送是不会正确的。
回复

使用道具 举报

7#
ID:679997 发表于 2020-3-11 20:57 | 只看该作者
cjjdemon 发表于 2020-3-11 18:28
明显中断程序有问题,你的LED灯状态也不会变吧?

会改变
回复

使用道具 举报

8#
ID:679997 发表于 2020-3-17 23:31 | 只看该作者
wulin 发表于 2020-3-11 16:04
这很简单,给你改一下。

你好,我这个程序想加个暂停开始的功能,所以自己加了个串口中断来接收数据,接收到0x00则暂停,0x01则继续,改完的程序如下,能不能帮我看一下哪里出问题了
#include<reg51.h>
//unsigned long T;
unsigned char PuZhh[]="00:00:00\n";
unsigned char hour=0,min=0,sec=0;                        //定义时、分、秒变量
bit flag=0;//中断标志
bit frameFlag=1;//暂停标志
/*
void Delay10ms(unsigned int c) //误差 0us
{
        unsigned char a, b;
        for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}*/

void UsartConfiguration()
{      
//        IT0=1;        //INT0负跳变触发
        TMOD=0x21;          //定时器工作于方式1
        SCON=0X50;    //设置为工作方式1
        PCON=0X80;    //波特率加倍
        TH0=0x3c;     //50ms
        TL0=0xb0;
        TH1=0XF3;     //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        EA=1;                                //CPU开中断总允许
        ET1=0;                        //禁止定时器1中断
        ET0=1;                        //开定时中断
//        EX0=1;                        //开外部INTO中断
        TR0=1;                        //启动定时
        TR1=1;
                ES=1;
}

void SendData(char date)
{
        SBUF = date;   //将要发送的数据放入到发送寄存器
        while(!TI);                  //等待发送数据完成
        TI=0;                          //清除发送完成标志位
}

void dispaly()        
{
   PuZhh[0]=hour/10+'0';   //时
   PuZhh[1]=hour%10+'0';
   PuZhh[3]= min/10+'0';   //分
   PuZhh[4]= min%10+'0';
   PuZhh[6]= sec/10+'0';   //秒
   PuZhh[7]= sec%10+'0';
}

void main()
{
        unsigned char j;              
        UsartConfiguration();
        while(1)
        {
                if(flag&&frameFlag)
                {
                        flag=0;
                        dispaly();
                        for(j=0;j<9;j++)
                                SendData(PuZhh[j]);
                }        
        }
}

void time0() interrupt 1  //计时
{
        static unsigned char m=0;
        TH0=0x3c;
        TL0=0xb0;         //50ms
        m++;
        if(m>=20)
        {
                m=0;
                sec++;
                P0=~P0;   //验证定时器0是否工作
                if(sec>=60)
                {
                        sec=0;
                        min++;
                        if(min>=60)
                        {
                                hour++;
                                if(hour>=24)
                                        hour=0;
                        }        
                }
                flag=1;
        }
}
void serial()interrupt 4
{
   unsigned char rxch;
   if(RI)                    //中断标志 RI=1, 数据接收
        {
        RI = 0;                 //软件清零
        rxch = SBUF;            //读缓冲  
   if (rxch==0x00)         //停止指令   
        {
     frameFlag =0;            
        }
   if (rxch==0x01)          //继续指令
        {
     frameFlag =1;         
        }
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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