第二讲:流水灯设计、蜂鸣器发声(郭天祥)

说明:此文章仅是我学习过程中的一些记录,如有侵权,请联系我删除,文章中难免有遗漏错误之处,欢迎指出。

目录

一、机器周期和指令周期

1.振荡周期:

2.状态周期:

3.机器周期:

4.指令周期:

二、如何利用自建的delay()函数设置一个简单延时程序

1.首先是编写一个delay()函数如下

2.然后在KEIL中的Options for Target修改晶振频率为你开发板上的晶振频率

 3.进入调试状态,观察sec的数值,即为程序运行到此处花费的大概时间

4.然后再根据对延时函数取不同的参数,得到不同的延时

三、流水灯设计

四、蜂鸣器


一、机器周期和指令周期

1.振荡周期:

        也称 时钟周期 , 是指为单片机提供时钟脉冲信号的振荡源的周期, TX 实验板上为 11.0592MHz 由实验板上的晶振决定,一般有11.0592MHz,12MHz,24MHz等,各有各的好处。

2.状态周期:

        每个状态周期为时钟周期的 2 , 是振荡周期经二分频后得到的。

3.机器周期:

         一个机器周期 包含 6 个状态周期 S1~S6, 也就是 12 个时钟周期 。 在一个机器周期内 , CPU 可以完成一个独立的操作。 

4.指令周期:

        它是指CPU 完成一条操作所需的全部时间。 每条指令执行时间都是由一个或几个机器周期组成。 MCS - 51 系统中 , 有单周期指令、双周期指令和四周期指令。

二、如何利用自建的delay()函数设置一个简单延时程序

1.首先是编写一个delay()函数如下

//延时函数,z的取值为这个函数的延时ms数,
//如delay(200);大约延时200ms.
//delay(500);大约延时500ms.
void delay(uint z)  
{					
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);	
}

2.然后在KEIL中的Options for Target修改晶振频率为你开发板上的晶振频率

 3.进入调试状态,观察sec的数值,即为程序运行到此处花费的大概时间

4.然后再根据对延时函数取不同的参数,得到不同的延时

        此时我取delay(200),当我运行到delay函数的这一行时(即delay函数还没执行时),观察到sec只有不到1ms,像现在这种只取大概时间,可以忽略,此时再执行下一步,即执行完delay函数,再观察sec。

可以看到时间大概是0.19s,即190ms左右,通过取不同的数值,得到不同时间的延时。

注意:这里的执行下一步应该是Step Over操作,而不是Step操作,因为Step操作会跳到delay函数的内部去一步一步执行,而Step Over会直接执行完delay函数,节省时间。

三、流水灯设计

        根据第一讲可以知道,在这个实验板上点亮一盏发光二极管需要单片机IO口输出低电平,所以点亮第一盏灯即P1 = 11111110,即最低位是0,点亮第二盏灯即P1 = 11111101,即0往左边移了一位,据此可以推测其他的灯亮所需要的条件。

因此,实现流水灯即需要使P1不断的左移一位,而当点到最后一盏灯,即P1 = 01111111时,下一步要再回到P1 = 11111110的状态,即循环左移

C51库函数为我们提供了许多方便调用的函数,其中就包括循环左移,循环右移。

如何查找C51库函数

1.一种办法是直接上网搜索;

2.另一种办法是来到KEIL文件夹下的C51文件夹下的Hlp文件夹下,打开C51文件(文件类型为:编译的HTML帮助文档),打开后即可看到许多函数,通过索引,搜索自己想要的功能;

现在我们来设计流水灯,

首先是了解C51库中的循环左移函数,_crol_()。

        可以看到,这个函数有2个参数,第一个参数是你要左移的变量名第二个参数即左移的位数函数的返回值即左移后的变量,并且调用该程序时,需要加入头文件#include<intrins.h>。据此,我们设计程序如下:

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int //宏定义
void delay(uint z);       //函数声明
uchar temp;               //临时变量

void main()
{
	temp = 0xfe;
	P1 = temp;
	while(1)
	{
		temp = _crol_(temp,1);
		delay(200);      //延时200ms
		P1 = temp;
	}
}

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);	
}

四、蜂鸣器

蜂鸣器电路原理图部分如上,可以看到单片机的P2.3IO口控制着FM,即控制着蜂鸣器,由三极管的知识可知,当FM处为低电平时,即单片机P2.3输出低电平时,电流能从VCC经过FM再经过三极管流向地端,此时蜂鸣器响,若想关掉蜂鸣器,只需FM端置高电平即可。这里不解释三极管的原理。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值