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

📄 cloke.c

📁 51单片机电子表
💻 C
字号:

//功能:电子表,暂时只能软件设置初值

#include<reg51.h>
#include<absacc.h>

/********便于简便***************/
#define uchar unsigned char
#define uint  unsigned int
/***************这里设置程序初始化时显示的时间****************/
#define SET_HOUR 12  /*设置初始化小时*/
#define SET_MINUTE 00  /*设置初始化分钟*/
#define SET_SECOND 00  /*设置初始化秒数*/

/*************************系统地址****************************/
#define BASE_PORT 0x8000        /*选通基地址*/
#define KEY_LINE BASE_PORT+1    /*键盘行线地址*/
#define KEY_COLUMN BASE_PORT+2  /*键盘列线地址*/
#define LED_SEG BASE_PORT+4     /*数码管段选地址*/
#define LED_BIT BASE_PORT+2     /*数码管位选地址*/
#define LED_ON(X) XBYTE[LED_BIT]=(0x01<<X)   /*6位led的位选通,带参数宏,参数为0~5=""*/ 
#define LED_OFF XBYTE[LED_SEG]=0x00  /*LED显示空*/

/**************在设置模式下对秒分时的宏定义*****************/
#define SECOND 0   /*对应数码管右边两位*/
#define MINUTE 1   /*对应数码管中间两位*/
#define HOUR 2     /*对应数码管左边两位*/

/**********************全局变量声明部分*********************/
unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/
unsigned char dispbuf[6]; /*显示缓冲区数组*/
unsigned char clockstr[6]; /*时间显示的数码管编码数组*/
uint itime=0;

struct{        /*时间结构体变量*/
 uchar s;
 uchar m;
 uchar h;
 }clock={SET_SECOND,SET_MINUTE,SET_HOUR};//被赋初值

/****************以下是所有子函数的声明*********************/
void update_clockstr(void);
void clockplus(void);
void display(void);  
void update_dispbuf(unsigned char *str);
void deley(int i);


/**************************函数部分*************************/

void main(void)
{
 TMOD=0x02;  /*定时器0设置为工作方式2,基准定时250×2=500us=0.5ms*/
 TH0=(256-250);          /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/
 TL0=6;          /*定时器1中断服务留给秒表使用,产生1/100秒定时*/

        ET0=1;    //定时器0中断允许;
        EA=1;     //开cpu的中断; 
        TR0=1;

   update_clockstr();            /*初始化时钟显示编码数组*/
   update_dispbuf(clockstr);     /*初始化显示缓冲数组*/

  	while(1)
	{
	 display();
	}  
}


/**************************函数*************************/

void update_clockstr(void) /*更新时钟显示代码数组clockstr*/
{
 clockstr[0]=led[clock.s%10];  /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/
 clockstr[1]=led[(int)(clock.s/10)]; /*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/
 clockstr[2]=led[clock.m%10];  /*以下类推*/
 clockstr[3]=led[(int)(clock.m/10)];
 clockstr[4]=led[clock.h%10];
 clockstr[5]=led[(int)(clock.h/10)];
}

/**************************函数*************************/

void timer0(void) interrupt 1 using 1  /*定时器0中断服务器,用来产生1秒定时*/
{
 itime++;
 
 if(itime==2000)   /*两千次计数为1S  2000×0.5ms=1s*/
 {
   itime=0;   /*定时1s时间到,软计数清零*/
   clockplus();   /*时间结构体变量秒数加1 */
   update_clockstr();  /* 更新时间显示编码数组 */
          //if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /* 用时间编码数组更新显示缓冲区 */
 }
}

/**************************函数*************************/

 void clockplus(void)  /*时间加1s判断分,时子函数*/
{
 if(++clock.s==60)  /*秒位判断*/
 {
  clock.s=0;
 if(++clock.m==60) /*分位判断*/
 {
  clock.m=0;
  if(++clock.h==24) /*时位判断*/
  {
          clock.h=0;
          
  }
 }
 }
}

/**************************函数*************************/

void display(void)        /*刷新显示六位LED一次*/
{
 unsigned char i;
 for(i=0;i<6;i++)
 {
 LED_ON(i);   /*选通相应位*/
  XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/
                deley(50);   /*延时显示*/
  LED_OFF;   /*写LED全灭段码*/
 }
}

/**************************函数*************************/

void update_dispbuf(unsigned char *str)    /*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/
{
        dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/
        dispbuf[1]=str[1];
        dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/
        dispbuf[3]=str[3];
        dispbuf[4]=str[4]|0x80;
        dispbuf[5]=str[5];
}


/**************************函数*************************/

void deley(int i)  /*延时子函数*/
{
  while(i--);
}











⌨️ 快捷键说明

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