EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 468|回复: 0

[资料共享] 51单片机+Proteus仿真实时1秒钟读取的脉冲数量源程序

[复制链接]

主题

0

回帖

E币

技术员

Rank: 2

积分
2
发表于 2019-10-25 22:35:36 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
160715cseffrs979ewwy4x.png

单片机源程序如下:
  1. /************************************************************************************************************\
  2. **文件名称:xx.c
  3. **功能描述:计算一秒钟延时瞬间脉冲数量
  4. **日期:2019.10.25
  5. **版本:v1
  6. ***************************************************************************************************************/

  7. #include <reg51.h>

  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. uchar code numtab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义共阳数码管0-9


  11. uint pulse_time;    //定义一个定时中断变量
  12. uint pulse_count;  //定义脉冲低电平变量
  13. uint pulse;        //定义1秒脉冲数变量

  14. /***************************************************************************************************\
  15. **函数名称;初始化定时和外部中断
  16. **
  17. ****************************************************************************************************/
  18. void MCU_init()
  19. {
  20.     EX0=1;//开外部中断0
  21.     PX0=1;// 外部中断0高优先级
  22.     IT0=1;//触发模式0= 电平 1=边沿触发
  23.     TMOD = 0x11;
  24.     ET1=1;
  25.     TR1=1;

  26.          TH1 = (65535-25000)/256;   //载入初值,设置定时器1 25ms中断一次
  27.          TL1 = (65535-25000)%256;
  28.          EA=1;                                                                                
  29.         
  30.         
  31. }
  32. /*******************************************************************************************\
  33. **函数名称:定时器1入口
  34. **功能:50us中断一次
  35. ***************************************************************************************************/
  36. void TIME1() interrupt 3
  37. {
  38.         
  39.         pulse_time++;
  40.         if(pulse_time==40)  //达到1000ms,即1s钟
  41.            {
  42.                     pulse_time=0;   //定时中断变量复位
  43.                     pulse=pulse_count/2;    //一个周期脉冲有两次低电平信号,所以1秒钟脉冲数量为总低电平次数除以2
  44.                           pulse_count=0;      //复位脉冲低电平变量
  45.             }
  46.         
  47.         
  48. }
  49. /*******************************************************************************************\
  50. **函数名称:外部中断入口
  51. **功能:检测没冲低电平信号
  52. ***************************************************************************************************/
  53. void IINT0() interrupt 0
  54. {
  55.         
  56.         pulse_count++;  //当脉冲信号低电平时候+1;
  57.                
  58. }
  59. /*********************************************************************\
  60. **函数名称:delay(uint m)
  61. **功能:延时函数
  62. **********************************************************************/
  63. void delay(uchar m)
  64. {
  65.         uchar i,y;
  66.         for(i=m;i>0;i--)
  67.          for(y=110;y>0;y--);
  68. }
  69. /*********************************************************************\
  70. **函数名称:display(uint xx)
  71. **功能:4位数码管显示程序
  72. **********************************************************************/
  73. void display(uint xx)
  74. {
  75.         if(xx>=0&&xx<10)
  76.         {
  77.                 P2=0X08;
  78.                 P0=numtab[xx];        
  79.                 delay(3);
  80.                 P0=0XFF;
  81.         }
  82.         if(xx>=10&&xx<100)
  83.         {
  84.                 P2=0X04;
  85.                 P0=numtab[xx/10];
  86.                 delay(3);P0=0XFF;
  87.                 P2=0X08;
  88.                 P0=numtab[xx%10];
  89.                 delay(3);P0=0XFF;
  90.         }
  91.         if(xx>=100&&xx<1000)
  92.         {
  93.                 P2=0X02;
  94.                 P0=numtab[xx/100];
  95.                 delay(3);P0=0XFF;
  96.                 P2=0X04;
  97.                 P0=numtab[xx%100/10];
  98.                 delay(3);P0=0XFF;
  99.                 P2=0X08;
  100.                 P0=numtab[xx%100%10];
  101.                 delay(3);P0=0XFF;
  102.         }
  103.         if(xx>=1000&&xx<10000)
  104.         {
  105.                 P2=0X01;
  106.                 P0=numtab[xx/1000];
  107.                 delay(3);P0=0XFF;
  108.                 P2=0X02;
  109.                 P0=numtab[xx%1000/100];
  110.                 delay(3);P0=0XFF;
  111.                 P2=0X04;
  112.                 P0=numtab[xx%1000%100/10];
  113.                 delay(3);P0=0XFF;
  114.                 P2=0X08;
  115.                 P0=numtab[xx%1000%100%10];
  116.                 delay(3);P0=0XFF;
  117.         }
  118.         

  119. }
  120. //主函数入口
  121. void main()
  122. {

  123.          MCU_init(); //初始化
  124.          delay(1000);
  125.         while(1)
  126.         {
  127.          
  128.                 display(pulse);
  129.         }
  130. }
复制代码


脉冲计数.zip

79.66 KB, 下载次数: 0, 下载积分: E币 -5 元

积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-25 07:34 , Processed in 0.052183 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表