新人求问 c51单片机 同时开启两个定时器的问题

2019-07-15 09:18发布

#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 让电机反转 然后关闭定时器
现在 下载进去 车的舵机没反应了 电机也不能反转
求问 两个定时器同时工作 要怎么写
谢谢各位

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
李虎双
1楼-- · 2019-07-15 20:38
建议你先看看郭天祥的51视频,找到定时器那里。
同时开两个定时器是没有问题的。好长时间没看了,判断不了你的程序写的对不对
我记得微机原理那本书后边,有个控制电机的程序,以前我做实验的时候就是用的那个程序。
李虎双
2楼-- · 2019-07-16 01:28
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-有外部中断请求标志。

一周热门 更多>