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

📄 ex5-1.c

📁 这是一个使用8051制作的数字时钟,使用2个弹跳按钳和4个共阳七段显示器组合而成.
💻 C
字号:
/*
标题:范例 5-1
版本:1.0
Target:89S51
程序描述:这个范例说明如何使用8051 的Port 1连接到四颗七段显示器,PORT 0的低4位分别控制这四颗共阳七段显示器,让四颗共阳七段显示器使用扫描的方式轮流显示数字。这四颗七段显示器将显示出自数字时钟PORT 2的P2.0和P2.1分别连接到2个弹跳按钮。*/
/* ***************************************************** */
#include <REGX51.H>
#define   TIMER0_COUNT 0xEE18 
                            /*10000h-(12,000,000/(12*200)) */
#define   TRUE            1
#define   FALSE           0
#define   TIMES          25
#define   DISPLAY         0
#define   SET             1
const seven_seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
              0X80,0X90};const scan[4]={0X0E,0X0D,0X0B,0X07};
typedef struct { 
          char    hour;
          char    minute;
          char    second;
} time;
unsigned char timer0_tick,i=0,keyA=0,keyB=0,mode=0;
time   now;
static void timer0_isr(void) interrupt TF0_VECTOR using 1
{
  TR0=0;
  TL0=(TIMER0_COUNT & 0x00FF);
  TH0=(TIMER0_COUNT >> 8);
  TR0=1;
  if (keyA !=0) {
  keyA--;
  if (keyA==0 && P2_0==0) {
       mode++;
       if(mode==2) mode=0;
       }
  } else if (P2_0==0) keyA=TIMES;
  if (keyB !=0) {
  keyB--;
  if (keyB==0 && P2_1==0) {
        now.minute++;
        if(now.minute==60) {
             now.hour++;
             now.minute=0;
             if(now.hour==24) now.hour=0;
        }
  }
} else if (P2_1==0) keyB=TIMES;
timer0_tick++;
if (timer0_tick==200) {
timer0_tick=0;
now.second++;
if(now.second==60){
     now.minute++;
     now.second=0;
     if(now.minute==60) {
          now.hour++;
          now.minute=0;
          if(now.hour==24) now.hour=0;
     }
}
}
switch (mode) {
case DISPLAY :
         switch(i) {
             case 0 :  P1=seven_seg[now.minute%10];
                          P1_7=(now.second%2);
                          break;
             case 1 :  P1=seven_seg[now.minute/10];
                          break;
             case 2 :  P1=seven_seg[now.hour%10];
                          P1_7=0;
                          break;
             case 3 :  P1=seven_seg[now.hour/10];
                          break;
          }
          break;
case SET :
   switch(i) {
      case 0 :  if (now.second%2) P1=seven_seg[now.minute%10];
                   else P1=0XFF;
                   break;
      case 1 :  if (now.second%2) P1=seven_seg[now.minute/10];
                   else P1=0XFF;
                   break;
     case 2 :  if (now.second%2) P1=seven_seg[now.hour%10];
                   else P1=0XFF;
                   break;
     case 3 :  if (now.second%2) P1=seven_seg[now.hour/10];
                   else P1=0XFF;
                   break;
           }
           break;
  }
  P0=scan[i];
  i++;
  if(i==4) i=0;
}
static void timer0_initialize(void)
{
  EA=0;   
  timer0_tick=0;
  TR0=0;
  TMOD &= 0XF0;
  TMOD |=0x01;
  TL0=(TIMER0_COUNT & 0x00FF);
  TH0=(TIMER0_COUNT >> 8);
  PT0=0;
  ET0=1;
  TR0=1;
  EA=1;
}
void main (void)  {
  timer0_initialize();
  while (1);                         /*无穷循环 */
}

⌨️ 快捷键说明

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