找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机程序 为啥我蜂鸣器响的时候数码管不能正常显示,还有这个按键需要长按才能用?

  [复制链接]
跳转到指定楼层
楼主
ID:1057946 发表于 2023-2-26 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REGX52.H>
#include "Delay.h"
#include "Buzzer.h"

unsigned int hour=12,min=1,sec=0,day=27,month=2,year=2022,year_1=20,year_2=22;  //对时分秒日月年进行定义和赋值
unsigned int week=1,b=30,i=1,c=0,d=0,e=0,f,g,h=0,k=0,l=0,p,q,z=13;   //星期,b为二月计数,其他均为用来计数,
unsigned int N1hour=12,N1min=1,N1miao=0,N2hour=0,N2min=0,N2miao=0;//闹钟的时分秒
unsigned int Timer0Count=0;   //定时器设定为没10毫秒打断一次,当目的是每1秒钟让秒数加一,就让定时器打断100次,总时长为1秒,
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x01,0x08,0x09,0x00};//最后一个显示空后三个为定时器标志

void shijian()//防止调时溢出
{
          if(hour==25)
            hour=1;
    if(hour==0)
      hour==24;
         if(min==61)
            min=1;
         if(min==0)
            min=60;
         if(week==8)
            week=1;
         if(week==0)
            week=7;
         if(month==13)
            month=1;
         if(month==0)
            month=12;
         if((year%4==0)&&(year%100!=0)||(year%400==0))
         {
     if(day==30)
                         day=1;
                 if(day==0)
                         day=29;
         }
         else
         {
     if(day==29)
                         day=1;
                 if(day==0)
                         day=28;
         }
}

