4322|12

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

电子钟程序问题 [复制链接]

#include
#define uchar unsigned char
#define ON 0
#define OFF 1
sbit buzz=P2^1;
sbit key_1=P1^0;
sbit key_2=P1^1;
sbit key_3=P1^2;
sbit key_4=P1^3;
uchar display_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90},
      display_sel[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},
          display_bit[8];
char time_hour,time_min,time_sec,time_count;
char alarm_hour,alarm_min,alarm_sec;
uchar mode=1;
uchar station;
uchar disp_flash,disp_bit;
unsigned int time_flash;
bit int_time_on,alarm_time_on;

void delay2ms()       
// 延时子程序
{                                               
        unsigned char i,ms=2;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}                                                                               

/*********************************
   初始化


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

void initial()
{
        EA=1;
        ET0=1;
        ET1=1;
        TMOD=0X11;

        TH0=0X3C;        //50ms
        TL0=0XB0;
       
        TH1=0Xfc;        //1ms
        TL1=0X18;

        TR0=1;
        TR1=1;

        buzz=OFF;

}
/*********************************
        键盘扫描模块




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

void key_block()
{

        if(!key_1)        //模式切换
        {
                delay2ms();
                if(!key_1)
                {
                        mode++;
                        if(mode==3) mode=1;
                        while(!key_1);
                       
                }               

         }

       
        if(!key_2)        //调整时间位切换
        {
                delay2ms();
                if(!key_2)
                {
                        station++;
                        if(station!=0)
                         TR0=0;
                        if(station==4)
                        {       
                                station=0;
                                TR0=1;
                         }
                         while(!key_2);

                 }

          }


        if(!key_3)        //加功能识别
        {
                delay2ms();
                if(!key_3)
                {
                        if(mode==1)
                        {       
                                switch(station)
                                {
                                        case 1:time_sec++;
                                                   if(time_sec==60) time_sec=0;
                                                   break;
                                        case 2:time_min++;
                                                   if(time_min==60) time_min=0;
                                                   break;
                                        case 3:time_hour++;
                                                   if(time_hour==24) time_hour=0;
                                                   break;                                      

                                        default:break;

                                 }
                           }

                         else if(mode==2)
                         {
                                 switch(station)
                                {
                                        case 1:alarm_sec++;
                                                   if(alarm_sec==60) alarm_sec=0;
                                                   break;
                                        case 2:alarm_min++;
                                                   if(alarm_min==60) alarm_min=0;
                                                   break;
                                        case 3:alarm_hour++;
                                                   if(alarm_hour==24) alarm_hour=0;
                                                   break;                                      

                                        default:break;

                                 }
                               
                          }

                          while(!key_3);

                        }                

                }


        if(!key_4)        //减功能识别
        {
                delay2ms();
                if(!key_4)
                {
                        if(mode==1)
                        {       
                                switch(station)
                                {
                                        case 1:time_sec--;
                                                   if(time_sec<0) time_sec=59;
                                                   break;
                                        case 2:time_min--;
                                                   if(time_min<0) time_min=59;
                                                   break;
                                        case 3:time_hour--;
                                                   if(time_hour<0) time_hour=23;
                                                   break;                                      

                                        default:break;

                                 }
                           }

                         else if(mode==2)
                         {
                                 switch(station)
                                {
                                        case 1:alarm_sec--;
                                                   if(alarm_sec<0) alarm_sec=59;
                                                   break;
                                        case 2:alarm_min--;
                                                   if(alarm_min<0) alarm_min=59;
                                                   break;
                                        case 3:alarm_hour--;
                                                   if(alarm_hour<0) alarm_hour=23;
                                                   break;
                                                                                         

                                        default:break;

                                 }
                               
                          }

                          while(!key_4);

                        }                

                }

}
/*********************************
        显示部分




**********************************/
void display(uchar hour,uchar min,uchar sec)
{  
        display_bit[7]=display_code[sec%10];
        display_bit[6]=display_code[sec/10];
        display_bit[5]=0xbf;
        display_bit[4]=display_code[min%10];
        display_bit[3]=display_code[min/10];
        display_bit[2]=0xbf;
    display_bit[1]=display_code[hour%10];
        display_bit[0]=display_code[hour/10];
       
}


