標題: 為什么我的單片機定時器不能實現(xiàn)倒計時? [打印本頁]

作者: 紅袍耗子    時間: 2021-3-8 21:47
標題: 為什么我的單片機定時器不能實現(xiàn)倒計時?
#include <REGX52.H>
#include "onewire.h"

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;

sbit key7 = P3^0;
sbit key6 = P3^1;
sbit key5 = P3^2;
sbit key4 = P3^3;

uint code Shu[] =
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,
0xbf,0xff, 0xc6};

void Delay(uint t);
void Init_hc573(uint sel);
void Init_set(void);
void DisplaySMG_Dat(uint pos, uint dat);
void DisplaySMG_all(void);
void DisplaySMG(void);
void keyscan(void);
void Init_Timer0(void);

uint yi = 11, er = 11, san = 11, si = 11, wu = 11, liu = 11, qi = 11,ba = 11;

uint display;
uint work;
uint motor;
uint sec = 50;
uint flag_5;
uint flag_7;
uint stop;
uint temperature;

uint count;
uint time;

void main()
{
        Init_Timer0();
        Init_set();
      
        while(1)
        {
               
                if(display == 0)
                {
                        if(work == 0)
                        {
                                if(sec > 0)
                                {
                                        Init_hc573(4);
                                  P0 = 0xff;
                                  L1 = 0;
                                }
                                else
                                {
                                        Init_hc573(4);
                                  P0 = 0xff;
                                }
                          yi = 10;er = work+1;san = 10;
                          si = 11;
                          wu = sec/1000;liu = sec%1000/100;
                          qi = sec%100/10;ba = sec&10;
                        }
                        else if(work == 1)
                        {
                                if(sec > 0)
                                {
                                        Init_hc573(4);
                                  P0 = 0xff;
                                  L2 = 0;
                                }
                                else
                                {
                                        Init_hc573(4);
                                  P0 = 0xff;
                                }
                              
                                yi = 10;er = work+1;san = 10;
                          si = 11;
                          wu = sec/1000;liu = sec%1000/100;
                          qi = sec%100/10;ba = sec&10;
                        }
                        else if(work == 2)
                        {
                                if(sec > 0)
                                {
                                        Init_hc573(4);
                                  P0 = 0xff;
                                  L3 = 0;
                                }
                                else
                                {
                                        Init_hc573(4);
                                  P0 = 0xff;
                                }
                              
                                yi = 10;er = work+1;san = 10;
                          si = 11;
                          wu = sec/1000;liu = sec%1000/100;
                          qi = sec%100/10;ba = sec&10;
                        }
                }
               
                else
                {
                        temperature = read_temperature();
                       
                        yi = 10;er = 4;san = 10;
                        si = 11;wu = 11;
                        liu = temperature/10;qi = temperature%10;ba = 12;
                }
               
                if(sec > 0)
                {
                        EA  = 1;
                        ET0 = 1;
                }
                else
                {
                        EA  = 0;
                        ET0 = 0;
                        Init_hc573(4);
                        P0 = 0xff;
                        motor = 0;
                        count = 0;
                }
                        keyscan();
                        DisplaySMG();
                }
}

void Delay(uint t)
{
        while(t --);
}

void Init_hc573(uint sel)
{
        switch(sel)
        {
                case 4:P2 = (P2 &0x1f)|0x80;break;
                case 5:P2 = (P2 &0x1f)|0xa0;break;
                case 6:P2 = (P2 &0x1f)|0xc0;break;
                case 7:P2 = (P2 &0x1f)|0xe0;break;
        }
}

void Init_set(void)
{
        Init_hc573(4);
        P0 = 0xff;
        Init_hc573(5);
        P0 = 0x00;
}

void DisplaySMG_Dat(uint pos, uint dat)
{
        Init_hc573(6);
        P0 = 0x01 << pos;
        Init_hc573(7);
        P0 = dat;
      
        Delay(100);
        P0 = 0xff;
}

void DisplaySMG_all(void)
{
        Init_hc573(6);
        P0 = 0xff;
        Init_hc573(7);
        P0 = 0xff;
}

void DisplaySMG(void)
{
        DisplaySMG_Dat(0, Shu[yi]);
        Delay(100);
        DisplaySMG_Dat(1, Shu[er]);
        Delay(100);
        DisplaySMG_Dat(2, Shu[san]);
        Delay(100);
        DisplaySMG_Dat(3, Shu[si]);
        Delay(100);
        DisplaySMG_Dat(4, Shu[wu]);
        Delay(100);
        DisplaySMG_Dat(5, Shu[liu]);
        Delay(100);
        DisplaySMG_Dat(6, Shu[qi]);
        Delay(100);
        DisplaySMG_Dat(7, Shu[ba]);
        Delay(100);
      
        DisplaySMG_all();
}

void keyscan(void)
{
        if(!key4)
        {
                Delay(200);
                if(!key4)
                {
                        if(!display)
                        {
                                work ++;
                          if(work == 3)
                          {
                                  work = 0;
                          }
                        }
                        while(!key4);
                }
        }
      
        if(!key5)
        {
                Delay(200);
                if(!key5)
                {
                        if(!display)
                        {
                                sec += 60;
                                flag_5 ++;
                                if(flag_5 == 2)
                                {
                                        sec = 0;
                                }
                        }
                        while(!key5);
                }
        }
      
        if(!key6)
        {
                Delay(200);
                if(!key6)
                {
                        if(!display)
                        {
                                Init_hc573(4);
                                P0 = 0xff;
                              
                                sec = 0;
                        }
                        while(!key6);
                }
        }
      
        if(!key7)
        {
                Delay(200);
                if(!key7)
                {
                        display = 1;
                        flag_7 ++;
                        if(flag_7 == 2)
                        {
                                flag_7 = 0;
                                display = 0;
                        }
                        while(!key7);
                }
        }
}

void Init_Timer0(void)
{
        TMOD = 0x01;
        TL0 = (65535-10)/256;               
        TH0 = (65535-10)%256;
//        EA =
//        ET0 =
        TR0 = 1;
}

void Service_Timer0(void) interrupt 1
{
        TL0 = (65535-10)/256;               
        TH0 = (65535-10)%256;
      
        count ++;
        if(work == 0)
        {
                if(count < 20)
                {
                        motor = 1;
                }
                else
                {
                        motor = 0;
                        count = 0;
                }
        }
        else if(work == 1)
        {
                if(count < 30)
                {
                        motor = 1;
                }
                else
                {
                        motor = 0;
                        count = 0;
                }
        }
        else if(work == 2)
        {
                if(count < 70)
                {
                        motor = 1;
                }
                else
                {
                        motor = 0;
                        count = 0;
                }
        }
      
        time ++;
        if(time == 100000 )
        {
                sec --;
                time = 0;
        }
      
}

作者: munuc_w    時間: 2021-3-10 14:39
不知道你這一堆代碼和你的問題有何聯(lián)系。51(52)單片機內(nèi)部的定時器在物理上就只是一個加計數(shù)器,是不能用軟件改變的。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1