⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex9_1.c

📁 单片机应用技术(C语言版)程序源代码.rar
💻 C
字号:
//***************************数字钟程序********************************//
//程序:ex9_1.c
//功能:数字钟程序
//****************************编译预处理语句****************************//
#pragma  SMALL
#include  "REG51.H"
#include  "absacc.h"
//******************************函数声明*******************************//
void display(unsigned char *p);		//6位LED扫描函数,指针p为显示数据区首地址
unsigned char keytest();    	   	//测试键盘有无键按下
unsigned char search();    	   	//键盘扫描程序
void  alarm();  			//闹钟程序
void  ftion0();  			//时钟修改程序
void  ftion1();  			//闹钟修改程序
void  cum();   				//增1程序
//********************************端口定义******************************//
sbit  P2_7=P2^7;    			//定义蜂鸣器控制端口
//*******************************全局变量定义***************************//                          
unsigned char  clockbuf[3]={0,0,0}; 	// 存放时分秒的十进制数
unsigned char  bellbuf[3]={0,0,0};  	// 存放闹钟时分秒的十进制数
unsigned char  msec1;      		// 10毫秒中断次数
unsigned char  msec2;      		// 1秒循环次数
unsigned char  timdata,rtimdata;    	// 时钟和闹钟修改位置标志
unsigned char  count;             	// 闹钟启动后10秒计时单元
unsigned char  *dis_p;            	// 显示缓冲区指针
bit  armbit;        			//闹钟标志,armbit=0,闹钟没有设定,armbit=1,闹钟已设定
bit  rtimbit;	   			//闹钟是否启动标志,rtimbit=1,闹钟已启动
bit  rhourbit;      			//闹钟小时修改标志,rhourbit=1,正在修改闹钟小时
bit  rminbit;       			//闹钟分修改标志,rminbit=1,正在修改闹钟分钟
bit  hourbit;       			//时钟小时修改标志,hourbit=1,正在修改时钟小时
bit  minbit;		   		//时钟分修改标志,minbit=1,正在修改时钟分钟
bit  secbit;		   		//时钟秒修改标志
//*********************************主函数********************************//
void main()
{
   unsigned char a;
   armbit=0;            	//清零闹钟标识位
   msec1=0;         		//设置10毫秒中断次数初值
   msec2=0;         		//设置1秒中断次数初值
   timdata=0;       		//时钟内容修改位置记忆单元清零
   rtimdata=0;      		//闹钟内容修改位置记忆单元清零
   count=0;          		//闹钟启动后保持10秒计时单元清零
   TMOD=0x02;     		//初始化定时器,定时器T0方式2
   TL0=0x06;        		//定时250μs初始值
   TH0=0x06;
   EA=1;			//中断允许控制断
   ET0=1;			//定时器1开中断
   TR0=1;  			//启动定时器0                      
   dis_p=clockbuf;   		//将时钟值所在地址送入显示指针
   while(1)
   {    
      a=keytest();	   	//调用判别键入测试程序
      if(a==0x0f)
      { 
         display(dis_p);	//无键输入调用显示程序
      	 if(armbit==1)alarm();  //判别闹钟设定否,若设定了,则调闹钟程序
      }														  
      else
      {
         display(dis_p);	//调用显示程序作为延时去抖动
         a=keytest();	          
         if(a!=0x0f)   	   	// 没有抖动,则表示有键按下
         {
             a=search();        // 调用键号测试程序
             switch (a) {
                 case  0x00:ftion0();break;    //是时钟参数修改功能键,调用时钟修改
                 case  0x01:ftion1();break;    //是闹钟参数修改功能键,调用闹钟设定
                 case  0x02:cum();break;       //是加1功能键,则调用加1修改程序
                 default:break;   }
         }
      }
   }
 }
