找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3087|回复: 1
打印 上一主题 下一主题
收起左侧

单片机NE555脉冲发生器程序(1602+数码管显示)

[复制链接]
跳转到指定楼层
楼主
ID:449581 发表于 2018-12-19 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /*******************************************************************************
  2. --------------------------------------------------------------------------------
  3. * 实 验 名                 : NE555脉冲计数显示试验
  4. * 实验说明       : LCD1602显示接收到的脉冲频率。
  5. * 连接方式       : 见连接图
  6. * 注    意                 :
  7. *******************************************************************************/

  8. #include<reg51.h>
  9. #include"lcd.h"

  10. #define uchar unsigned char
  11. #define uint  unsigned int
  12. #define ulong        unsigned long
  13. //--定义LCD显示的文字--//
  14. uchar code EN_CHAR1[16]={"   CYMOMETER    "};
  15. uchar code EN_CHAR2[16]={"FREQ:         HZ"};

  16. //--声明全局函数--//
  17. void TIMER_Configuration();        //初始化定时器
  18. //--定义全局变量--//
  19. ulong Freq;        //用来存放要显示的频率值
  20. ulong        TimeCount; //用于计算1S钟的
  21. /*******************************************
  22. *函数名                :main
  23. *功  能         :主函数
  24. *输         入         :无
  25. *输  出                :无
  26. *******************************************/

  27. void main()
  28. {
  29.         uchar i, freqValue[6];

  30.         LcdInit();
  31.         TIMER_Configuration();

  32.         //--显示要写的字母--//
  33.         for(i=0;i<16;i++)
  34.         {
  35.                 LcdWriteData(EN_CHAR1[i]);
  36.         }        
  37.         LcdWriteCom(0xc0);//第二行显示
  38.         for(i=0;i<16;i++)
  39.         {
  40.                 LcdWriteData(EN_CHAR2[i]);
  41.         }
  42.         
  43.         while(1)
  44.         {
  45.                 if(TR0==0)         //当计数器停下的时候,表明计数完毕
  46.                 {
  47.                         Freq = Freq + TL1;       //读取TL的值
  48.                         Freq = Freq + (TH1 * 256); //读取TH的值
  49.                         LcdWriteCom(0xc8);
  50.                         //--求频率的个十百千万十万位--//
  51.                         freqValue[0]='0'+Freq%1000000/100000;        
  52.                         freqValue[1]='0'+Freq%100000/10000;        
  53.                         freqValue[2]='0'+Freq%10000/1000;        
  54.                         freqValue[3]='0'+Freq%1000/100;        
  55.                         freqValue[4]='0'+Freq%100/10;        
  56.                         freqValue[5]='0'+Freq%10;        
  57.                         //--显示求得的数值--//
  58.                         for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)
  59.                         {
  60.                                 if(freqValue[i]==0x30)
  61.                                 {
  62.                                         freqValue[i]=0x20;        //若为0则赋值空格键
  63.                                 }
  64.                                                                
  65.                                 else
  66.                                 {
  67.                                         break;
  68.                                 }
  69.                                        
  70.                         }
  71.                         for(i=0;i<6;i++)
  72.                         {
  73.                                 LcdWriteData(freqValue[i]);        
  74.                         }
  75.                         //--显示完,重新计算下一次频率。--//        
  76.                         Freq=0;//将计算的频率清零
  77.                         TH1=0; //将计数器的值清零
  78.                         TL1=0;
  79.                         TR0=1; //开启定时器
  80.                         TR1=1; //开启计数器
  81.                 }
  82.         }
  83. }

  84. /*******************************************
  85. *函数名                :TIMER_Configuration
  86. *功  能         :配置定时/计数器T0和T1
  87. *输         入         :无
  88. *输  出                :无
  89. *******************************************/

  90. void TIMER_Configuration()
  91. {
  92.         //--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
  93.         //--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--//        
  94.         TMOD=0x51;

  95.         //--设置定时器晶振为12MHZ时定时50ms--//
  96.         TH0=0x3C;
  97.         TL0=0xB0;

  98.         //--打开中断-//
  99.         ET0=1;
  100.         ET1=1;
  101.         EA=1;

  102.         //--打开定时器*/
  103.         TR0=1;
  104.         TR1=1;
  105. }
  106. /*******************************************
  107. *函数名                :Timer0
  108. *功  能         :定时器0的中断函数
  109. *输         入         :无
  110. *输  出                :无
  111. *******************************************/

  112. void Timer0()        interrupt 1
  113. {
  114.         TimeCount++;
  115.         if(TimeCount==20)//计时到1S
  116.         {
  117.                 TR0=0;
  118.                 TR1=0;
  119.                 TimeCount=0;               
  120.         }

  121.         //--12MHZ设置定时50ms的初值--//
  122.         TH0=0x3C;
  123.         TL0=0xB0;        
  124. }
  125. /*******************************************
  126. *函数名                :Timer1
  127. *功  能         :定时器1的中断函数
  128. *输         入         :无
  129. *输  出                :无
  130. *******************************************/

  131. void Timer1()        interrupt 3
  132. {        
  133.         //--进入一次中断,表明计数到了65536--//
  134.         Freq=Freq+65536;               
  135. }
复制代码

所有资料51hei提供下载:
NE555脉冲发生器.rar (2.65 MB, 下载次数: 49)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-19 15:45 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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