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

📄 counter.c

📁 外部计数+显示程序 , 单片机外部输入脉冲信号
💻 C
字号:
/*****************************************************************/ 
/*                                                               */                                                                
/*名称:                   外部计数+显示程序                     */                                                                                                                                                                           
/*功能:           单片机外部输入脉冲信号,定时器参与计数        */
/*                   计数值由数码管显示出来。                      */                                                                                                                                                                                                                                                             
/*****************************************************************/



#include<reg52.h>
#define  uchar  unsigned char


sbit addr0 = P1^4;//系统片选地址线0
sbit addr1 = P1^5;//系统片选地址线1
sbit addr2 = P1^6;//系统片选地址线2
sbit addr3 = P1^7;//系统片选地址线3

//行扫描数组
uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
//数码管显示的段码表
uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
                       0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
                       0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格

uchar dispbuf[8]; //显示缓冲区   
unsigned int count;                      

/*****************************延时函数**************************/

void delay (unsigned int us)  
{
  while(us--);
}

void initial()
{ uchar j;
  count=0;//秒清零
  for(j=0;j<6;j++)
    dispbuf[j] = 0;//清数码管显示缓冲区
  TMOD = 0x05;//T0 T1工作于方式1
  TL0 = 0xff;
  TH0 = 0xff;//50ms定时初值

  ET0 = 1;//允许T1中断
  PT0 = 1;//T1中断优先级高

  EA = 1;//开中断
  TR0 = 1;//T1开始计时
 }


/*************************************填充显示缓冲区****************************/

void  feedbuffer()
{
unsigned int temp;
 
 temp = count;
 dispbuf[5] = temp % 10;//分个位
 temp = temp / 10;
 dispbuf[4] = temp % 10;//分十位
 
 temp = temp / 10;
 dispbuf[3] =temp % 10;//时百位
 temp = temp / 10;
 dispbuf[2] =temp % 10;//时千位

 temp = temp / 10;
 dispbuf[1] =temp % 10;//时万位
 temp = temp / 10;
 dispbuf[0] =temp % 10;//时十万位

}




/******************************显示+读键*************************/

void vLedKey_Scan()
{  unsigned char i,value;  

    for(i=0;i<8;i++){
       addr3 = 0;
       addr0 = 0;
       addr1 = 1;
       addr2 = 0;//开发板上U4(74HC574)的片选地址
       value =table[dispbuf[i]]; //取一行显示数据 
       P0 = value;
       addr3 = 1; 
       addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
       P2 = scan[i];//取row0--row7行扫描数据
       delay(50); //延时50us
       P2 = 0xff;//关显示
       }
 }

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

main()
{ 
  initial();
  while(1){
      vLedKey_Scan(); //显示,读键扫描 
  }
}



//计数中断服务
void  int50ms() interrupt 1
{ 
  TR0=0;//关定时器T0
  TL0= 0xff;
  TH0= 0xff;//赋定时初值
  TR0=1;//开定时器T0
  count++;//50ms计数加1
  feedbuffer();
}
/********************************结束************************/

⌨️ 快捷键说明

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