求个单片机c51汇编语言是什么 跑马灯过程如下图

  使用取反(CPL)实现的闪烁,随后给P0口赋值实现移动。

  注;使用的是12MHZ频率,

  带C循环做移动,使用一条跳转转移指令就可实现一直循环下去,延时为1.3s!


;蜂鸣器就使用哪种小的无源的有源的5v蜂鸣器都可以,经过试验发现用无源的效果更好,接在p1.2口,最好用一个三极管放大一下电流,晶振用12兆的.

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

一.交替闪烁8个LED灯,时间间隔为1s

2 实验名称: 交替闪烁8个LED灯,时间间隔1s 14 /*根据原理图,P0置高电平灯亮*/ 18 /*根据原理图,P0置低电平灯灭*/

实验的代码很简单。但是实际操作过程中还是遇到了以下问题:

  1. 端口P0编号不能用小写。P字母必须大写。
  2. 给P0赋值时,虽然赋的是16进制的值,但是不能在后面加H。

要注意的是用C语言不大可能做出精确的延时效果,肯定会存在一定的误差!!!!

首先先来了解几个单片机的周期知识:

  • 时钟周期:也称振荡周期,定义为频率的倒数,它是单片机中最基本,最小的时间单位。
  • 状态周期:它是时钟周期的两倍。
  • 机器周期:单片机的基本周期,完成一项基本操作,如取指令,存储器读写等,它由12个时钟周期(6个状态周期)构成。
  • 指令周期:单片机执行一条指令所需要的时间,一般是1-4个机器周期。

在这里,我把晶振的频率设置为跟自己设备一样,为12MHZ,所以机器周期为1?s。而整个程序的时间可以根据Keil的调试功能查看。

打开Keil的调试功能(就是菜单栏里放大镜里面有个d的那个图标),然后再在所需要的地方设置断点。如下图所示:

如图所示,在15行,16行位置设置了断点。图片左侧部分,可以找到“sec”这一项,这一项就是执行到这步所需要的时间,然后可以根据时间差计算延时的时间。

这里可以看到执行到15行的时间为0.s

执行到16行的时候时间为0.s,所以执行P0=0x00的时间为2?s,即两个机器周期,因为这里用的是立即数寻址,取值一周期,执行一周期

执行到19行的时间为0.s,所以执行delay(45)这句代码的时间为0.978535s,接近1s,所以说是存在误差的。但是对于实验效果来说,也已经够了。

最重要的还有一点就是,经过自己实验,不同的类型符号所需要的时间也是不一样的,比如我采用无符号整形,所需时间就是3.7s,所以差别还是很大的。

不过总结来说,还是应该遵循一些简单的原则:

  • 尽量使用unsigned 型的数据结构。
  • 尽量使用char型,实在不够用再用int,然后才是long。
  • 如果有可能,不要用浮点型。
  • 使用简洁的代码,因为按照经验,简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立)。

另外的话,在这里也把汇编的延时程序放出来。同样的,也是先来看用来实现这个目标的代码。

3 * 实验说明 : 得到8盏LED交替亮灭的实验效果

其中DJNZ是减一不为零转移指令。有两个参数,第一个是被减数,第二个是转移的地址编号。

还有一点要注意的就是MOV指令时单周期指令,DJNZ是双周期指令。

执行到MOV指令时的时间为0.s

 执行到12行时,时间为0.s,所以执行MOV P0,#00H这句语句的时间为2?s,同样的是因为采用了立即数寻址。

 可以看到延时程序的消耗时间大约为1s,计算分析过程:

所以采用汇编编写延时程序明显比C语言准确的多,当然也不是完全正确,还是有很小的误差,准确的延时应该用定时器来设计。


二.LED二进制加法显示

3 实验名称: LED二进制加法显示

3 实验名称: 流水灯实验 4 实验说明: 延时实现LED灯流水线效果

intrins.h头文件内部函数描述:

(1)循环移位用法如上代码。

功能:即空指令。什么都不做,但是占用一个指令的时间。

功能:产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。

_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。

4 实验说明: LED灯右移跑马灯

五.LED左右跑马灯设计

4 实验说明: LED灯左右跑马灯

我要回帖

更多关于 汇编语言是什么 的文章

 

随机推荐