找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1307|回复: 6
收起左侧

想请教一下51单片机T1定时器控制T0定时器启动的参考例子有没有?或者参考方案

[复制链接]
ID:858009 发表于 2021-11-17 15:07 | 显示全部楼层 |阅读模式
本帖最后由 qwettyuio 于 2021-11-22 14:25 编辑

想学习使用T1定时器控制T0定时器
通过按键控制定时器的,想修改,没有按键控制的情况下,每次通过按键设时间结束等待5后启动倒计时,
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar min,sec,count,sec1,sec2,min0,min1,min2,keystopc,temp,mun;
sbit keystop=P3^0;
sbit keyh=P3^1;
sbit keym=P3^2;
sbit led1=P1^0;
sbit beep=P2^3;
sbit lcden=P3^4;
sbit lcdrw=P3^6;
sbit lcdrs=P3^5;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9',':'};

void delay(uint z)                //延时程序
{
        uint x,y;
        for(x=z;x>0;x--)
         for(y=110;y>0;y--);
}
void beep_Init()
{
        beep=0;
        delay(500);
        beep=1;
}
/**************************************************************
------LCD1602显示函数------
*************************************************************/
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init_1602()                                //初始化1602
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
}
void write_Char(unsigned char x,unsigned char y,unsigned char date)
{
         if (y == 0)
        {
                write_com(0x80 + x);     
        }
        else
        {
                write_com(0xC0 + x);     
        }
        write_data(date);  
}
void display(uchar min0,uchar min1,uchar min2,uchar sec1,uchar sec2)         //显示程序
{       
        write_Char(3,0,table[min0]);
        write_Char(4,0,table[min1]);
        write_Char(5,0,table[min2]);
        write_Char(6,0,table[0x0a]);
        write_Char(7,0,table[sec1]);
        write_Char(8,0,table[sec2]);
}
/************************************************************
------计时器/定时器0-----
*************************************************************/
void init()                                                //定时器初始化
{
        count=0;
        min=0;
        sec=0;
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=0;
        ET0=1;
        EA=1;
}
void count0() interrupt 1     //工作方式
{
        TH0=(65536-50000)/256;    //50ms
        TL0=(65536-50000)%256;
        count++;
        if(count==20)             //20*50ms=1000ms=1s
                {
                        count=0;
                        if(sec==0)
                        {
                                if (min!=0)
                                {
                                        sec=59;
                                        min--;
                                }                               
                                else
                                {
                                        beep_Init();
                                        TR0 =0;
                                }
                        }
                        else sec--;
                }
}

/************************************************************
------主函数------
*************************************************************/
void main()
{
        init();
        init_1602();
        while(1)
        {               
                if(keystop==0)                             //检测是否停止键按下
                {
                        delay(10);
                        if(keystop==0)
                        {
                                if(keystopc!=1)   keystopc++;      //按停止键的次数       
                                else              keystopc=0;
                                while(keystop==0);                 //松手检测
                                delay(5);
                                while(keystop==0);
                        }
                        switch(keystopc)
                        {
                                case 0:TR0=0;break;                // 按键一次就停止计数
                                case 1:TR0=1;break;
                                default:break;
                        }
                }
                if(keyh==0)                 //实现分钟加一
                {
                        delay(100);
                        if(keyh==0)
                        {       
                                if(min!=110)
                                {
                                        min++;
                                }
                        }
                        while(!keym);                  //松手检测
                        delay(5);
                        while(!keym);
                }
                if(keym==0)              //实现分钟减一
                {
                        delay(100);
                        if(keym==0)
                        {       
                                if(min!=0)
                                {
                                        min--;
                                }
                        }
                        while(!keyh);                //松手检测
                        delay(5);
                        while(!keyh);
                }
                min0=min/100;
                min1=min%100/10;
                min2=min%10;
                sec1=sec/10;
                sec2=sec%10;
           display(min0,min1,min2,sec1,sec2);  //一直显示时钟               
        }
}

回复

使用道具 举报

ID:908826 发表于 2021-11-17 18:44 | 显示全部楼层
没看明白你的意思。
回复

使用道具 举报

ID:624769 发表于 2021-11-17 19:03 来自手机 | 显示全部楼层
把控制t0定时器的代码写到t1定时器里。
回复

使用道具 举报

ID:948088 发表于 2021-11-17 19:21 来自手机 | 显示全部楼层
可以把定时器0的寄存器的相关控制代码写在定时器1的中断函数里
回复

使用道具 举报

ID:123289 发表于 2021-11-18 13:48 | 显示全部楼层
读通定时器的原理就能达成你的目的。
回复

使用道具 举报

ID:858009 发表于 2021-11-19 16:28 | 显示全部楼层
yzwzfyz 发表于 2021-11-18 13:48
读通定时器的原理就能达成你的目的。

按键启动定时器会用,但是不用按键启动定时器,就不太会,做一个5分钟倒计时,设置好时间,等待3s没有再设置时,启动倒计时,想着用51单片机T1控制T0,不太会,想请教一下
回复

使用道具 举报

ID:624769 发表于 2021-11-19 17:18 | 显示全部楼层
qwettyuio 发表于 2021-11-19 16:28
按键启动定时器会用,但是不用按键启动定时器,就不太会,做一个5分钟倒计时,设置好时间,等待3s没有再 ...

T1 控制 T0 不难,
T1 定时 5分钟也不难,
难的是,你要搞明白单片机运行的原理,
就算我现在把 T1 定时5分钟 后 TR0 =1 整个中断写出来给你, 和本来在T0里面计时也是没有差别的,你想时间到了蜂鸣器响的话,还是要把这个模块写出来,不是加个T1去定时, 蜂鸣器就能响了。
并且,T1 定时5分钟后启动 T0, 那么 T1 靠什么启动呢? 这些原理你要搞清楚了,你压根不会考虑去用T1 启动T0, 而是 在 T0 里面把活全干了。
回复

使用道具 举报

ID:858009 发表于 2021-11-22 09:17 | 显示全部楼层
本帖最后由 qwettyuio 于 2021-11-22 14:33 编辑
188610329 发表于 2021-11-19 17:18
T1 控制 T0 不难,
T1 定时 5分钟也不难,
难的是,你要搞明白单片机运行的原理,

整体设计是做一个定时器,就只有两个按键,一个按键按一次加·一分钟,长按50ms连续加,另一个是减,在不添加其他按键情况下,想通过自动启动倒计时,每次设置好时间等待5s左右就启动倒计时,所以想问一下,怎么通过一个定时器控制另一个定时器启动;
代码如下,这是添加了一个启动按键的,能否把这个去掉,
回复

使用道具 举报

ID:858009 发表于 2021-11-22 14:22 | 显示全部楼层
188610329 发表于 2021-11-19 17:18
T1 控制 T0 不难,
T1 定时 5分钟也不难,
难的是,你要搞明白单片机运行的原理,

就是不通过按键控制启动,在设置时间结束后,等待5s后启动倒计时
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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