找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管后两位为什么不显示呢 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:572164 发表于 2019-6-25 22:07 来自触屏版 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "STC15.h"
//#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8  LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8,sheding,huan,jiaohuan,fuhao;        //LED1到LDE8对应8个数码管,顺序从左到右        ,sheding用于调节变灯闪烁时间
u8 TIME;                                                                                                                                        //huan用于红绿灯的切换

u8 code smgduan[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x01,0x40,0x08,0X49,0X00}; //前面9位显示数字,后面4位显示红绿灯交替
sbit beep=P2^0;
sbit key1=P2^1;                        //定义闪烁时间+
sbit key2=P2^2;                        //定义闪烁时间-
void delay(void)   //延时20 us        误差0 us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=7;a>0;a--);
}

void delay500us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=71;b>0;b--)
        for(a=2;a>0;a--);
}
void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void DigDisplay()
{
           /************东西时间变化***************/
                if(jiaohuan==0)                           //jiaohuan是选择交通信号灯切换
                {
                P1=0XFE;
                P0=(smgduan[LED8]|0x80);
                delay();
                P0=0X00;

                P1=0XFD;
                P0=(smgduan[LED7]);
                delay();
                P0=0X00;
          /****************************/
                P1=0X7F;        //7F
                P0=(smgduan[LED1]|0x80);
                delay();
                P0=0X00;

               
                   P1=0XBF;        //BF
                P0=(smgduan[LED2]);
                delay();
                P0=0X00;




                }
          /***********************************/
                if(jiaohuan==1)                                          //jiaohuan是选择交通信号灯切换
                {

        P1=0XFE;
                P0=(smgduan[LED8]);
                delay();
                P0=0X00;

                P1=0XFD;
                P0=(smgduan[LED7]|0x80);
                delay();
                P0=0X00;
          /****************************/
                P1=0X7F;
                P0=(smgduan[LED1]);
                delay();
                P0=0X00;

               
                   P1=0XBF;                  //BF
                P0=(smgduan[LED2]|0x80);
                delay();
                P0=0X00;



                }
         

           /***************东西红 黄 绿**********************/
                P1=0XFB;
                P0=smgduan[LED6];
                delay();
                P0=0X00;

           /***************东西红 黄 绿**********************/
                P1=0XDF;
                P0=(smgduan[LED3]);
                delay();
                P0=0X00;


}


void Timer0Init()
{
        TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
        TH0=0XD8;        //给定时器赋初值,定时10ms
        TL0=0XF0;        
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器                        
}

void beep_up()
{
          u8 i;
          for(i=0;i<10;i++)
          {
                   beep=~beep;
                   delay500us();
          }
          beep=1;

}


void timer_calculate() //时钟计算函数
{
        /********************************************/
         TIME--;  //定时用
         fuhao=3;                  //黄灯亮前三秒闪

         LED7=TIME%10;
         LED8=TIME/10;

          LED1=LED7;
          LED2=LED8;               

            if(TIME==0)
           {
                     TIME=60;
                   jiaohuan=!jiaohuan;
           }
               


           if(TIME==2)
           {

                             LED6=17;
                  LED3=17;
           }


  /*****************************************/

        
         
         

        

/**********************************************/
   
        if(TIME<=sheding)
        {
           if(TIME>=fuhao)
           {
                  huan=!huan;
                if(jiaohuan==1)
                {
           switch(huan)
         {
           case 0:        LED6=18; LED3=16;break;
           case 1:  LED6=20; LED3=20;break;
        
         }
          }

                        if(jiaohuan==0)
                {
           switch(huan)
         {
           case 0:        LED6=16; LED3=18;break;
           case 1:  LED6=20; LED3=20;break;
        
         }
          }



         
            

        }
        }
/************************************************/

         
                  
/*****************************************/
         
           if(TIME==60)
           {
                   beep_up();
                        if(jiaohuan==0)
                {
                    LED6=16;
                LED3=18;
               
                }

           if(jiaohuan==1)
           {
           LED6=18;
           LED3=16;
           }
                  
        
               
           }

               
                        
}






void key_button()
{
        if(key1==0)
        {
           delay10ms();
           if(key1==0)
           {
                    sheding++;                     
           }

        
        }
        while(key1==0);

          if(key2==0)
        {
           delay10ms();
           if(key2==0)
           {
                     sheding--;
              
           }

        }
        while(key2==0);

         if(sheding<=0||sheding>=56)sheding=10;                   //固定按键设定范围

}

void main()
{        
        Timer0Init();
        key1=1;
        key2=1;
          LED1=9;// 秒针第一位,初始化
        LED2=5;// 秒针第二位,初始化
        LED4=0;// 分针第一位,初始化
        LED5=0;// 分针第二位,初始化
        LED7=9;// 时针第一位,初始化
          LED8=5;// 时针第二位,初始化
    LED6=16;
        LED3=18;
         jiaohuan=0;
         TIME=59;
         sheding=10;
         huan=0;
         
        P0M1=0X00;
         P0M0=0X00;
         P1M0=0X00;
         P0M0=0X00;        
         
        while(1)
        {        
               
        DigDisplay();  //数码管显示函数        
        // dengzhuan();
         key_button();


        }               
}


void Timer0() interrupt 1
{
        static u16 i=0;
        TH0=0XD8;        //给定时器赋初值,定时10ms
        TL0=0XF0;
        i++;
        if(i==100)
        {
               
                i=0;
        
          timer_calculate(); //时钟计算函数

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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