找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么单片机定时器程序总是跑死?

[复制链接]
跳转到指定楼层
楼主
ID:743496 发表于 2020-5-3 18:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用一个按键控制4个灯,并定时发送4个不同的数据。

第一次按下按键,可以定时,定时后也可以发送数据,哪个数据都能发。
但是,第一次定时结束,发送过一次数据后,定时器就不管用了,DSH()这里面的程序就不管用了,为啥?

单片机源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit k3=P0^3;  //定时按键
//=================================================
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
//=================================================
uchar numC;         //按键计数标志
uint numF;
uchar X;
//=================================================
void delay(uint xms)        //延时函数
{
        uint i,j;
        for(i=xms;i>0;i--)
          for(j=110;j>0;j--);        
}
void InitTimer0(void)
{
        numC=0;
        numF=0;
        TMOD = 0x21;        //T0工作方式1,T1工作方式2
        SCON = 0x50;
    TH0 = 0x4C;                //50ms
    TL0 = 0x00;
    TH1 = 0xFD;
    TL1 = TH1;
    EA = 1;                //开总中断
    ET0 = 1;        //开定时器0中断
//        ES = 1;
//        TR0 = 1;
        TR1 = 1;
}
void send(uchar a)
{
        SBUF=a;
        while(!TI);
        TI=0;
}
void keyprosC3()        //定时键 -------------------
{
        if(k3==0)
        {
                delay(10);
                if(k3==0)
                {
                        numC++;
                        if(numC==1)
                        {
                                TR0=1;        
                                led3=1;                //定时3灯灭
                                led4=0;                //定时4灯亮
                        }
                        else if(numC==2)
                        {
                                TR0=1;        
                                led4=1;                //定时4灯灭
                                led5=0;                //定时5灯亮
                        }
                        else if(numC==3)
                        {
                                TR0=1;
                                led5=1;                //定时5灯灭
                                led6=0;                //定时6灯亮
                        }
                        else if(numC==4)
                        {
                                X=4;
                                TR0=1;
                                numC=0;
                                led6=1;                //定时6灯灭
                                led3=0;                //定时3灯亮
                        }
                }
                while(!k3);
        }
}
void DSH()
{
        if(numC==1&&numF==40)
        {
                TR0=0;
                X=1;
                numC=0;
                numF=0;
                P1=0xff;
                send(X);
        }
        if(numC==1&&numF==80)
        {
                TR0=0;
                X=2;
                numC=0;
                numF=0;
                P1=0xff;
                send(X);
        }
        if(numC==1&&numF==120)
        {
                TR0=0;
                numC=0;
                numF=0;
                P1=0xff;
                send(X);
        }        
}
void main()
{
    InitTimer0();
        while(1)
        {
                keyprosC3();
                DSH();
        }
}
void Timer0Interrupt() interrupt 1
{
    TH0 = 0x4C;  //50ms
    TL0 = 0x00;
        numF++;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:743496 发表于 2020-5-3 19:14 | 只看该作者
我解决了,太粗心,把子程序DSH()里numC==1写重复了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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