打印

电子时钟程序—小弟刚入门,请各位前辈给点评论,万分感

[复制链接]
1634|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lian198611|  楼主 | 2008-6-9 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************************************************************************/
/**************************************模拟电子表程序*************************************************/
/**本程序对应的硬件连接:八个数码管接在P0口,选通引脚接在P2口,都为低电平有效。KEY1,KEY2,KEY3, 三个按键*/
/*                      分别接在P3.4,P3.5,P3.6 。P3.7接蜂鸣器*******************************************/
/**程序功能:本程序可模拟电子表在数码管上显示,并且有闹铃功能,在显示正常时间情况下按下KEY1即可进入闹铃设置*/
/*           界面设置好后再按KEY1又可回到正常显示时间,KEY2,KEY3分别为调整时分按键****************************/
/                                                                                  ******/
/*编写日期:2008年5月17日******************************************************************************/
/*********************************************************************************************************/
/*********************************************************************************************************/
/*********************************************************************************************************/
/*********************************************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//定义各个数字对应的引脚值
uchar b[]={0xf7,0xef,0xdf,0xbf,0x7f};                          //显示闹铃设定时的引脚值
uint i=0;
uchar j=0;
uchar k=0;                                                    //全局变量
uchar s=0;//*****************************************************秒    
uchar m=0;//*****************************************************分
uchar h=0;//*****************************************************时
uchar sh=0;      
uchar sl=0; //*************************************秒高位,秒低位
uchar mh=0;      
uchar ml=0; //*************************************分高位,分低位
uchar hh=0;      
uchar hl=0; //*************************************时高位,时低位
uchar hd=0;//*************************************************闹铃时uchar md=0;//**************************************************闹铃分uchar mdh=0;     
uchar mdl=0;//*************************************闹铃分高位,分低位
uchar hdh=0;      
uchar hdl=0;//*************************************闹铃时高位,时低位
sbit KEY1=P3^4;                    //用于切换显示
sbit KEY2=P3^5;                    //调整时
sbit KEY3=P3^6;                    //调整分
sbit P17=P1^7;                     //蜂鸣器引脚

uint n;
bit d;                    //显示标志值

main()
{

 TMOD=0x22;//****************************************八位自动重装定时

 TH0=0x06;
 TL0=0x06;
 TH1=0x06;
 TL1=0x06;//**********************************************定时250us
 ET1=1;
 ET0=1;
 EA=1;    //*********************************************开中断
 TR0=1;
 TR1=1;    // 开始计时
 P2=0xfe;//扫描初值


while(1) //主循环
{
  if(!KEY2)                     //调时
 {for(n=0;n<15000;n++);
  h++;
  if(h==24) h=0;
  s=0;
  }
 
 
 if(!KEY3)                    //调分
 {for(n=0;n<15000;n++);
  m++;
  if(m==60) m=0;
  s=0;
  }
  
  
   if(!KEY1)                 //检测按键1
  {
   for(n=0;n<1000;n++);
   while(!KEY1);
   for(n=0;n<1000;n++);
   d=1;
   
   while(1)             //如果按下1键则进入闹铃调整循环  
    {
    if(!KEY2)                 //调整时
     {
      for(n=0;n<15000;n++);
      hd++;
      if(hd==24) hd=0;
      hdh=hd/10;
      hdl=hd%10; 
      }
     
     if(!KEY3)               //调整分
     {
      for(n=0;n<15000;n++);
      md++;
      if(md==60) md=0;
      mdh=md/10;
      mdl=md%10;
      }
     
    if(!KEY1)        //如果再按下1键则跳出闹铃调整循环
    {
     for(n=0;n<1000;n++);
     while(!KEY1);
     for(n=0;n<1000;n++);
    d=0;
    break;              //跳出
     }
    
  }      
 }
  
  
  if((hd==h)&&(m==md)) //如果时间与设定的闹铃相等 蜂鸣器响
   {
    P17=~P17;
    for(n=0;n<1000;n++);       //方波的频率设置
   }
  else P17=1;
  

 }
}
/*********************************************************************************************************/
//                                         计时中断函数
//功能描述:每到计时时间,更新一次秒,分,时的值,并更改对应的分秒时高地位的值。
/*********************************************************************************************************/
void times(void) interrupt 1  // 定时器0中断服务函数
{    
    if(++i==4000)
    {i=0;s++;}             //4000*250us=1s
    while(s==60)
    {++m;s=0;}        // 秒更新
    sh=s/10;
    sl=s%10;
    while(m==60)    //分更新
    {++h;m=0;} 
    mh=m/10;
    ml=m%10;
    while(h==24)  //时更新
    {h=0;}
    hh=h/10;
    hl=h%10; 
 }
/*********************************************************************************************************/
//                                        扫描中断函数
//功能描述:此中断函数由定时器1定时,每中断一次更换一次,选通值,并更换相应的显示数值。
//
//
/*********************************************************************************************************/
void dis(void) interrupt 3     //扫描中断函数
{
  while(++j==10)
  {
  j=0;
  if(d)//当显示标志为1时,进入闹铃调整界面
  {
   P2=b[k++];
   if(k==5)           //只让前五个数码管显示
   k=0;
   switch(P2)
        {
     case 0xf7: P0=a[mdl];break;
     case 0xef: P0=a[mdh];break;
     case 0xdf: P0=a[10];break;
     case 0xbf: P0=a[hdl];break;
     case 0x7f: P0=a[hdh];break;  //对应位的显示数字 
         }
   }
  
  
  else        //当显示标志为0时,进入正常时间显示
   {
   P2=(P2<<1)|(P2>>7);      //选通引脚循环右移
   switch(P2)
         {
     case 0xfe: P0=a[sl];break;
     case 0xfd: P0=a[sh];break;
     case 0xfb: P0=a[10];break;
     case 0xf7: P0=a[ml];break;
     case 0xef: P0=a[mh];break;
     case 0xdf: P0=a[10];break;
     case 0xbf: P0=a[hl];break;
     case 0x7f: P0=a[hh];break;     //对应位的显示数字
     }
   }
  }
}

相关帖子

沙发
OUCHANGHUA| | 2010-8-4 16:35 | 只看该作者
怎么没人顶的,,呵呵我是迟来的

使用特权

评论回复
板凳
sccky| | 2010-8-5 11:21 | 只看该作者
写的不错的程序哦?学习了.
:lol

使用特权

评论回复
地板
一棵小草| | 2010-8-5 15:11 | 只看该作者
恩,很不错,继续努力。

另外,建议找个,C语言编辑规范,参考参考,把格式弄清晰些。
找本书,研究一下程序结构,算法结构

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