打印
[技术问答]

新唐N79e8132A单片机串口与定时器0共用

[复制链接]
1224|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦在那|  楼主 | 2016-4-26 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新唐N79e8132A单片机串口与定时器0共用,同时开启定时器0和串口后,相互影响,串口和定时器不能工作,跟官方的配置一样,为啥我的就是不成呢?以下是配置
void usart_Init()
{
        AUXR1 |= 0x00;                                                                        
        SCON = 0x52;
        TMOD |= 0x21;
        TH1 = 0xFD;
        TL1 = TH1;
        TR1 = 1;
        ES = 1;
         
        //TMOD &= 0xF0;                   // Timer 0 mode 1 with hardware gate
        //TMOD |= 0x01;                   // GATE0=0; C/T0#=0; M10=0; M00=1;

        TH0 = (65526-100)/256;                                        // Initial values
        TL0 = (65536-100)%256;
        ET0 = 1;                        // Enable timer0 interrupt
        TR0 = 1;                        // Timer0 run
}

沙发
wahahaheihei| | 2016-4-26 20:26 | 只看该作者
你换成定时器1试试看,是不是这个串口要使用定时器0进行波特率配置

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
梦在那 + 2
板凳
bitofnoone| | 2016-4-26 20:42 | 只看该作者
这个共用需要分时复用吗

使用特权

评论回复
地板
Micachl| | 2016-4-27 21:22 | 只看该作者
共用的话会不会影响利用的效率呢?

使用特权

评论回复
5
梦在那|  楼主 | 2016-4-28 09:40 | 只看该作者
好像是会有影响的

使用特权

评论回复
6
梦在那|  楼主 | 2016-4-28 14:32 | 只看该作者
这个定时器与串口如何同时工作,跟stc的一样配置吗

使用特权

评论回复
7
heisexingqisi| | 2016-4-28 22:07 | 只看该作者
参考一下STC的是怎么搞的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
梦在那 + 1
8
zhuomuniao110| | 2016-4-28 23:40 | 只看该作者
Micachl 发表于 2016-4-27 21:22
共用的话会不会影响利用的效率呢?

共用体就是为了提高利用率的吧,而且效率更高。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
梦在那 + 2
9
wahahaheihei| | 2016-4-29 20:47 | 只看该作者
楼主这个问题已经搞定了吧,现在可以正常工作了吧

使用特权

评论回复
10
天灵灵地灵灵| | 2016-4-30 12:27 | 只看该作者
官网上如果没有提供手册和例程,说明这个芯片人家不做 了

使用特权

评论回复
11
稳稳の幸福| | 2016-4-30 13:58 | 只看该作者
51单片机资源少,好多外设没自己的时钟,需要用定时器0

使用特权

评论回复
12
捉虫天师| | 2016-4-30 14:08 | 只看该作者
定时器0、定时器1,分别用途定时和串口通信,要实现一个这样的功能
1、首先定时器1工作(串口通信)完成后,
2、定时器0启动工作(开始定时)完成后
3、定时器1恢复工作(串口通信)完成后
4、定时器0恢复工作(开始定时)完成后
5、第3和第4可正常切换工作,互不影响
  下面是我写的,有很多问题,请高手帮忙,以实现以上功能,谢谢!

