找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管频率计proteus仿真和源程序及ppt教程等

[复制链接]
跳转到指定楼层
楼主



频率计的ppt教程:


频率计的ppt 仿真 程序等所有资料下载:
6位数显频率计数器.rar (248.34 KB, 下载次数: 60)


一、MCS-51单片机定时器/计数器组成:
定时器/计数器0(T0):16位的加计数器
定时器/计数器1(T1):16位的加计数器
二、定时器/计数器的功能
对外部输入信号的计数功能。定时器/计数器0(T0)的外来脉冲输入端为P3.4;定时器/计数器1(T1)的外来脉冲输入端为P3.5。
定时功能。定时器/计数器的定时功能也是通过计数实现的,它的计数脉冲是由单片机的片内振荡器输出经12分频后产生的信号,即为对机器周期计数。


在计数工作方式下,计数器的计数值范围是:
          1~8192(2的13方)

当为定时工作方式时,定时时间的计算公式为:
         ( 8192 -计数初值)×晶振周期×12
或     ( 8192 -计数初值)×机器周期
其时间单位与晶振周期或机器周期相同。

如果单片机的晶振选为6.000MHz,则最小定时时间为:
     [8192—(8192—1)]×1/6×10-6×12=2×10-6(s)=2(us)
最长定时时间为:
     (8192—0)×1/6×10-6×12=16384×10-6(s)=16384(us)。


在工作方式1下,计数器的计数值范围是:
          1~65536(2的16方)

当为定时工作方式1时,定时时间的计算公式为:
         (65536—计数初值)× 晶振周期×12
或     (65536—计数初值)× 机器周期
其时间单位与晶振周期或机器周期相同。

如果单片机的晶振选为6.000MHz,则最小定时时间为:
      [65536—(65536—1)]×1/6×10-6×12=2×10-6(s)=2(us)
最长定时时间为:
      (65536—0)×1/6×10-6×12=131072×10-6(s)=131072(us)


方式2与方式0、1的区别:
    工作方式0和工作方式1的最大特点就是计数溢出后,计数器为全0,因而循环定时或循环计数应用时就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度。
    工作方式2就具有自动重装载功能,即自动加载计数初值,所以也有的文献称之为自动重加载工作方式。在这种工作方式中,16位计数器分为两部分,即以TL0为计数器,以TH0作为预置寄存器,初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,不再象方式0和方式1那样需要“人工干预”,由软件重新赋值,而是由预置寄存器TH以硬件方法自动给计数器TL0重新加载。
      方式2在串口通讯时,常用作波特率发生器。


2.怎样编制计数程序?

  首先必须对定时计数器进行初始化,然后再开启定时或计数。简单的总结一下,定时计数器的初始化包括以下内容。

(1)确定工作方式——对TMOD赋值;
如:任务中的MOV        TMOD,#06H指令,设定T0为计数器工作方式。
(2)预置定时计数器中计数的初值——直接写入TH和TL;
如:任务中的MOV   TH0,#00H  两条指令,设定计数初值。
            MOV          TL0,#00H

(3)根据需要开放定时器/计数器的中断——对IE位赋值;
(4)启动定时器/计数器;
如:任务中的SETB  TR0  指令
初值的计算方法
X=M-计数值
M是定时器的最大计数值。视工作方式不同而不同。

工作方式0: 13位定时/计数方式,因此,最多可以计到2的13次方,也就是8192次。

工作方式1: 16位定时/计数方式,因此,最多可以计到2的16次方,也就是65536次。

工作方式2和工作方式3:都是8位的定时/计数方式,因此,最多可以计到2的8次方,也说是256次。

预置值计算:  用最大计数量减去需要的计数次数即可。
通过上面的任务,我们掌握了计数程序的编制方法,下面我们再看看定时程序怎样编制。
首先我们看一下下面的程序段。
           MOV     TMOD,#01H
        MOV           TL0,#00H  
        MOV     TH0,#4CH  
           SETB          TR0      
以上程序是任务一中的定时程序段,它的初始化过程和计数方式类似。


