计数器的设计_第1页
计数器的设计_第2页
计数器的设计_第3页
计数器的设计_第4页
计数器的设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计数器要求:编写一个计数器程序,将T0作为计数器来使用,对外部信号计数,将所计数字显示在数码管上。该部分的硬件电路如图21所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选端的驱动,所有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0P2.5,当P2.0P2.5中某引脚输是低电平时,三极管导通,给相应的数码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。图中看出,所有6位数码管的笔段连在一起,通过限流电阻后接到P0口,因此,哪些笔段亮就取决于P0口的8根线的状态。编写程序时,首先根据硬件连线写出LED

2、数码管的字形码、位驱动码,然后编写程序如下: i nclude "reg51.h"#define uchar unsigned char#define uint  unsigned int uchar code BitTab=0x7F,0xBF,0xDF,0xEF,0xF7,0xFB;/位驱动码uchar code DispTab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8

3、8,0x83,0xC6,0xA1,0x86,0x8E,0xFF;/字形码uchar DispBuf6; /显示缓冲区void Timer1() interrupt 3 uchar tmp;uchar Count; /计数器,显示程序通过它得知现正显示哪个数码管TH1=(65536-3000)/256;TL1=(65536-3000)%256; /重置初值tmp=BitTabCount; /取位值P2=P2|0xfc; /P2与11111100B相或P2=P2&tmp; /P2与取出的位值相与tmp=DispBufCount;/

4、取出待显示的数 tmp=DispTabtmp; /取字形码P0=tmp;Count+;if(Count=6)Count=0; void main() uint tmp;P1=0xff;P0=0xff;TMOD=0x15; /定时器0工作于计数方式1,定时器1工作于定时方式1TH1=(65536-3000)/256;TL1=(65536-3000)%256; /定时时间为3000个周期TR0=1; /计数器0开始运行TR1=1;EA=1;ET1=1;for(;) tmp=TL0|(TH0<<8);/取T0中的数值DispBuf5=tmp%10;tmp/=10;DispBuf

5、4=tmp%10; tmp/=10;DispBuf3=tmp%10;tmp/=10;DispBuf2=tmp%10;DispBuf1=tmp/10;DispBuf0=0; 这个程序中用到了一个新的知识点,即数组,首先作一个介绍。数组是C51的一种构造数据类型,数组必须由具有相同数据类型的元素构成,这些数据的类型就是数组的基本类型,如:数组中的所有元素都是整型,则该数组称为整型数组,如所有元素都是字符型,则该数组称为字符型数组。数组必须要先定义,后使用,这里仅介绍一维数组的定义,其方式为:类型说明符数组名整型表达式定义好数组后,可以通过:数组名整型表达式来使用数组元素。在定义

6、数组时,可以对数组进行初始化,即给其赋予初值,这可用以下的一些方法实现:1在定义数组时对数组的全部元素赋予初值:例:int a5=1,2,3,4,5;2只对数组的部分元素初始化;例:int  a5=1,2;上面定义的a数组共有5个元素,但只对前两个赋初值,因此a0和a1的值是1、2,而后面3个元素的值全是0。3在定义数组时对数组元素的全部元素不赋初值,则数组元素值均被初始化为04可以在定义时不指明数组元素的个数,而根据赋值部分由编译器自动确定例:uchar  BitTab=0x7F,0xBF,0xDF,0xEF,0xF7,0xFB;则相当于定义

7、了一个BitTab6这样一个数组。5可以为数组指定存储空间,这个例子中,未指定空间时,将数组定义在内部RAM中,可以用code关键字将数组元素定义在ROM空间中。uchar code BitTab=0x7F,0xBF,0xDF,0xEF,0xF7,0xFB;用这两种定义分别编译,可以看出使用了code关键字后系统占用的RAM数减少了,这种方式用于编程中不需要改变内容的场合,如显示数码管的字形码等是很合适的。6C语言并不对越界使用数组进行检测,例如上例中数组的长度是6,其元素应该是从BitTab0BitTab5,但是如果你在程序中写上BitTab6,编译器并不会认为这有语法错

8、误,也不会给出警告(其他语言如BASCI等则有严格的规定,这种情况将视为语法错误),因此,编程者必须自己小心确认这是否是你需要的结果。程序分析:程序中将定时器T1用作数码管显示,通过interrupt 3关键字定义函数Timer1()为定时器1中断服务程序,在这个中断服务程序中,使用 TH1=(65536-3000)/256;TL1=(65536-3000)%256; 来重置定时器初值,这其中3000即为定时周期,这样的写法可以直观地看到定时周期数,是常用的一种写法。其余程序段分别完成取位码以选择数码管、从显示缓冲区获得待显示数值、根据该数值取段码以点亮相应笔段等任务。其中使用了一个

9、计数器,该计数器的值从05对应第1到第6位的数码管。主程序的第一部分是做一些初始化的操作,设置定时器工作模式、开启定时器T1、开启计数器T0、开启T1中断及总中断,随后进入主循环,主循环首先用unsigned int型变量tmp取出T0中的数值,这里使用了“tmp=TL0|(TH0<<8);”这样的形式,这相当于tmp=TH0*256+TL0,但比之于后一种形式,该方式可以得到更高的效,其后就是将tmp值不断地除10取整,这样将int型数据的各位分离并送入相应的显示缓冲区。 第二个1实验任务利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计

10、数,计数的频率结果通过8位动态数码管显示出来。要求能够对0250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。2电路原理图     图4.31.13系统板上硬件连线(1)把“单片机系统”区域中的P0.0P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。(2)把“单片机系统”区域中的P2.0P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。(3)把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。4程序设计内容(1)定时/计数器T0

11、和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。(2)T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。5C语言源程序#include unsigned char code dispbi

12、t=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,                                0x6d,0x7d,0x07,0x7f,0x

13、6f,0x00,0x40; unsigned char dispbuf8=0,0,0,0,0,0,10,10; unsigned char temp8; unsigned char dispcount; unsigned char T0count; unsigned char timecount; bit flag; unsigned long x; void main(void)   unsigned char i;   TMOD=0x15;   TH0=0;   TL0=0;   TH1=(65536-4000)/256;   T

14、L1=(65536-4000)%6;   TR1=1;   TR0=1;   ET0=1;   ET1=1;   EA=1;   while(1)         if(flag=1)                 flag=0;          x=T0

15、count*65536+TH0*256+TL0;          for(i=0;i<8;i+)                         tempi=0;            

16、60;        i=0;          while(x/10)                         tempi=x;        

17、60;     x=x/10;              i+;                     tempi=x;          for(i=0;i<6;i+)

18、                        dispbufi=tempi;                     timecount=0;          T0count=0;          TH0=0;          TL0=0;    &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论