单片机实验七:NE555脉冲发生器实验(定时/计数器)详解

实验七 NE555脉冲发生器实验(定时/计数器)

一、实验目的

1.熟悉实验软件和硬件,进行正确的接线;
2.1602显示脉冲频率,调节电位器可改变频率。

二、实验软硬件

1.Keil uVision4
2.PZISP自动下载软件
3.HC6800S开发板

三、实验原理

实验界面及跳线帽位置
NE555是一种应用特别广泛作用很大的的集成电路,属于小规模集成电路,在很多电子产品中都有应用。
NE555的作用是用内部的定时器来构成时基电路,给其他的电路提供时序脉冲。其他HA17555、IM555、CA555分属不同的公司生产的产品。内部结构和工作原理都相同。
NE555的内部结构可等效成23个晶体三极管.17个电阻.两个二极管.组成了比较器.RS触发器.等多组单元电路.特别是由三只精度较高5k电阻构成了一个电阻分压器.为上.下比较器提供基准电压.所以称之为555. NE555属于CMOS工艺制造。

NE555引脚图
1 地 GND 2 触发
3 输出 4 复位
5 控制电压 6 门限(阈值)
7 放电 8 电源电压Vcc

555计数器硬件图
由555定时器和外接元件R1、R2、C构成多谐振荡器,脚2与脚6直接相连。电路没有稳态,仅存在两个暂稳态,电路亦不需要外接触发信号,利用电源通过R1、R2向C充电,以及C通过R2向放电端Dc放电,使电路产生振荡。电容C在2/3Vcc和1/3Vcc之间充电和放电,从而在输出端得到一系列的矩形波,对应的波形如图所示。

555计数器原理图

四、软件流程图

NE555脉冲发生器实验软件流程图

五、实验代码

1.#include<reg51.h>  
2.#include"lcd.h"  
3.  
4.#define uchar unsigned char   
5.#define uint  unsigned int  
6.#define ulong   unsigned long  
7.uchar code EN_CHAR1[16]={"   CYMOMETER    "};  
8.uchar code EN_CHAR2[16]={"FREQ:         HZ"};  
9.ulong Freq,TimeCount;;             
10.void main()  
11.{  
12.    uchar i, freqValue[6];  
13.    LcdInit();  
14.    TMOD=0x51;  
15.    //设置定时器晶振为12MHZ时定时50ms  
16.    TH0=0x3C;  
17.    TL0=0xB0;  
18.    //打开中断  
19.    ET0=1;ET1=1;EA=1;  
20.    //打开定时器  
21.     TR0=1;TR1=1;  
22.    for(i=0;i<16;i++)//第一行显示  
23.    {  
24.        LcdWriteData(EN_CHAR1[i]);  
25.    }     
26.    LcdWriteCom(0xc0);//第二行显示  
27.    for(i=0;i<16;i++)  
28.    {  
29.        LcdWriteData(EN_CHAR2[i]);  
30.    }  
31.    while(1)  
32.    {  
33.        if(TR0==0)         //当计数器停下的时候,表明计数完毕  
34.        {  
35.            Freq = Freq + TL1;       //读取TL的值  
36.            Freq = Freq + (TH1 * 256); //读取TH的值  
37.            LcdWriteCom(0xc8);  
38.            //求频率的个十百千万十万位             
39.            freqValue[0]='0'+Freq%1000000/100000;
40.            freqValue[1]='0'+Freq%100000/10000;   
41.            freqValue[2]='0'+Freq%10000/1000;     
42.            freqValue[3]='0'+Freq%1000/100;   
43.            freqValue[4]='0'+Freq%100/10;     
44.            freqValue[5]='0'+Freq%10;     
45.            for(i=0;i<5;i++)//从最高位开始  
46.            {  
47.                if(freqValue[i]==0x30)  
48.                {  
49.                    freqValue[i]=0x20;  //若为0则赋值空格键  
50.                }                 
51.                else  
52.                {  
53.                    break;  
54.                }     
55.            }  
56.            for(i=0;i<6;i++)  
57.            {  
58.                LcdWriteData(freqValue[i]);   
59.            }     
60.            Freq=0;TH1=0; TL1=0;TR0=1; TR1=1;   
61.        }  
62.    }  
63.}  
64.  
65.void Timer0()   interrupt 1  
66.{  
67.    TimeCount++;  
68.    if(TimeCount==20)//计时到1S  
69.    {  
70.        TR0=0;  
71.        TR1=0;  
72.        TimeCount=0;          
73.    }  
74.    TH0=0x3C;  
75.    TL0=0xB0;     
76.}  
77.void Timer1()   interrupt 3  
78.{     
79.    Freq=Freq+65536;          
80.}  

六、实验步骤

1.连接实验相关模块电路

实验界面
2.编写脉冲发生器程序
编程思路:调节电位器,改变电阻阻值,555定时器产生脉冲的周期也会随之改变,自然频率也会改变。编程记录1S内脉冲的个数即可得到频率,需要用到定时器进行1S的定时和计数器进行脉冲的计数。然后将频率拆分成位,显示在LCD1602显示屏上。
3.下载脉冲发生器程序

程序下载界面
4.调试验证试验效果
调节电位器,LCD屏幕显示对应的频率,显示效果清晰,反应速度较快。

七、实验思考

本次实验室目前做的实验中最复杂的一个程序,用到两个定时计数器。两个中断,主程序也相对复杂。但是思路比较清晰,就是通过计数器555在一秒内产生的脉冲个数,这里的一秒需要定时器来定时,然后将记得的脉冲数显示到LCD1602屏幕上。
定时器或者计数器最大的计数或者定时是65536,超出会溢出或者产生中断,要处理这个溢出而产生的中断,防止程序出行逻辑错误。这里就采用了每次计时50ms计数20次,然后相当于1s的这样的处理,也采用了计数器到65536之后频率加上65536。这些都是需要注意的问题。
LCD1602已经成为一个模块,配有c和h的文件,下一次需要使用1602直接在工程中添加它的c文件。然后在需要用的地方导入这个h文件,非常方便。以后再编程的时候注意这些地方,产生模块化的程序,方便迁移到其它程序中,增加整体效率。有一个词叫低耦合,我想编程也应该保证耦合度低。但换句话说,也不能局限于已经编好的函数,如果自己可以编出一个效率更高效果更好的程序,自然还是要自己动手。

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机实验七:NE555脉冲发生器实验(定时/计数器)详解

发表评论