void time_disp() interrupt 3 using 1        //1ms
{
        TH1=0Xfc;        //1ms
        TL1=0X18;
       
        time_flash++;
                if(time_flash==500)
                {
                time_flash=0;
                disp_flash++;
                if(disp_flash==2)
                disp_flash=0;
            }

                disp_bit++;
                if(disp_bit==8) disp_bit=0;

                P3=0xff;
                P0=display_bit[disp_bit];
       
                if(station)
                {       
                        if(!disp_flash)
                       
                                P3=display_sel[disp_bit];
               
                   else P3=0xff;

                       
                }
                else P3=display_sel[disp_bit];               

                       
}


/*********************************
定时模块




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

void time0() interrupt 1 using 0
{
    TH0=0X3C;        //50ms
        TL0=0XB0;

        time_count++;
        if(time_count==20)
        {
                time_count=0;
                time_sec++;
                if(time_sec==60)
                {
                        time_sec=0;
                        time_min++;
                        if(time_min==60)
                        {
                                time_min=0;
                                time_hour++;
                                if(time_hour==24) time_hour=0;
                        }
       
                 }

         }

}


/*********************************
整点报时和闹钟模块




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

void time_report()
{                  
        if((time_hour-time_sec)>0)        //闹钟鸣叫的次数与小时相等
                int_time_on=1;
        else int_time_on=0;
       
               

        if((alarm_hour==time_hour)&&(alarm_min==time_min)&&(alarm_sec==time_sec))        //

当设置的闹钟时间与当前时间相等时,启动闹钟,鸣叫1min
                alarm_time_on=0;

    if(time_min-alarm_min==1)
                alarm_time_on=0;

        if(int_time_on||alarm_time_on)
        {       
                if(!disp_flash)
                        buzz=ON;
                else
                        buzz=OFF;
        }
                  

}





void main()
{
   initial();
   while(1)
   {       
                key_block();
               
                switch(mode)
                {
                        case 1:display(time_hour,time_min,time_sec);
                                        break;
                        case 2:display(alarm_hour,alarm_min,alarm_sec);
                                        break;
                        default:break;
               
                 }

                 time_report();

        }

}
               
               
//为什么整点报时与闹钟模块达不到我想要的效果,想了一个晚上还是想不通.....是初始设置有问题么?       
               
               
               
               
                         
   

最新回复

不错,最近在搞这个东西来玩,学习了  详情 回复 发表于 2009-4-19 09:15
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
/*********************************
整点报时和闹钟模块


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

void time_report()
{   
if((time_hour-time_sec)>0) //闹钟鸣叫的次数与小时相等
int_time_on=1;
else int_time_on=0;



if((alarm_hour==time_hour)&&(alarm_min==time_min)&&(alarm_sec==time_sec)) //

当设置的闹钟时间与当前时间相等时,启动闹钟,鸣叫1min
alarm_time_on=0;

    if(time_min-alarm_min==1)
alarm_time_on=1;

if(int_time_on||alarm_time_on)
{
if(!disp_flash)
buzz=ON;
else
buzz=OFF;
}
  

}


alarm_time_on=0;改为alarm_time_on=1;

 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
把总是描述详细一点,别动不动贴一大堆代码上来,谁那么有空帮你看。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
凡是看到一大堆代码,又没有说明的,一般我都路过.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
对,贴代码要加说明,要不恶心坏了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
路过中,不仅把一大段代码贴出来,还仅仅说了一句“//为什么整点报时与闹钟模块达不到我想要的效果,想了一个晚上还是想不通.....是初始设置有问题么?”都不知道要说什么
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
贴了一大堆代码.......
进入整点报时模块的条件是否符合?是否进入了该模块?该模块执行的行为和你设想的不同?
//自己调试一下吧。定位错误。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢大家给的意见,我是新手,不足的地方我会改进的
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 3 楼 ceFighter 的回复:
凡是看到一大堆代码,又没有说明的,一般我都路过.

同感.楼主可以大致说一下自己的实现思路,这样大家才好给你建议.
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
这代码一般新手还很难 写啊,赞楼主下
引用 7 楼 xiaoQ1987 的回复:
谢谢大家给的意见,我是新手,不足的地方我会改进的
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

11
 
谢谢大家了,问题我已经解决了,由于是通宵写的,有些细节没仔细考虑清楚,所以大家不要像我这样,通宵熬夜使人思维下降啊,深有感悟........


 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
路过路过路过路过路过路过  
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

13
 
不错,最近在搞这个东西来玩,学习了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表