//****************************6位LED扫描函数**************************/
//函数名:display
//函数功能:6位LED扫描函数
//形式参数:指向时、分、秒计时单元数据首地址的指针
//返回值:无
void display(unsigned char *p)
{
  unsigned char  buffer[]={0,0,0,0,0,0};
  unsigned char  k,i,j,m,temp;
  unsigned char  led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 	// 0-9的显示码
  buffer[0]=p[0]/10;			// 将缓冲区中的数的十位和个位分开
  buffer[1]=p[0]%10;
  buffer[2]=p[1]/10;
  buffer[3]=p[1]%10;
  buffer[4]=p[2]/10;
  buffer[5]=p[2]%10;
  for(k=0;k<3;k++)
  {
     temp=0x01;
     for(i=0;i<6;i++)
     { 
 	P1=0xff;       			//关显示
 	j=buffer[i];
  	P1=led[j];     			//P1送段码
  	P0&=~temp;     			//P0对应端口低电平选位
        temp<<=1;
        for(m=0;m<100;m++);  		//每一位显示延时
     }
  }
}
//*****************************键盘测试函数*************************//
//函数名:keytest
//函数功能:6位LED扫描函数
//形式参数:读出行输入按键状态码,用于测试是否有按键按下
//返回值:键盘行输入按键状态码,unsigned char类型
unsigned char keytest()
{
   unsigned char c;
   P0=0xf0;
   c=P2;
   c=c&0x07;                		//按键行输入为P2.0~P2.2,屏蔽无关位
   return(c);
}
//****************************扫描键盘得到键值函数*********************//
//函数名:search
//函数功能:键盘扫描函数
//形式参数:无
//返回值:行列式按键的键码,unsigned char类型
unsigned char search()
{
   unsigned char a,b,c,d,e;
   c=0xfe;     					//首列扫描字送变量c
   a=0;        					//首列号送a
   while(1)
   {
       P0=c;     				//列扫描字送P0口
       d=P2;	    				//读入P2口的行状态
       if(d&0x01==0){  b=0;break;}      	//第0行有键按下,第0行行首号送b
          else if(d&0x02==0){ b=4;break;}  	//第1行有键按下,第1行行首号送b
             else if(d&0x04==0){ b=8;break;} 	//第2行有键按下,第1行行首号送b
       a++;   					//扫描列号加1
       c<<=1; 
       c++;   					//修改列扫描字,扫描下一列
   }
   c=a+b;      					//将行首号与列号相加,求键号
   do {
        display(dis_p);
      } while((d=keytest())!=0x07);   		//等待释放按键
   return(c);
}
//*******************************闹钟函数******************************//
//函数名:alarm
//函数功能:启动闹钟10秒
//形式参数:无
//返回值:无
void alarm()
{
   if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1]))
   {
      P2_7=0;
      rtimbit=1;        			//设置闹钟计时标志,时钟将进行10秒计时志
   }
   else
   {
      if(count==10) 				//判断闹钟保持10秒时间到否
      { 
         count=0;    				//清除闹钟保持10秒计时
         P2_7=1;     				//清除闹钟
         armbit=0;   				//清闹钟标识,否则闹钟设置将继续保持有效
         rtimbit=0;
      }
   }
}
//*******************时钟修改函数*****************//
//函数名:ftion0
//函数功能:时钟修改,根据按键次数,修改时、分、秒修改标志全局变量
//形式参数:无
//返回值:无
void ftion0()
{
   TR0=0;         				// 关定时器
   rhourbit=0;      				// 禁止闹钟时间参数修改,清闹钟修改标识
   rminbit=0;     
   dis_p=clockbuf;  				// 将时钟缓冲区首地址送显示指针
   rtimdata=0;      				// 清闹钟修改位置标识记录
   timdata++;      	 			// 将时钟修改记录值加1
   switch (timdata) {
       case 0x01:secbit=1;break;    		//记录值为1,则将时钟秒修改标识置1
       case 0x02:secbit=0;minbit=1;break;   	//记录值为2,则将时钟分修改标识置1
       case 0x03:minbit=0;hourbit=1;break;	//记录值为3,则将时钟时修改标识置1
       case 0x04:timdata=0;hourbit=0;TR0=1;break; //按4次则清时钟单元修改位置记录,定时器重新启动
       default:break;
                    }
}
//*******************************闹钟修改函数*************************//
//函数名:ftion1
//函数功能:闹钟修改,根据按键次数,修改时、分修改标志全局变量
//形式参数:无
//返回值:无
void ftion1()
{
  secbit=0;        			   	//禁止时钟时间修改
  minbit=0;
  hourbit=0;
  dis_p=bellbuf;    				//设置闹钟显示标志
  timdata=0;                   			//清时钟修改位置标识记录
  rtimdata++;                  			//将闹钟修改记录值加1
  switch (rtimdata)
  {
     case 0x01:rminbit=1;break;			//若记录值为1,则将闹钟分修改标识置1
     case 0x02:rminbit=0;rhourbit=1;break;	//记录值为2,则将时钟分修改标识置1
     case 0x03:rtimdata=0;rhourbit=0; 		// 若按3次则清闹钟单元修改位置记录
               armbit=1;              		// 设置闹钟已设定标志位
               dis_p=clockbuf;        		// 恢复时钟显示标志
               break;   
     default:break;
  }
}
//************************************增1函数***************************//
//函数名:cum
//函数功能:根据标志位对相应时、分、秒单元增1
//形式参数:无
//返回值:无
void cum()
{
   if(secbit==1)                		// 若时钟秒修改标识为1则秒单元内容加1
   {
      if(clockbuf[2]==59) clockbuf[2]=0; 
      else  clock buf[2]++;         
   }
   else  if(minbit==1)			        // 若时钟分修改标识为1则分单元内容加1
   {
       if(clockbuf[1]==59)clockbuf[1]=0;
          else clockbuf[1]++;
   }
   else  if(hourbit==1)				// 若时钟小时修改标识为1则小时单元内容加1
   {
       if(clockbuf[0]==23)clockbuf[0]=0;
          else clockbuf[0]++;
   }
   else  if(rminbit==1)				// 若闹钟分修改标识为1则分单元内容加1
   {
       if(bellbuf[1]==59)bellbuf[1]=0;
          else bellbuf[1]++;
   }
   else  if(rhourbit==1)
   {            			// 闹钟小时修改标识为1则小时单元内容加1
       if(bellbuf[0]==23)bellbuf[0]=0;
          else bellbuf[0]++;
   }            
}
//***************************定时器0中断函数****************************/    
//函数名:clock
//函数功能:定时器T0定时中断,interrupt 1
//形式参数:无
//返回值:无
void clock()  interrupt 1
{  
   EA=0;                          	//关中断
   if(msec1!=0x28)
       msec1++;                 	//到10毫秒否,不到则msec1加1
   else
   {
        msec1=0;
        if(msec2!=100)msec2++;    	//到1秒否,不到则msec2加1
        else
        {
           if(rtimbit==1)count++;
       	   msec2=0;
           if(clockbuf[2]!=59)
               clockbuf[2]++;       	//到1分否,不到则clockbuf[2]加1
           else
           {
              clockbuf[2]=0;
              if(clockbuf[1]!=59)
                   clockbuf[1]++;   	// 到1小时否,不到则clockbuf[1]加1
              else
              {
                  clockbuf[1]=0;
                  if(clockbuf[0]!=23)
                       clockbuf[0]++;   // 到24时否,不到则clockbuf[0]加1 
                  else clockbuf[0]=0;
              }
           }
        }
    }
    EA=1;                               //开中断
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -