电子计数器课程设计报告论文

绪论

随着计数器技术的不断发展与进步,计数器的种类越来越多,应用的范围越来越广,随之而来的竞争也越来越激烈。过硬的技术也成为众多生产厂商竞争的焦点之一。厂商为了在竞争中处于不败之地,从而不断地改进技术,增加产品的种类。

现计数器的种类以增加到:电磁计数器、电子计数器、机械计数器(拉动机械计数器、转动机械计数器、按动机械计数器、测长机械计数器)、液晶计数器等。计数器的应用范围也遍布各个行业。

自单片机出现至今,单片机技术已走过了近20年的发展路程。纵观20年来单片机发展历程可以看出,单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发 展为先导,以广泛的应用领域拉动,表现出较微处理器更具个性的发展趋势。单片机的应用在后PC时代得到了前所未有的发展,但对处理器的综合性能要求也越来越高。综观单片机的发展,以应用需求为目标,市场越来越细化,充分突出以“单片”解决问题,而不像多年前以MCS51/96等处理器为中心,外扩各种接口构成各种应用系统。单片机系统作为嵌入式系统的一部分,主要集中在中、低端应用领域(嵌入式高端应用主要由DSP、ARM、MIPS等高性能处理器构成),在这些应用中,目前也出现了一些新的需求,主要体现在以下几个方面:

(1)以电池供电的应用越来越多,而且由于产品体积的限制,很多是用钮扣电池供电,要求系统功耗尽可能低,如手持式仪表、水表、玩具等。

(2)随着应用的复杂,对处理器的功能和性能要求不断提高。既要外设丰富、功能灵活,又要有一定的运算能力,能做一些实时算法,而不仅仅做一些简单的控制。

(3)产品更新速度快,开发时间短,希望开发工具简单、廉价、功能完善。特别是仿真工具要有延续性,能适应多种MCU,以免重复投资,增加开发费用。

(4)产品性能稳定,可靠性高,既能加密保护,又能方便升级


一.总体设计任务和方案

1.1设计任务

要求应用以51单片机为核心设计电子计数器,能设置起始数值,通过加、减键实现计数功能,设计复位按钮。数字通过数码管显示,计数结束发出警报。

1.2设计方案

根据仪器的功能,电子计数器有通用计数器和专用计数器

通用计数器是一种具有多种测量功能,多种用途的电子计数器,它可以测量频率,周期,时间间隔,频率比,累加功能,计时等。配上相应的插件还可以测量相位,电压等

专用计数器指专门用于测量某一种功能的电子计数器,例如:专门测量高频和微波频率的频率计数器;以测量时间为基础的时间计数器;具有某种特殊功能的特种计数器,如可逆计数器,预置计数器,差值计数器等

二.电路原理

2.1 系统的组成

本设计为累加计数的专用计数器,应用AT89C51芯片作为核心,8位的LED数管显示。这种实现方法的优点是电路简单,性能可靠,实时性强,操作简单,编程容易。

原理框图:

本设计的电子计数器的重要功能为:

1.逐次累加计数

2.累加至预定值报警

3.累加计数期间可随时中断

2.2 AT89C51单片机

2.2.1单片机主要功能特性

AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,AT89C51在众多嵌入式控制应用系统中得到广泛应用。

主要性能特点:

1.4k Bytes Flash片内程序存储器;

2.128 bytes的随机存取数据存储器(RAM);

3.32个外部双向输入/输出(I/O)口;

4.5个中断优先级、2层中断嵌套中断;

5.6个中断源;

6.2个16位可编程定时器/计数器;

7.2个全双工串行通信口;

8.看门狗(WDT)电路;

9.片内振荡器和时钟电路;

10.与MCS-51兼容;

11.全静态工作:0Hz-33MHz;

12.三级程序存储器保密锁定;

13.可编程串行通道;

14.低功耗的闲置和掉电模式。

2.2.2 引脚功能及管脚电压

VCC:电源电压输入端。

GND:电源地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。  

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出