实例二:利用方式1定时
题目:用定时器T1,使用工作方式1,在单片机的P1.0输出一个周期为2分钟、占空比为1:1的方波信号。
解:周期为2分钟,占空比为1:1的方波信号,只需要利用T1产生定时,每隔1分将P1.0取反即可。
由于定时器定时时间有限,设定T1的定时为50ms,软件计数1200次,可以实现1分钟定时。
编程步骤:
1、计算TMOD的值
       由于:GATE=0;M1、M0=0、1;C/T=0;
       所以:(TMOD)=10H
2、计算初值(单片机的振荡频率为12MHZ)
 所需要的机器周期数:
                   n=(50000us/1us)=50000
  计数器的初始值:X=65536-50000=15536
            所以:(TH0)=3CH;(TL0)=0B0H


频率计工作原理:
实现的方法:利用T0计数器对从T0输入的脉冲进行计数,利用T1工作于定时。每定时达到1秒钟,取出计数器的值进行显示。由于每秒钟按键的按下次数不超过255次,所以只需要显示TL0的内容即可。
步骤:
由于定时器的最大定时时间不能够达到1秒钟,我们设定T1定时100mS,每10次取一次计数值。
设定TMOD,TH1,TL1的内容,(fosc)=6MHz
      所以:(TMOD)=51H
                  (TH1)=3CH
                  (TL1)=0B0H

本章要求:
了解中断源、中断的功能、中断系统的组成与功能、中断优先权管理、中断响应条件、中断响应过程、中断嵌套等基本概念;
掌握MCS-51单片机的5个中断源;掌握外部中断的触发方式,与的触发方式有边沿方式与电平方式两种;
掌握定时器/计数器的计数脉冲来源,计数脉冲来自内部振荡频率的12分频后的脉冲则称为定时器方式,计数脉冲来自外部引脚则称为计数器方式;
掌握中断请求标志的清除方式,边沿方式下的与、T0、T1的中断请求标志是自动被清除的,而串行口的中断是用户通过软件清除的,电平触发的与还需要硬件的支持才能被清除;
掌握T0与T1的工作方式,以及各种方式的应用;
掌握TCON、SCON、IE、IP、TMOD等特殊功能寄存器的功能与应用;
掌握MCS-51单片机对各中断源的响应条件与过程。


源程序:
  1. #include <AT89X52.H>
  2. unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3. unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
  4.                                0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
  5. unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
  6. unsigned char temp[8];
  7. unsigned char dispcount;
  8. unsigned char T0count;
  9. unsigned char timecount;
  10. bit flag;
  11. unsigned long x;
  12.   
  13. void main(void)
  14. {
  15.   unsigned char i;
  16.   
  17.   TMOD=0x15;
  18.   TH0=0;
  19.   TL0=0;
  20.   TH1=(65536-5000)/256;
  21.   TL1=(65536-5000)%256;
  22.   TR1=1;
  23.   TR0=1;
  24.   ET0=1;
  25.   ET1=1;
  26.   EA=1;
  27.   
  28.   while(1)
  29.    {
  30.      if(flag==1)
  31.        {
  32.          flag=0;
  33.          x=T0count*65536+TH0*256+TL0;
  34.          for(i=0;i<8;i++)
  35.            {
  36.              temp[i]=0;
  37.            }
  38.          i=0;
  39.          while(x/10)
  40.            {
  41.              temp[i]=x%10;
  42.              x=x/10;
  43.              i++;
  44.            }
  45.          temp[i]=x;
  46.          for(i=0;i<6;i++)
  47.            {
  48.              dispbuf[i]=temp[i];
  49.            }
  50.          timecount=0;
  51.          T0count=0;
  52.          TH0=0;
  53.          TL0=0;
  54.          TR0=1;
  55.        }
  56.    }
  57. }
  58.   
  59. void t0(void) interrupt 1 using 0
  60. {
  61.   T0count++;
  62. }
  63.   
  64. void t1(void) interrupt 3 using 0
  65. {
  66.   TH1=(65536-5000)/256;
  67.   TL1=(65536-5000)%256;
  68.   timecount++;
  69.   if(timecount==200)
  70.     {
  71.       TR0=0;
  72.       timecount=0;
  73.       flag=1;
  74.     }
  75.   P2=0xff;
  76.   P0=dispcode[dispbuf[dispcount]];
  77.   P2=dispbit[dispcount];
  78.   dispcount++;
  79.   if(dispcount==8)
  80.     {
  81.       dispcount=0;
  82.     }
  83. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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