找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1421|回复: 4
收起左侧

为什么第三倒计时个不会执行

[复制链接]
ID:665608 发表于 2020-1-30 14:40 | 显示全部楼层 |阅读模式

#include "reg51.h"
#include <intrins.h>

typedef unsigned int u16;       
typedef unsigned char u8;

sbit beep=P1^5;
sbit led1=P2^5;
sbit led2=P2^6;
sbit led3=P2^7;

sbit k1=P3^2;
sbit k2=P3^3;

sbit LSA=P2^2;
sbit LSB=P2^3;                                                          
sbit LSC=P2^4;

u8 wei =0;
u16 number = 0;
u16 val = 30;
u16 ershi= 20;
u16 shiwu= 15;

u8 code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x38};      

int k=0;
                 

void delay(long int i)
{
        while(i--);
}


void Timer0Init()
{
        TMOD|=0X01;                                       

        TH0=0XFC;                               
        TL0=0X18;       
        ET0=1;                                               
        EA=1;                                       
        TR0=1;                                                       
}


void sanshi()
{

        number = val;
        for(wei=0;number!=0;wei++)
        {
       
                switch(wei)         
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;break;
                        case(1):
                                LSA=1;LSB=0;LSC=0;break;                       
                }
                                                        
                P0=smgduan[number%10];
                delay(10);
                P0=0x00;
                number = number/10;
               
        }       
}


void ershi1()
{

        number = ershi;
        for(wei=0;number!=0;wei++)
        {
       
                switch(wei)         
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;break;
                        case(1):
                                LSA=1;LSB=0;LSC=0;break;
                }
                                        
               

                P0=smgduan[number%10];
                delay(10);
                P0=0x00;
                number = number/10;
               
        }       
}


void shiwu1()
{

        number = shiwu;
        for(wei=0;number!=0;wei++)
        {
       
                switch(wei)         
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;break;
                        case(1):
                                LSA=1;LSB=0;LSC=0;break;
                }
                                        
               

                P0=smgduan[number%10];
                delay(10);
                P0=0x00;
                number = number/10;
               
        }       
}

void Timer0() interrupt 1
{
        static int i;                          
          
       
        TH0=0XFC;               
        TL0=0X18;
        i++;
        if(i==1000)                  
        {
            val--;
                ershi--;
                shiwu--;
                i=0;
                       
                P0=smgduan[++k];
               
                if(ershi==-1)ershi=20;
        }
       
                       
}

void main()
{
        int i;                                               
        Timer0_Init();
        while(1)
        {
                  sanshi();
                if(val==1)beep=~beep;
                if(val==0)break;
        }
        while(1)
        {
                ershi1();
                if(ershi==1)beep=~beep;
                if(ershi==0)break;
        }
        while(1)
        {
                shiwu1();
                if(shiwu==1)beep=~beep;
                if(shiwu==0)break;
        }       
}

回复

使用道具 举报

ID:94031 发表于 2020-1-30 16:28 | 显示全部楼层
Timer0_Init();和
void Timer0Init()
{        
   TMOD|=0X01;
   TH0=0XFC;      
   TL0=0X18;     
    ET0=1;         
     EA=1;     
      TR0=1;   
    }
名称不一致。
回复

使用道具 举报

ID:235200 发表于 2020-1-30 18:26 | 显示全部楼层
可以把主程序中并联的3个while(1)合并为1个,执行3种情况采用标志的方法
回复

使用道具 举报

ID:155507 发表于 2020-1-30 18:42 | 显示全部楼层
先画程序框图,看看能不能行得通,越细越好。

你是用3个While无限死循环
单片机在自主运行的时候一般是在执行一个死循环

先学理论,打基础,否则,问题多多,事倍功半。
回复

使用道具 举报

ID:213173 发表于 2020-1-30 22:08 | 显示全部楼层
楼主这个程序构架不合理,改一下试试。
  1. #include "reg51.h"
  2. #include <intrins.h>

  3. typedef unsigned int u16;        
  4. typedef unsigned char u8;

  5. sbit beep=P1^5;
  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;                                                         
  8. sbit LSC=P2^4;

  9. u8 val = 30;
  10. u8 ershi= 20;
  11. u8 shiwu= 15;
  12. bit flag=0;
  13. u8 code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  14.                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x38};      
  15. u8 data dis_buf[8]={0,0,0x40,0,0,0x40,0,0};

  16. void delay(u16 i)
  17. {
  18.         while(i--);
  19. }

  20. void Timer0Init()
  21. {
  22.         TMOD|=0X01;
  23.         TH0=0XFC;        
  24.         TL0=0X18;
  25.         ET0=1;
  26.         EA=1;  
  27.         TR0=1;
  28. }

  29. void display()
  30. {
  31.         static int i;
  32.         P0=0x00;
  33.         switch(i)
  34.         {
  35.                 case(0):LSA=0;LSB=0;LSC=0;break;
  36.                 case(1):LSA=1;LSB=0;LSC=0;break;
  37.                 case(2):LSA=0;LSB=1;LSC=0;break;
  38.                 case(3):LSA=1;LSB=1;LSC=0;break;
  39.                 case(4):LSA=0;LSB=0;LSC=1;break;
  40.                 case(5):LSA=1;LSB=0;LSC=1;break;
  41.                 case(6):LSA=0;LSB=1;LSC=1;break;
  42.                 case(7):LSA=1;LSB=1;LSC=1;break;
  43.         }
  44.         P0=dis_buf[i];
  45.         i++;
  46.         i%=8;
  47. }

  48. void main()
  49. {            
  50.         Timer0Init();
  51.         while(1)
  52.         {
  53.                 dis_buf[7]=smgduan[val/10];
  54.                 dis_buf[6]=smgduan[val%10];
  55.                 dis_buf[4]=smgduan[ershi/10];
  56.                 dis_buf[3]=smgduan[ershi%10];
  57.                 dis_buf[1]=smgduan[shiwu/10];
  58.                 dis_buf[0]=smgduan[shiwu%10];
  59.                 if(flag==1)
  60.                 {
  61.                         flag=0;
  62.                         beep=0;
  63.                         delay(50000);
  64.                         beep=1;
  65.                 }
  66.         }
  67. }

  68. void Timer0() interrupt 1
  69. {
  70.         static int i;
  71.         TH0=0XFC;               
  72.         TL0=0X18;
  73.         i++;
  74.         if(i>=1000)                  
  75.         {
  76.                 i=0;
  77.                 if(val>0)
  78.                 {
  79.                         val--;
  80.                         if(val==0)
  81.                                 flag=1;
  82.                 }
  83.                 if(ershi>0)
  84.                 {
  85.                         ershi--;
  86.                         if(ershi==0)
  87.                                 flag=1;
  88.                 }
  89.                 if(shiwu>0)
  90.                 {
  91.                         shiwu--;
  92.                         if(shiwu==0)
  93.                                 flag=1;
  94.                 }
  95.         }
  96.         display();
  97. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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