4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口除了作为普通I/O口,还有第二功能:

  P3.0 RXD(串行输入口)

  P3.1 TXD(串行输出口)

  P3.2 /INT0(外部中断0)

  P3.3 /INT1(外部中断1)

  P3.4 T0(T0定时器的外部计数输入)

图4 PDIP封装的AT89S51管脚图   

  P3.5 T1(T1定时器的外部计数输入)

  P3.6 /WR(外部数据存储器的写选通)

  P3.7 /RD(外部数据存储器的读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。89C51的P0、P1、P2、P3口作为输入时都是准双向口。除了P1口外P0、P2、P3口都还有其他的功能。

RST:复位输入端,高电平有效。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:地址锁存允许/编程脉冲信号端。当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号,低电平有效。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:外部程序存储器访问允许。当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

2.3 单片机最小系统

单片机最小系统,或者称为最小应用系统,是指最少的元件组成的单片机可以工作的系统。对于51系列的单片机来说,最小系统一般应该包括单片机、晶振电路、复位电路。图6给出了51单片机的最小系统原理图。

图6 51 单片机的最小系统

2.3.1晶振电路

晶振是晶体振荡器的简称,在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低区分,其中较低的频率是串联谐振,较高的频率是并联谐振。由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。

一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。

典型的晶振取值为11.0592MHz(可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)和12MHz(产生精确的uS级时歇,方便定时操作)。

2.3.2复位电路

51单片机是高电平复位,所以先看给单片机加5V电源(上电)启动时的情况:这时电容充电相当于短路,你可以认为RST上的电压就是5V,这是单片机就是复位状态。随着时间推移电容两端电压升高,即造成RST上的电压降低,当低至阈值电压时,即完成复位过程。

如果按下复位键,电容C3短路,这时电容放电,两端电压都是5V,即RST引脚电压为5V,如果超过规定的复位时间,单片机就复位了。当按钮弹起后,RST引脚的电压为0,单片机处于运行状态。

51单片机复位要求是:RST上加高电平时间大于2个机器周期,12MHz的晶振的一个机器周期是1us,要复位就加2us的高电平即可。

单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。

2.4 显示模

数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。通常的数码管又分为8段,即8个LED显示段,分别为A、B、C、D、E、F、G、小数点DP,通过段码控制LED段位的亮灭,实现信息的多样化显示。

数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及其公共端电平一直有效。多位数码管的动态显示时,为简化电路,通常将所有显示位的段码线的相应段并联在一起,由一个8位I/O口作为段选线来控制;而各位的共阳极或共阴极分别由相应的I/O口控制,形成各位的分时选通。

此显示模块中将P0口最为段选线,P2口为位选线。采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。利用人眼的“视觉暂留”效应,依次给出各个数码管公共端加有效信号,与此同时给出该数码管有效的数据信号,尽管实际上各位数码管并非同时点亮,但只要全段扫描速度大于视觉暂留速度时,视觉效果就是一组稳定的显示数据,认为各数码管是同时发光的。图7为显示模块硬件原理图。

.软件介绍

3.1 51单片机C语言介绍

单片机就是中央处理器CPU,随机存储器RAM。只读存储器ROM。定时、计数器和各种输入输出接口I/o接口电路等部件集成在一块电路芯片上的微型计算机。

按制造工艺分:HMOS和CHMOS   CHMOS包括80c51等中间加了C功耗要小

适合便携式手提式和野外作业。按不同容量的存储器配置分:51子系列和52子系列

51表示单片机最后一位数字为1作为标志。片内带有4KbROM或EPROM(Erasable Programmable ROM,可擦除可编程ROM,128BRAM,两个16位定时器/计数器和5个中段器52系列是增强型各项指标都高。

一个典型的单片机应用系统包括输入电路,单片机,输出电路

3.2 Proteus仿真软件介绍

Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的特点是:
    1.实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
    2.支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列、ARM7系列以及各种外围芯片。
    3.提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。
    4.具有强大的原理图绘制功能。
    5.PCB设计以及自动布线。

特点:支持ARM7,PIC ,AVR,HC11以及8051系列的微处理器CPU模型,更多模型正在开发中,更新信息请参见网页;
交互外设模型有LCD显示、RS232终端、通用键盘、开关、按钮、LED等;
强大的调试功能,如访问寄存器与内存,设置断点和单步运行模式;
支持如IAR、Keil和Hitech等开发工具的源码C和汇编的调试;
一键“make”特性:一个键完成编译与仿真操作;
内置超过6000标准SPICE模型,完全兼容制造商提供的SPICE模型;
DLL界面为应用提供特定的模式;
基于工业标准的SPICE3F5混合模型电路仿真器
14种虚拟仪器:示波器、逻辑分析仪、信号发生器、规程分析仪等;
高级仿真包含强大的基于图形的分析功能:模拟、数字和混合瞬时图形;频率;转换;噪声;失真;付立叶;交流、直流和音频曲线;
模拟信号发生器包括直流、正旋、脉冲、分段线性、音频、指数、单频FM;数字信号发生器包括尖脉冲、脉冲、时钟和码流;
集成PROTEUS PCB设计形成完整的电子设计系统。

3.3 Keil uVision2 C语言开发系统介绍

Keil uVision2是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。

    Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序 。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

四.Proteus的仿真

4.1 仿真图形

4.2 元器件代号

设计的电子计数器所需的元器件的代号为

1、单片机代号为:AT89C51

2、电容C1、C2的代号为:CERAMIC22P

3、电容C3的代号为:MINELECT10U16V

4、晶振X1的代号为:CRYSTAL

5、电阻R1、R2的代号分别为:CHIPRES 10K、CHIPRES 100R

6、上拉电阻RP1的代号为:RESPACK-8

7、显示器的代号为:7SEG-MP*1-CC

8、开关六个的代号为BUTTON

4.3 元器件的放置与连线

在元器件代号列表里点击所需元件的代号,就可以选定所需元件,鼠标移动到元件的放置地点,然后点击鼠标右键,即可以将元件放置好。依次放置好元件,要确保元件的摆放美观。

在需要连接的元件接线处,点击左键,移动鼠标,可看到导线的出现,再在导线的另一端在另一个元件的端点处点击,从而连接了电路。

4.4程序运行流程图

4.5 程序运行代码

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit up=P1^0;

sbit down=P1^3;

sbit stop=P1^6;

sbit reset=P1^7;

sbit beep=P3^7;

uint num2,num0,num22,num00,temp;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void init()

{

       num2=0;

       num22=0;

       num0=0;

       num00=0;

       temp=0;

       P0=0;

       P2=0xff;

       P3=0xff;

       beep=0;

       //stop=0;

       P0=table[num0];

       P2=table[num2];

       EA=0;

       IT0=1;

       EX0=1;

}

void keyscan()

{

/*************************************************************************/

       if(stop==0)

       {

              delay(5);

              if(stop==0)

              {

                     while(!stop);

                     if((num2!=0) || (num0!=0))

                     {    

                            temp++;

                            if(temp==1)

                                   EA=1;

                            if(temp==2)

                                   EA=0;

                            if(temp==3)

                            {

                                   temp=1;

                                   EA=1;

                            }

                     }

              }

       }

/*************************************************************************/

       if(temp==0)

       {

/*************************************************************************/

              if(up==0)

              {

                            delay(5);

                            if(up==0)

                            {

                                   while(!up);

                                   if(num2==9)

                                   {

                                          num2=0;

                                          P2=table[num2];

                                          if(num0==9)

                                          {

                                                 num0=0;

                                                 P0=table[num0];

                                          }

                                          else

                                          {

                                                 num0++;

                                                 P0=table[num0];

                                          }

                                   }

                                   else

                                   {

                                          num2++;

                                          P2=table[num2];

                                   }

                            }

              }

/*************************************************************************/     

      

              if(down==0)

              {

                            delay(5);

                            if(down==0)

                            {

                                   while(!down);

                                   if(num2==0)

                                   {

                                          num2=9;

                                          P2=table[num2];

                                          if(num0==0)

                                          {

                                                 num0=9;

                                                 P0=table[num0];

                                          }

                                          else

                                          {

                                                 num0--;

                                                 P0=table[num0];

                                          }

                                   }

                           

                                   else

                                   {

                                          num2--;

                                          P2=table[num2];

                                   }

                            }

              }

/*************************************************************************/

       }

/*************************************************************************/

              if(reset==0)

              {    

                     delay(5);

                     if(reset==0)

                     {

                            while(!reset);

                            if((num2!=0) && (num0!=0))

                            {

                                   num22=0;

                                   num00=0;

                                   P2=table[num22];

                                   P0=table[num00];

                                   beep=0;

                                   EA=1;

                            }

                     }

                    

              }

      

}    

/*************************************************************************/

void main()

{

       init();

       while(1)

       {

              keyscan();

       }

      

}

void INT() interrupt 0

{

              if(num22==9)

              {

                     num22=0;

                     P2=table[num22];

                     num00++;

                     P0=table[num00];

              /*    if(num00==9)

                     {

                            num00=0;

                            P0=table[num00];

                     }

                     else

                     {

                            num00++;

                            P0=table[num00];

                     }*/

              }

              else

              {

                     num22++;

                     P2=table[num22];

                     P0=table[num00];

              }

      

             

              if((num22==num2) && (num00==num0))                       

              {

                     EA=0;

                     beep=1;

              }

}

五、仿真调试

5.1 电子计数器仿真电路调试

5.2 电子计数器仿真测试结果分析

起初设计电路完好,且都能很好的工作,但在P3.2端口少接了一个计数按钮以及蜂鸣器报警装置,从而导致无法计数及报警。

经过修正后,能够正常运行,且在按下up键,显示器上能够逐次加1,按下down键,显示器上能够逐次减1,在按下stop键一次,可以按下beep键进行计数,按下stop键两次,停止计数,当计数达到预定的数值时蜂鸣器报警,按下reset键复位清零。


六.课程设计的心得体会

我们度过了为期两周的单片机课程设计,同时也给我留下了很深刻的印象。两周的课程设计虽然看似很长,却不知不觉中度过了,而在这两周的时间里我设计好了电子计数器,且能够运行正常。

在平时的上课学习中,我们对于书上所讲的感觉很抽象。在做课程设计时我们从最简单的实物开始做起,在制作过程中,我们首先是实验设计,设计电路图,然后画出电路流程图,设计电子计数器运行程序,同时我们还花费了一些时间寻找课程设计的方法以及一些有关材料,并小组讨论设计。最终,我们在各个方面实现了对各个部分的电路设计。在设计过程中,我们遇到了很多的问题,但最终在我们小组的共同努力以及老师和同学的帮助下,把问题都解决了。

在课程设计的整个过程中,我得到了一些感悟:

1、在设计过程中,我们分工合作进行查找资料,我们从Proteus仿真软件的应用,通过阅读相关书籍,从而构建出电子计数器的仿真电路图,同时也初步知道了该软件的应用方法。

2、我觉得做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。

3、同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。课程设计即是一个课题的研究与设计,需要一个小组的合作,所以要让每个人都知道,团队的精神,团结协作是我们课程设计成功的一项非常重要的保证。

4、通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在课程设计的过程中遇到问题,可以说是困难重重,无论做什么事,难免会遇到过各种各样的问题,同时在课程设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

       通过这次的课程设计,使我们更深刻的体会到了理论联系实际的重要性,我们今后学习工作中会更加注重实际,更多的去锻炼自己的技能,也让自己更好的发挥好自己的优势和特长!


七.参考文献

[1]张毅刚 彭喜元 彭宇编:《单片机原理及应用》  第二版   高等教育出版社  2010

[2]路而红主编:《电子设计自动化应用技术——FPGA应用篇》 高等教育出版社  2009

[3]张元良 王建军等著:《单片机开发技术实例教程》  机械工业出版社  2010

[4]皮大能 南光群 刘金华编著:《单片机课程设计指导书》   北京理工大学出版社  2010

[5]胡亚琦主编:《单片机原理及应用系统设计》  西安电子科技大学出版社  2010

相关推荐