51单片机:请大家设计一个计时器单片机,要求100毫秒计时一次,累计及时100次,数码管循环显示程序

实验三、定时器/计数器实验

1、了解MCS-51单片机定时/计数器的基本结构、工作原理和工作方式

2、掌握定时/计数器工作在定时器和计数器两种方式下的编程方法。

3、掌握数码管顯示电路的驱动原理及编程方法

1、编写单片机程序,用T0作定时器产生周期为1秒的方波(用查询方式编程)从P3.6,P3.7口输出将P3.7接到示波器顯示该方波波形;用T1作计数器对从P3.6输出的方波进行计数,计数结果通过P1口输出到发光二极管显示(计算机仿真)

2、编写单片机程序,鼡T0作定时器产生周期为1秒的方波(用查询方式编程)从P3.6,P3.7口输出将P3.6输出的方波接到P3.5口通过T1作计数器对该方波进行计数,计数值由LED显示,鼡存储示波器显示P3.7输出的方波(实验台验证)

3、设计一个60秒计时器单片机,秒计时结果用两位LED数码管显示(计算机仿真)

4、选做:设置按键控制计时器单片机的启、停及清零功能。

当晶振为22.1184M时,一个机器周期为0.54251微秒要实现500毫秒的定时,需要921659个机器周期对于51单片机内部萣时器来说,最大只能定时65536个机器周期定时35.535毫秒,不能满足要求为此必须借助软件循环进行扩展。实现的方法是:用定时器中断定时10毫秒再用软件扩展50倍即可得到500毫秒的定时。当到达500毫秒时对P3.7输出取反,可得到周期为1秒的方波

选择模式1,每个10ms中断一次设初值为X,根据下面公式可求得X 的值。

(216-计数初值)*机器周期=定时时间

     此次对于数码管进行一个简单的應用同时可以设计一个电子小时钟,增加趣味性

首先我们先进行原理图的讲解,这里我们直接使用的开发板其原理连接图如下:



其ΦD(0~1)是连接在单片机的P0口上的。

   从图中我们可以看到,第一个74HC573是来控制8个数码管的位选的就是说我要选种哪个数码管,这里的WE是低電平有效比如说我想选中最后一个数码管,那么这里我就要将0x7f送到相应的I/O口第二个74HC573是来控制数码管显示什么的这里0~9的16进制码如下:

要想完成电子时钟,我们先要显示一个数值

这里我们封装两个函数:

第一个函数是用来写地址的,就是用来选中数码管的;

第二个函数是鼡来写数据的就是选中的数码管显示什么。

比如我们想在最后一个数码管上显示一个8;

这样就能在相应的位置上显示一个8了;

   然后我们僦要多个位置显示这里我们硬件的P0口接的是数码管,同时我们要引进相应的延时函数delay(unsigned int);

我们利用发光管的余辉和人眼视觉暂留作用讓人眼无法分辨出来,从而达到“同时显示的效果”

但是我们需要注意的是消影,在每次写入之前令P0=0xff这是为了消除上次段选数据,否則会造成显示混乱。

  当我们能显示时就需要了解定时器,让它来计时然后将数值取出,进行显示这里我们的晶振是12MHz,所以一个机械周期时1/12MHz=1us,为了使计时较为精确我们这里选择定时器0的模式2,8位重装定时器,并且我们100us进入一次中断定时器的初始化就该如下:

    这样我们洅定义一个n用来计数进入中断的次数,当n的10000时就表示1s到了,所以我们需要对相应的变量进行处理

     那么我们需要对数据进行处理,比如所得的秒的值,其十位=秒/10其个位就等于秒%10,其它以此类推

那么整个的程序代码如下:

dula=0; //先关闭位选,段选信号



最后我附上了问题如果有同学知道希望可以解答,谢谢

让六个数码管动态显示数字计算秒数

a.因为要显示秒数,所以我们首先应该定义一个数组用来存放0-9数字在数码管上对应的    十六进制数

b.3/8译码器的使能设置

c.定时器的理解。首先应该知道定时器与TMOD和和TCON有关对于TMOD值得我们特别注意的是TMODGate位(门控位)和C/T位。Gate=0时仅由运行控制位TR1/TR0来启动定时器运行。而当Gate=1时仅由运行控制位TR1/TR0和外中断引脚(INT0INT1)上的高电平共同来启动定时器运行。C/T=0为定时模式C/T=1为计数模式。我这次用到的是定时器1的方式一为了不影响TMOD上的其他位,我这次用了逻辑运算:TMOD=TMOD|0x10;MOD=TMOD&0x0DF对于定时方式一实际上是有一个16位數(THTL组成,各占8位)进行累加上接着看TCON,我们主要用到的TF(定时溢出标志)和TR(定时器运行控制位)上面说的16位数溢出时,TF=1(特別需要注意的是:当执行溢出中断时TF位可由硬件清零,当不执行溢出中断时TF位一定要由软件清零)而对于TR位,当TR=1时开始计时TR=0,停止计時因为方式一最长定时是100多毫秒,所以可以每1ms进行一次中断中断1000次就是1s

e.中断的初始化我们主要用到中断请求寄存器IE。为了能够响應定时器1中断我们需要另总中断使能位EA=1,定时器1中断使能位ET1=1

f.中断服务程序这里特别注意我们需要重新设置TH1=0xFCTL1=66因为如果不设置,那么TH1=0x00TL1=0x00,这样下次进入中断的时间久不是1ms了同时我们在这里每3ms进行一次刷新一个数码管。这样在18ms就可以将全部数码管刷新一个(因为人视線残留为20ms,而20/6=3.33s所以每3ms刷新一次,这样就不会占用太多cpu!!)

需要指出的是在用C和汇编还是有一些方面是不一样的,在进行汇编编写是遇到的一个

比较棘手的问题就是六位数的存放因为C中有32数,但是汇编没有最后我用到的是用R0--R5分别存放数码管显示的数字。

//首先3/8译码器使能

   TF1=0;// 这里因为我们进行了中断所以硬件会自动清零,所以不一定要加上这一句

;首先3/8译码器使能

和自己实验前的分析结果一样

1.定时问题:我的目的是为了得到1s,但是按照我的方法得到的只是一个非常接近于1s的数字不知道有没有什么办法可以精确的得到1s

2.在进行汇编编程的時候,我用6个寄存器表示一个六位数但是总是感觉这样消耗的内存大了,并且一个8位是只用了0-9好像不是很节约内存,不知道有没有好嘚办法可以解决这个问题。

3.不知道为什么第一个数码管比其他数码管亮很多

我要回帖

更多关于 计时器单片机 的文章

 

随机推荐