#include <reg51.h>
void delay(unsigned int i);      //函数声名
void mc(unsigned char i);
/*---------定义全局变量------------*/
unsigned char K = 0;//计时     
unsigned char Miao = 0;//秒     
unsigned int Fen = 0;//分
unsigned int Fen2 = 0;
unsigned  char tmp , flag;
void InitUART_1(void)      
{
    TMOD = 0x20; //定时器1 工作于模式2(作串口通信用)  
    SCON = 0x50; //   0x50 = 10100000  工作模式2
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}
void dsqcsh(void)//定时器0初始化函数   
{
    //TMOD = 0x02;//定时器0 工作于模式2(作定时器用)     
    TH0 = 0x00;// 定时时间200us
    TL0 = 0x48;
    EA = 1;//开总中断   
    ET0 = 1;//开定时器/计数器0中断   
    TR0 = 1;//定时器/计数器0开始计时  
}
void main(void)
{
dsqcsh();
InitUART_1();
    while(1)
     {
       if(flag == 1)
       {
         ES=0;
         flag = 0;
         tmp = SBUF;
  LedNumVal = SBUF ;
         SBUF = tmp;
  Fen2 = 1;
         while(!TI);
         TI=0;
   TR1 = 0;
   TMOD = 0x02;
   TR1 = 1;
       }
   if(Fen2 == 1)
  {
   TMOD = 0x02;
    ET0 = 1;
    P3_4 = 1;
   TR0 = 1;//   开始计时
      mc(tmp);
  }
  else
  {}
    }
}
void UARTInterrupt(void) interrupt 4   // 串口通信中断入口
{
    if(RI)
    {
        RI = 0;
        flag = 1;
         //add your code here!
    }
    else
      {  
        TI = 0;
       }
}      
void SendOneByte(unsigned char c)
{
    /*SBUF = c;
    while(!TI);
    TI = 0;
    */
}
void Timer1Interrupt(void) interrupt 1//定时器0 工作于模式2  中断入口     
{
//unsigned int i;
    TH0 = 0x00;
    TL0 = 0x48;
    ++K;
    if(K>=1)
    {
     ++Miao;
        K = 0;
    }
else{}
    //add your code here!
   
}
void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 500; j > 0; j--);
}
void mc(unsigned char i)
{

  if(Miao>=1)
  {
   if(Fen>=i*2)  
   {   
      LedNumVal = Fen;
   TR0 = 0;
   ET0 = 0;
   TMOD = 0x20; //定时器1 工作于模式2(作串口通信用) 打开
   //flag = 1;
   Fen = 0;
   Fen2 = 0;
   //delay(10);
   ES=1;
     TR1 = 1;
   //++Q;   //圈记数,每走一圈加1
  }
  else
  {
   P3_2 = !P3_2;
      Miao = 0;
      ++Fen;
  }
  }
//for(i=i;i<=0;--i)
  //P3_2 = !P3_2;
}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
梦在那 + 2
13
643757107| | 2016-4-30 15:41 | 只看该作者
一般51单片机是不分厂家都是代码通用的,内部结构也一样,比如,那个STC89C51,根AT89S51就是通用的,虽然内部的硬件外设不同,但是你写好了代码编译后一样可以用。

使用特权

评论回复
14
梦在那|  楼主 | 2016-5-11 11:09 | 只看该作者
wahahaheihei 发表于 2016-4-29 20:47
楼主这个问题已经搞定了吧,现在可以正常工作了吧

可以了,其实就是配置定时器和串口的寄存器,一定要避免相互冲突

使用特权

评论回复
15
捉虫天师| | 2016-5-11 15:40 | 只看该作者
上传个配置正确的代码看看啊,学习学习。

使用特权

评论回复
16
梦在那|  楼主 | 2016-5-11 15:45 | 只看该作者
定时器设置:
        AUXR1 |= 0x00;         // Select P10/P11 as UART pin(default)
        InitialUART0_Timer1(9600);      // 9600 Baud Rate @ 11.0592MHz
       
        TMOD |= 0x01;                   // GATE0=0; C/T0#=0; M10=0; M00=1;
        CKCON = 0x08;        //定时器0时钟控制                                                                       
        TH0 = 0XFF;        //100us定时一次                                                                               
        TL0 = 0XA3;  
        ET0 = 1;                        // Enable timer0 interrupt
        EA = 1;                         // Enable interrupts
        TR0 = 1;                        // Timer0 run       
串口:
void InitialUART0_Timer1(INT32U u32Baudrate)
{
    SCON = 0x52;
    TMOD |= 0x20;

#ifdef FOSC_110592
    TH1 = 256 - (28800/u32Baudrate); /* 11.059M/384=28800 */
#endif
#ifdef FOSC_184320
    TH1 = 256 - (48000/u32Baudrate); /* 18.4320M/384=48000 */
#endif
#ifdef FOSC_221184
     TH1 = 256 - (57600/u32Baudrate); /* 22.1184M/384=57600 */
#endif
#ifdef FOSC_331776
     TH1 = 256 - (86400/u32Baudrate); /* 33.1776M/384=86400 */
#endif
#ifdef FOSC_368640
     TH1 = 256 - (96000/u32Baudrate); /* 36.8640M/384=96000 */
#endif
    TR1 = 1;
}

使用特权

评论回复
17
wahahaheihei| | 2016-5-21 15:44 | 只看该作者
梦在那 发表于 2016-5-11 15:45
定时器设置:
        AUXR1 |= 0x00;         // Select P10/P11 as UART pin(default)
        InitialUART0_Timer1(960 ...

这代码写的标准啊,直接用预编译考虑的全面。

使用特权

评论回复
18
zhuotuzi| | 2016-5-22 09:30 | 只看该作者
MARK,此贴甚好,原来定时器不能随便共用的。

使用特权

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

本版积分规则

37

主题

234

帖子

2

粉丝