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

📄 digital clock.txt

📁 程序描述:这个范例说明如何使用8051的P1口连接到4个七段显示器
💻 TXT
字号:
#include <REGX51.H>                                                                    //调用特殊功能寄存器         
#define TIMER0_COUNT 0XEE18  /*10000h-(12,000,000/(12*200))  */                        //对定时器T0进行初始化,让T0每一秒中断200次
#define TRUE 1                                                                         //定义TRUE为1
#define FALSE 0                                                                        //定义FALSE为0
#define DISPLAY 0                                                                      //定义DISPALY为0
#define SET 1                                                                          //定义SET为1
#define TIMES 25                                                                       //定义TIMES为25
const seven_seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};               //0-9的七段字形码
const scan[4]={0X0E,0X0D,0X0B,0X07};                                                   //定义四个七段显示器轮流亮的顺序
typedef struct{                                                                        //定义一个时间结构体
  char hour ;                                                                          //定义字符小时
  char minite ;                                                                        //定义字符分钟
  char second;                                                                         //定义字符秒
}time;                                                                                 
unsigned char timer0_tick,i=0,keyA=0,keyB=0,mode=0;                                    //定义字符变量timer0_tick,i=0,keyA=0,keyB=0,mode=0
time now;                                                                              //定义时间变量now
static void timer0_isr(void) interrupt TF0_VECTOR using 1                              //T0中断函数
{
  TRO=0;                                                                               //中断停止                         *********************          
  TL0=(TIMER0_COUNT & 0x00FF);                                                         //加载T0的低8位                    *利用keyA=times来消除键盘
  TH0=(TIMER0_COUNT >> 8);                                                             //加载T0的高8位                    *的抖动
  TR0=1;                                                                               //中断开始                         *同样利用keyB=times来消除
  if(keyA!=0){                                                                         //如果keyA不等于0                  *键盘的抖动
  keyA--;                                                                              //那么keyA自减                     *
  if(keyA==0&&P2_0==0){                                                                //如果keyA等于0同时P2_0等于0       *每按一次keyB加一分钟,当加满
    mode++;                                                                            //mode(模式)自增                 *60时,小时加1,小时加到24的时候
    if(mode==2)  mode=0;                                                               //如果mode等于2则mode等于0         *小时也变为0
    }                                                                                                                     *
  }else if(P2_0==0) keyA=TIMES;                                                        //如果P2_0=0,则keyA=25             **********************
  if(keyB!=0){                                                                         //如果keyB!=0   
  keyB--;                                                                              //keyB自减  
  if(keyB==0&&P2_1==0){                                                                //如果keyB=0同时P2_0=0
    now.minute++;                                                                      //now.minute自增
       if(now.minute==60){                                                             //如果now.minute=60
         now.hour++;                                                                   //now。hour自增
         now.minute=0;                                                                 //now.minute=0
         if(now.hour==24)  now.hour=0;                                                 //如果now.hour=24,now.hour=0
       }
    }
  }else if(P2_1==0)  keyB=TIMES;                                                        //如果P2_1=0,则keyB=25
 time0_tick++;                                                                          //time0_tick自增
 if(timer0_tick==200){                                                                  //如果time0_tick=200
   timer0_tick=0;                                                                       //time0_tick=0
    now.second++;                                                                       //秒自增1
    if(now.second==60){                                                                 //秒=60时
      now.minute++;                                                                     //分钟自增1
      now.second=0;                                                                     //秒=0
      if(now.minute==60){                                                               //分钟=60时
        now.minute=0;                                                                   //分钟=0
        now.hour++;                                                                     //小时自增1
        if(now.hour==24)    now.hour=0;                                                 //小时=24时,小时=0
      }
   }
 }
switch(mode){
  case DISPLAY:                                                                         //当模式为显示的时候
   switch(i){                                                                           //变量为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;                                                                     //跳出内嵌套的switch case
      }
      break;                                                                            //跳出外嵌套的switch case
  }
  P0=scan[i];                                                                           //P0输出四个七段数码管的相应的一个数码管显示相应的字形码
  i++;                                                                                  //i自增,i的值决定哪个数码管亮
  if(i==4) i=0;                                                                         //如果i=4,则i=0
}

static void timer0_initialize(void){                                                    //timer0初始化
  EA=0;                                                                                 //cpu总中断关
  timer0_tick=0;                                                                        //timer0_tick=0
  TR0=0;                                                                                //中断停止
  TMOD&=0XF0;                                                                           //对定时器T0初始化               
  TMOD |=0X01;                                                                          //定义T0工作在方式1,为16位定时器/计数器
  TL0=(TIMER0_COUNT & 0x00FF);                                                          //T0低八位初始化
  TH0=(TIMER0_COUNT >> 8);                                                              //T0高八位初始化
  PT0=0;                                                                                //P0优先级为低                          
  ET0=1;                                                                                //T0中断允许
  TR0=1;                                                                                //T0中断开始
  EA=1;                                                                                 //cpu总中断开始
}

void main(void){
  timer0_initialize();                                                                  //timer0初始化
  while(1);                                                                             //无限等待
}

⌨️ 快捷键说明

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