void runnian(void)//判断闰年及二月变化
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
{
  if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
  b=31;
  if((month==4)||(month==6)||(month==9)||(month==11))
  b=30;
  if(month==2)
  b=29;
}
else
{
  if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
  b=31;
  if((month==4)||(month==6)||(month==9)||(month==11))
  b=30;
  if(month==2)
  b=28;
}
}
void NixieTube(unsigned char Location,Number)//数码管位选段选
{
        switch(Location)
        {
                case 1:P2_4=1;P2_3=1;P2_2=1;break;
                case 2:P2_4=1;P2_3=1;P2_2=0;break;
                case 3:P2_4=1;P2_3=0;P2_2=1;break;
                case 4:P2_4=1;P2_3=0;P2_2=0;break;
                case 5:P2_4=0;P2_3=1;P2_2=1;break;
                case 6:P2_4=0;P2_3=1;P2_2=0;break;
                case 7:P2_4=0;P2_3=0;P2_2=1;break;
                case 8:P2_4=0;P2_3=0;P2_2=0;break;
        }
        P0=NixieTable[Number];
        Delay(1);
        P0=0x00;
}
void Timer0_Init(void)  //10毫秒@11.0592MHz
{
TMOD &= 0xF0;  //设置定时器模式
TMOD |= 0x01;  //设置定时器模式
TL0 = 0x00;  //设置定时初值
TH0 = 0xDC;  //设置定时初值
TF0 = 0;  //清除TF0标志
TR0 = 1;  //定时器0开始计时
ET0=1;        //中断初始化
EA=1;     //中断初始化
PT0=0;    //中断初始化
}
void main()
{
Timer0_Init();          //定时器初始化
        runnian();
while(1)            
{
         if(P3_3==0)//界面切换判断
         {
           Delay(20);
                 while(P3_3==0);
                 Delay(20);
                 i++;
                 if(i>=4)
                         i=1;
         }
                                 if(N1hour==hour&&N1min==min&&z==10||z==12)//闹钟1到时响
                           {
                                   Buzzer(10);
                                   if(P3_0==0||P3_1==0||P3_2==0||P3_3==0) N1min=0;//任意按键按下闹钟关闭
                           }
                          if(N2hour==hour&&N2min==min&&z==11||z==12)//闹钟2到时响
                           {
                                   Buzzer(10);
                                   if(P3_0==0||P3_1==0||P3_2==0||P3_3==0) N2min=0;//任意按键按下闹钟关闭
                     }
         if(i==1)//时分秒<主界面>
          {
                         NixieTube(1,hour/10);
                         NixieTube(2,hour%10);
                         NixieTube(3,min/10);
                         NixieTube(4,min%10);
                         NixieTube(5,sec/10);
                         NixieTube(6,sec%10);
                         NixieTube(7,z);
                         NixieTube(8,week);
                                if(P3_1==0)
                                        {
                                          Delay(20);while(P3_1==0);Delay(20);c=c+1;h=h+1;//按键1按下进入调时 c为调时位置 h为调时位置转换
                                while(1)
                                        {  
             if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);c=c+1;h=h+1;}//按键1按下计数调时
                switch(c)
                             {
                                 case 1://秒调时
                                                if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);sec=0;}
                                                for(f=0;f<=50;f++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}
                                                for(g=0;g<=50;g++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,13);
             NixieTube(6,13);
                               NixieTube(7,z);
                               NixieTube(8,week);}f=0;g=0;if(h==2) {h=0;}break;
                                 case 2://分调时
                                                if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);min=min+1;}shijian();
                                                if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);min=min-1;}shijian();
                                                for(f=0;f<=50;f++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}
                                                for(g=0;g<=50;g++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,13);
                               NixieTube(4,13);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
                                 case 3://时调时
                                          if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);hour=hour+1;}shijian();
                                                if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);hour=hour-1;}shijian();
                                                for(f=0;f<=50;f++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}
                                                for(g=0;g<=50;g++)
                                                { NixieTube(1,13);
                               NixieTube(2,13);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
                                        case 4://星期调时
                                          if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);week=week+1;}shijian();
                                                if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);week=week-1;}shijian();
                                                for(f=0;f<=50;f++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}
                                                for(g=0;g<=50;g++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,13);}f=0;g=0;if(h==1){ h=0;}break;
                                                 case 5://闹钟开关
                                            if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);p++;}
                                                  if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);q++;}
                                                  if(p==1) z=10;//闹钟一标志位
                                                  if(p==2) z=13;
                                                  if(q==1) z=11;//闹钟二标志位
                                                  if(q==2) z=13;
                                                  //if(p==1&&q==1) z=12;
                                                        if(p>=3) p=1;
                                                        if(q>=3) q=1;
                                                for(f=0;f<=50;f++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,z);
                               NixieTube(8,week);}
                                                for(g=0;g<=50;g++)
                                                { NixieTube(1,hour/10);
                               NixieTube(2,hour%10);
                               NixieTube(3,min/10);
                               NixieTube(4,min%10);
                               NixieTube(5,sec/10);
             NixieTube(6,sec%10);
                               NixieTube(7,13);
                               NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
                         }
                                                 if(c>=6) c=1;//防溢出
                              if(P3_3==0) break;//退出死循环
                 }
          }
         }
                if(i==2)//年月日显示
          {
                         NixieTube(1,year_1/10);
                         NixieTube(2,year_1%10);
                         NixieTube(3,year_2/10);
                         NixieTube(4,year_2%10);
                         NixieTube(5,month/10);
                         NixieTube(6,month%10);
                         NixieTube(7,day/10);
                         NixieTube(8,day%10);
                        if(P3_1==0)
                                {
                                        Delay(20);while(P3_1==0);Delay(20);d=d+1;e=e+1;//年月日调节 d,e与c,h作用相同
                                  while(1)
                                    {
              if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);d=d+1;e=e+1;}
                                switch(d)
                                {
                                        case 1://年调时
                                                if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);year_2=year_2+1;}
                                                if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);year_2=year_2-1;}
                                                        for(f=0;f<=50;f++)
                                                        { NixieTube(1,year_1/10);
                                 NixieTube(2,year_1%10);
                                 NixieTube(3,year_2/10);
                                 NixieTube(4,year_2%10);
                                                         NixieTube(5,month/10);
                                 NixieTube(6,month%10);
                                 NixieTube(7,day/10);
                                 NixieTube(8,day%10);}
                                                        for(g=0;g<=50;g++)
                                                        { NixieTube(1,13);
                                 NixieTube(2,13);
                                 NixieTube(3,13);
                                 NixieTube(4,13);
                                                         NixieTube(5,month/10);
                                 NixieTube(6,month%10);
                                 NixieTube(7,day/10);
                                 NixieTube(8,day%10);}f=0;g=0;if(e==2) h=0;break;
                                        case 2://月调时
                                                if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);month=month+1;}shijian();
                                                if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);month=month-1;}shijian();
                                                        for(f=0;f<=50;f++)
                                                        { NixieTube(1,year_1/10);
                                 NixieTube(2,year_1%10);
                                 NixieTube(3,year_2/10);
                                 NixieTube(4,year_2%10);
                                                         NixieTube(5,month/10);
                                 NixieTube(6,month%10);
                                 NixieTube(7,day/10);
                                 NixieTube(8,day%10);}
                                                        for(g=0;g<=50;g++)
                                                        { NixieTube(1,year_1/10);
                                 NixieTube(2,year_1%10);
                                 NixieTube(3,year_2/10);
                                 NixieTube(4,year_2%10);
                                                         NixieTube(5,13);
                                 NixieTube(6,13);
                                 NixieTube(7,day/10);
                                 NixieTube(8,day%10);}f=0;g=0;if(e==1) h=0;break;
                                        case 3://日调时
                                                if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);day=day+1;}shijian();
                                                if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);day=day-1;}shijian();
                                                        for(f=0;f<=50;f++)
                                                        { NixieTube(1,year_1/10);
                                 NixieTube(2,year_1%10);
                                 NixieTube(3,year_2/10);
                                 NixieTube(4,year_2%10);
                                                         NixieTube(5,month/10);
                                 NixieTube(6,month%10);
                                 NixieTube(7,day/10);
                                 NixieTube(8,day%10);}
                                                        for(g=0;g<=50;g++)
                                                        { NixieTube(1,year_1/10);
                                 NixieTube(2,year_1%10);
                                 NixieTube(3,year_2/10);
                                 NixieTube(4,year_2%10);
                                                         NixieTube(5,month/10);
                                 NixieTube(6,month%10);
                                 NixieTube(7,13);
                                 NixieTube(8,13);}f=0;g=0;if(e==1) h=0;break;
                                }
                                if(d>=4) d=1;if(P3_3==0) break;
                        }
                 }
          }
                if(i==3)//闹钟显示模块
          {
                         NixieTube(1,N1hour/10);
                         NixieTube(2,N1hour%10);
                         NixieTube(3,N1min/10);
                         NixieTube(4,N1min%10);
                         NixieTube(5,N2hour/10);
                         NixieTube(6,N2hour%10);
                         NixieTube(7,N2min/10);
                         NixieTube(8,N2min%10);
                          if(P3_1==0)
                                        {
                                          Delay(20);while(P3_1==0);Delay(20);k=k+1;l=l+1;
                                  while(1)
                                         {
             if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);k=k+1;l=l+1;}//k,l与c,h作用相同
                                   switch(k)
                                          {
                                                case 1://时钟1调时
                                                        if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N1hour=N1hour+1;}
                                                  if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N1hour=N1hour-1;}
                                                        for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}
                                                        for(g=0;g<=50;g++)
                                                        {NixieTube(1,13);
                                NixieTube(2,13);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}f=0;g=0;if(l==2) l=0;break;
                                                case 2://时钟1调分
                                                 if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N1min=N1min+1;}
                                                 if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N1min=N1min-1;}
                                                 for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}
                                                   for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,13);
                                NixieTube(4,13);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}f=0;g=0;if(l==1) l=0;break;
                                                case 3://时钟2调时
                                                 if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N2hour=N2hour+1;}
                                                 if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N2hour=N2hour-1;}
                                           for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}
                                                        for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,13);
                                NixieTube(6,13);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}f=0;g=0;if(l==1) l=0;break;
                                                case 4://时钟2调分
                                                        if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N2min=N2min+1;}
                                                  if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N2min=N2min-1;}
                                                        for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,N2min/10);
                                NixieTube(8,N2min%10);}
                                            for(f=0;f<=50;f++)
                                                        {NixieTube(1,N1hour/10);
                                NixieTube(2,N1hour%10);
                                NixieTube(3,N1min/10);
                                NixieTube(4,N1min%10);
                                NixieTube(5,N2hour/10);
                                NixieTube(6,N2hour%10);
                                NixieTube(7,13);
                                NixieTube(8,13);}f=0;g=0;if(l==1) l=0;break;
                                        }if(k>=5) k=1;if(P3_3==0) break;
                                }
                        }
          }
  }   
}
void Timer0_Routine() interrupt 1  //中断
{
TL0 = 0x00;            //设置定时初值,让定时器重新开始计时   
TH0 = 0xDC;            //设置定时初值
Timer0Count++;          //每10ms打断一次,计数器加1
if(Timer0Count>=100)       //当计数器到100,即经过1秒后让秒加一,然后时分做出响应变化
{
  Timer0Count=0;
  sec++;
  if(sec>=60)
   {
    min++;
    sec=0;
    if(min>=60)
    {
     hour++;
     min=0;
     if(hour>=24)
     {
                         day++;c++;
       hour=0;
                         runnian();
                         if(day>=b)
                         {
                                 month++;
                                 day=1;
                                 if(month>=13)
                                 {
                                         year++;
                                         month=1;
                                 }
                         }
     }
    }
   }
         if(c>=7)
         {
                 week=week+1;
                 c=0;
                 if(week>=8)
                 {
                         week=1;
                 }
         }
  }
}

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

