仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /************************************************************************************************************\
- **文件名称:xx.c
- **功能描述:计算一秒钟延时瞬间脉冲数量
- **日期:2019.10.25
- **版本:v1
- ***************************************************************************************************************/
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code numtab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义共阳数码管0-9
- uint pulse_time; //定义一个定时中断变量
- uint pulse_count; //定义脉冲低电平变量
- uint pulse; //定义1秒脉冲数变量
- /***************************************************************************************************\
- **函数名称;初始化定时和外部中断
- **
- ****************************************************************************************************/
- void MCU_init()
- {
- EX0=1;//开外部中断0
- PX0=1;// 外部中断0高优先级
- IT0=1;//触发模式0= 电平 1=边沿触发
- TMOD = 0x11;
- ET1=1;
- TR1=1;
- TH1 = (65535-25000)/256; //载入初值,设置定时器1 25ms中断一次
- TL1 = (65535-25000)%256;
- EA=1;
-
-
- }
- /*******************************************************************************************\
- **函数名称:定时器1入口
- **功能:50us中断一次
- ***************************************************************************************************/
- void TIME1() interrupt 3
- {
-
- pulse_time++;
- if(pulse_time==40) //达到1000ms,即1s钟
- {
- pulse_time=0; //定时中断变量复位
- pulse=pulse_count/2; //一个周期脉冲有两次低电平信号,所以1秒钟脉冲数量为总低电平次数除以2
- pulse_count=0; //复位脉冲低电平变量
- }
-
-
- }
- /*******************************************************************************************\
- **函数名称:外部中断入口
- **功能:检测没冲低电平信号
- ***************************************************************************************************/
- void IINT0() interrupt 0
- {
-
- pulse_count++; //当脉冲信号低电平时候+1;
-
- }
- /*********************************************************************\
- **函数名称:delay(uint m)
- **功能:延时函数
- **********************************************************************/
- void delay(uchar m)
- {
- uchar i,y;
- for(i=m;i>0;i--)
- for(y=110;y>0;y--);
- }
- /*********************************************************************\
- **函数名称:display(uint xx)
- **功能:4位数码管显示程序
- **********************************************************************/
- void display(uint xx)
- {
- if(xx>=0&&xx<10)
- {
- P2=0X08;
- P0=numtab[xx];
- delay(3);
- P0=0XFF;
- }
- if(xx>=10&&xx<100)
- {
- P2=0X04;
- P0=numtab[xx/10];
- delay(3);P0=0XFF;
- P2=0X08;
- P0=numtab[xx%10];
- delay(3);P0=0XFF;
- }
- if(xx>=100&&xx<1000)
- {
- P2=0X02;
- P0=numtab[xx/100];
- delay(3);P0=0XFF;
- P2=0X04;
- P0=numtab[xx%100/10];
- delay(3);P0=0XFF;
- P2=0X08;
- P0=numtab[xx%100%10];
- delay(3);P0=0XFF;
- }
- if(xx>=1000&&xx<10000)
- {
- P2=0X01;
- P0=numtab[xx/1000];
- delay(3);P0=0XFF;
- P2=0X02;
- P0=numtab[xx%1000/100];
- delay(3);P0=0XFF;
- P2=0X04;
- P0=numtab[xx%1000%100/10];
- delay(3);P0=0XFF;
- P2=0X08;
- P0=numtab[xx%1000%100%10];
- delay(3);P0=0XFF;
- }
-
- }
- //主函数入口
- void main()
- {
- MCU_init(); //初始化
- delay(1000);
- while(1)
- {
-
- display(pulse);
- }
- }
复制代码
所有资料51hei提供下载:
脉冲计数.zip
(79.66 KB, 下载次数: 51)
|