找回密码
 立即注册

QQ登录

只需一步,快速开始

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

闪烁灯

[复制链接]
跳转到指定楼层
楼主
1.  实验任务
P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2.  电路原理图
3.  系统板上硬件连线
单片机系统区域中的P1.0端口用导线连接到八路发光二极管指示模块区域中的L1端口上。
4.  程序设计内容
1).    延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒=0.001毫秒(ms
                                                      机器周期               微秒
MOV R6,#20                            2                 2                  2
file:///C:\Users\DELL\AppData\Local\Temp\ksohtml\wps7A30.tmp.jpgD1:                MOV R7,#248                    2个          2+2×248=498     20×(2+2×248)
file:///C:\Users\DELL\AppData\Local\Temp\ksohtml\wps7A50.tmp.jpg                DJNZ R7,$                           2个                 2×248=496
                DJNZ R6,D1                            2个   2×20=40    10002
因此,上面的延时程序时间为10.002ms。
10002=2+(2+2*248)*20+40
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY:                        MOV R5,#20
D1:                                MOV R6,#20
D2:                                MOV R7,#248
                                DJNZ R7,$
                                DJNZ R6,D2
                                DJNZ R5,D1
                                RET
2P1.0端口输出高电平,即P1.01时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.00时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.                       程序框图
          如图4.1.2所示               
6.                       汇编源程序
                        ORG 0        
; ORG 的意思是什么就是
值不同跟系统程序存贮器地址有关. 以上面的程序来讲ORG 0000H接下来写的程序都在0000H后。ORG 2000H也一样。(如果ROM够大的话)
START:                CLR P1.0
                        LCALL DELAY  
; “调用”(ACALLLCALL)一下,避免重复编写也节省程序存储空间,子程序的最后都要放一条返回指令既“RET”。
                        SETB P1.0           ;使P1.0变为1。灯亮。
                        LCALL DELAY
                        LJMP START        ;转入主程序
DELAY:                MOV R5,#20              ;延时子程序,延时0.2
D1:                        MOV R6,#20
D2:                        MOV R7,#248
                        DJNZ R7,$
                        DJNZ R6,D2
                        DJNZ R5,D1
                        RET
                        END
7.                       C语言源程序
#include <AT89X51.H>
sbit D1=P1^0;           //定义一个变量D1,值是P1的第一个口
void delay02s(void)                //延时0.2秒子程序  2*(20*20*248)/(1000*1000)
{
  unsigned char i,j,k;
  for(i=20;i>0;i--)
  for(j=20;j>0;j--)
  for(k=248;k>0;k--);
}
void main(void)
{
  while(1)
    {
      D1=0;                //灯亮
      delay02s();
      D1=1;                //灯灭
      delay02s();
    }
}

图片1.png (35.31 KB, 下载次数: 44)

原理图

原理图

图片2.png (11.88 KB, 下载次数: 50)

程序框图

程序框图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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