使用道具 举报

沙发
ID:584814 发表于 2023-2-27 08:20 | 只看该作者
问:单片机程序 为啥我蜂鸣器响的时候数码管不能正常显示,还有这个按键需要长按才能用?
答:程序有错
问:能回答得细一点么 ?
答:设计意图不明,电路不明,程序是否全且关键地方都有注释 ....... 只能算命式回答。
回复

使用道具 举报

板凳
ID:332444 发表于 2023-2-27 08:43 | 只看该作者
时间安排问题,独占计数延时问题
回复

使用道具 举报

地板
ID:161164 发表于 2023-2-27 10:05 | 只看该作者
代码结构混乱
显示影响按键
按键影响显示
蜂鸣器影响按键
蜂鸣器影响显示
乱用while(1)break
乱用delay

建议学习一下框架式编程
回复

使用道具 举报

5#
ID:996773 发表于 2023-2-28 10:32 | 只看该作者
虽然看不懂c语言,但猜到哪里错误,延时给了蜂鸣器,破坏了显示单元逐个显示的条件,

也占用了按键查询的时间,典型的新手写的代码,在论坛也久了,发现会高级c语言的不一

定懂得比用汇编的人多,编程更像是艺术,如何分配单片机资源,让单片机什么时候干什么

事需要艺术一样的头脑去筹划,而不是简单的搭积木,楼主修行之路得慢慢走,细心走

回复

使用道具 举报

6#
ID:938151 发表于 2023-2-28 10:38 | 只看该作者
while()时延那里写的不对
回复

使用道具 举报

7#
ID:1013784 发表于 2023-2-28 15:12 | 只看该作者
可能蜂鸣器占线了,
回复

使用道具 举报

8#
ID:1057946 发表于 2023-2-28 15:52 | 只看该作者
hi等你 发表于 2023-2-28 10:32
虽然看不懂c语言,但猜到哪里错误,延时给了蜂鸣器,破坏了显示单元逐个显示的条件,

也占用了按键查询 ...

感谢前辈指导
回复

使用道具 举报

9#
ID:123289 发表于 2023-3-1 14:41 | 只看该作者
很我简单:只要你不用DELAY()函数就行了。你能做到吗?100%灵!!!
回复

使用道具 举报

10#
ID:1075402 发表于 2024-1-9 11:18 | 只看该作者
用延时容易出问题
回复

使用道具 举报

11#
ID:108361 发表于 2024-1-10 14:31 | 只看该作者
给个建议,蜂鸣器任务不要用死循环delay,用定时器中断;扫描按键,扫描显示数码管,都做成周期性任务轮训,不能用while(1)阻塞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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