发 帖  
原厂入驻New
[问答] 新人求问 c51单片机 同时开启两个定时器的问题
6053 c51 定时器 中断
分享
#include <reg52.h>

sbit pwm=P3^0;    //舵机

sbit zuo=P3^3;     //         红外
sbit you=P3^2;     //          红外

sbit BAI=P2^0;
sbit SHI=P2^1;
sbit GE =P2^2;

sbit ENA=P1^1;      //电机
sbit IN1=P1^2;
sbit IN2=P1^3;

char jd;
unsigned char count;
unsigned char n;

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,                                                       
                                                                                                                0x92,0x82,0xf8,0x80,0x90};

void delay(unsigned int i)
{
    unsigned int j,k;
    for(j=i;j>0;j--)
        for(k=110;k>0;k--);
}
void time0_init()
{
    TMOD=0x01;
    EA=1;
                ET0=1;
                TR0=1;
    TH0=(65536-158)/256;
                TL0=(65536-158)%256;
}  
void Time1_init()
{
    TMOD=0x01;
    EA=1;
                ET1=1;
                TR1=1;
    TH1=0x4c;
                TL1=0x00;
}  
void Time0_int() interrupt 1
{
    TH1=(65536-158)/256;
                TL1=(65536-158)%256;
    IF(count<jd)
        pwm=1;
    else
                                pwm=0;       
    count++;
    count=count%40;
}

void Time1_int() interrupt 3
{
                TR1=0;
                TH1=0x4c;
                TL1=0x00;
                n++;
                TR1=1;
}

void keyscan()
{
if(zuo==0&&you==1)          
        {         
                        Time1_init();
                        if(n==10)
                        {
                                ENA=1;
                                IN1=0;
                                IN2=1;
                               
                                n=0;
                                TR1=0;
                        }
                        ENA=1;                                          
                        IN1=1;
      IN2=0;                           
                        if(jd==7)
                                {
                                        jd=jd+2;
                                }
                        else
                                {
                                        jd=jd+3;
                                }
          count=0;
      if(jd>9)
                                {
                                        jd=9;
                                }
                        while(zuo==0&&you==1);          
        }
if(you==0&&zuo==1)
        {
                Time1_init();
                        if(n==10)
                        {
                                ENA=1;
                                IN1=0;
                                IN2=1;
                               
                                n=0;
                                TR1=0;
                        }
                       
                   ENA=1;
                        IN1=1;
                        IN2=0;       
               
                        if(jd==9)
                                {
                                        jd=jd-2;
                                }
                        else
                                {
                                        jd=jd-3;
                                }
      count=0;
      if(jd<4)
                                {
                                        jd=4;
                                }
      while(you==0&&zuo==1);
        }
if(you==0&&zuo==0)
   {               
                        while(you==0&&zuo==0) ;       
                        ENA=1;          
                        IN1=1;
                        IN2=0;
   }
}

void display()
{
                switch(jd)
                        {
                                case 4:
                                        P0=table[9];
                                        BAI = 0;
                                        delay(1);
                                        BAI = 1;

                                        P0=table[0];
                                        SHI = 0;
                                        delay(1);
                                        SHI = 1;
               
                                        P0=table[1];
                                        GE = 0;
                                        delay(1);
                                        GE = 1;
                                break;
                               
                                case 7:
                                        P0=table[0];
                                        BAI = 0;
                                        delay(1);
                                        BAI = 1;

                                        P0=table[0];
                                        SHI = 0;
                                        delay(1);
                                        SHI = 1;
               
                                        P0=table[0];
                                        GE = 0;
                                        delay(1);
                                        GE = 1;
                                        break;
                               
                                case 9:
                                        P0=table[0];
                                        BAI = 0;
                                        delay(1);
                                        BAI = 1;
       
                                        P0=table[0];
                                        SHI = 0;
                                        delay(1);
                                        SHI = 1;
                       
                                        P0=table[1];
                                        GE = 0;
                                        delay(1);
                                        GE = 1;
                                        break;
                        }   
}

void main()
{
                jd=7;
                count=0;
                ENA=1;
                IN1=1;
                IN2=0;
                Time0_init();
                Time1_init();
                while(1)
                        {
                                        keyscan();
                                        display();
                        }
}

我想实现 pwm波一直输出 t0定时
在检测到红外时候打开t1定时器 500ms 让电机反转 然后关闭定时器
现在 下载进去 车的舵机没反应了 电机也不能反转
求问 两个定时器同时工作 要怎么写
谢谢各位

1
2017-11-20 22:01:40   评论 分享淘帖 邀请回答

相关问题

4个回答
/*********T0、T1分别设置***********/
void Time0_init()
{
        TMOD &= 0xF0;
        TMOD |= 0x01;
        TH0=(65536-158)/256;
        TL0=(65536-158)%256;
        TR0=1;
        ET0=1;
        EA=1;
}  
void Time1_init()
{
        TMOD &= 0x0F;
        TMOD |= 0x10;
        TH1=0x4c;
        TL1=0x00;
        TR1=1;
        ET1=1;
//        EA=1;//重复设置无意义
}  
/*********T0、T1共同设置***********/
void Time_init()
{
        TMOD = 0x11;
        TH0=(65536-158)/256;
        TL0=(65536-158)%256;
        TH1=0x4c;
        TL1=0x00;
        TR0=1;
        TR1=1;
        ET0=1;
        ET1=1;
        EA=1;
}  
2017-11-21 10:33:18 评论

举报

在写中断函数注意就可以了都一样的
2017-11-22 08:09:16 评论

举报

建议你先看看郭天祥的51视频,找到定时器那里。
同时开两个定时器是没有问题的。好长时间没看了,判断不了你的程序写的对不对
我记得微机原理那本书后边,有个控制电机的程序,以前我做实验的时候就是用的那个程序。
2017-11-30 11:19:00 评论

举报

SFR-TCON和TMOD控制T0和T1的运行状态和工作方式
控制寄存器TCON(地址88H)

D7~D0:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

高4位与定时/计数器有关,低4位用于控制外部中断。

TFi-定时/计数器溢出标志位;计数溢出时,硬件自动置1,在中断允许条件下,是向CPU请求中断的信号。中断被响应后,硬件自动清0。该位也可由软件置位和清0,(中断屏蔽时)可以由软件查询测试。

TRi-定时/计数器运行控制位;该位置1时,定时/计数器才运行,否则,停止。

ITi-外部中断请求电信号触发方式选择(0电平、1下降沿)

IEi-有外部中断请求标志。
2017-11-30 11:22:16 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /7 下一条

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