当前位置:   article > 正文

【51单片机实验】3-单片机并行口与中断系统应用(附Proteus电路)_在at89s51的p1口上接有8只led,原理电路见下图。采用t0方式1的定时查询方式,使p1口

在at89s51的p1口上接有8只led,原理电路见下图。采用t0方式1的定时查询方式,使p1口

目录

一、实验目的

二、实验设备

三、实验内容

四、写在最后

本实验对应的实验报告


一、实验目的

  1. 掌握51单片机并行口的应用设计
  2. 掌握中断系统的使用方法和中断应用程序设计
  3. 熟悉单片机应用系统设计、调试以及软硬件联合调试的方法。

二、实验设备

1、微机一台,Keil C集成开发环境

2、DP-51PRO.NET综合实验箱

3、Proteus仿真软件

注:本实验报告采用的单片机为AT89C51,其晶振频率为12MHz


三、实验内容

1、51单片机的P1口接8个发光二极管LED,相邻的4个LED为一组,实现两组LED每隔1秒交替点亮一次,周而复始,画出电路,并用C51编写程序。

提示:1秒延时函数建议采用定时器编程实现。

方法1——for循环嵌套实现1秒延时

  1. //循环嵌套实现——8个LED小灯分两组交替亮
  2. #include <reg51.h>
  3. void main()
  4. {
  5. unsigned int i; /*范围为0~65535*/
  6. unsigned char j; /*范围为0~255*/
  7. P1 = 0xf0; /*LED灯初始状态*/
  8. while(1)
  9. {
  10. for(i=1000;i>0;i--)
  11. for(j=124;j>0;j--); /*循环实现1秒定时*/
  12. P1 = ~P1; /*换另一组小灯亮*/
  13. }
  14. }

代码分析:

内层for循环:for (j = 124; j > 0; j --)     循环124次,所消耗的时间为:124次×8个指令周期×1微秒 = 992微秒

外层for循环:for(i =1000; i > 0; i --)     循环1000次,将内层消耗的时间放大1000倍,还要加上自身所消耗的8个指令周期

for循环嵌套:总消耗的时间为:1000×(992+8)= 1秒,实现了1秒延时。

方法2——定时器T0模式1实现1秒定时

  1. //定时器实现——8个LED小灯分两组交替亮
  2. #include <reg51.h>
  3. void main()
  4. {
  5. unsigned char i = 10;
  6. P1 = 0xf0; /*设置P1口的初始状态,即LED灯初始亮灭状态*/
  7. TMOD = 0x01; /*T0方式1定时*/
  8. TR0 = 1; /*启动T0定时器*/
  9. while(1)
  10. {
  11. TH0 = 15536/256; /*设置定时高八位初值*/
  12. TL0 = 15535%256; /*设置定时低八位初值*/
  13. while(!TF0); /*查询TF0是否为1,以定时50ms*/
  14. TF0 = 0; /*TF软件清零*/
  15. i - -;
  16. if(i = = 0)
  17. {
  18. P1 = ~P1; /*P1口取反,使另外一组灯亮*/
  19. i = 20; /*对T0定时次数计数20次,实现1s定时*/
  20. }
  21. }
  22. }

代码分析:

采用16位计数/定时器最大定时为2^16×1微秒=65.536毫秒,不能直接满足定时1秒的要求,故而考虑先定时50毫秒,然后对定时50毫秒计数20次,从而实现1秒定时。

T0采用方式1(M1M0=01)16位定时方式,定时初值 = 2^16-50毫秒/1微秒 = 15536

设置定时器T0的初值,溢出时TF为1,然后TF软件清零,再对T0定时进行计数,实现了1秒定时。

电路仿真:

2、单片机P1口接8个发光二极管,/INT0引脚接一拨位开关或按键。开始P1.0对应LED亮,以后每中断一次,下一个LED亮,顺序下移且每次只有一个LED亮,周而复始,画出电路,并用C51编写程序。

思考:/INT0引脚直接接拨位开关或按键,现象有什么不同?如何去改进电路?

方式1——外接拨位开关

  1. //拨动开关触发中断
  2. #include <reg51.h>
  3. void x_int() interrupt 0 /*中断服务函数*/
  4. {
  5. P1 = (P1>>1) | 0x80;
  6. if(P1 == 0xff)
  7. {
  8. P1 = 0x7f;
  9. }
  10. }
  11. void main()
  12. {
  13. P1 = 0xfe;
  14. EA = 1; /*开中断总开关*/
  15. EX0 = 1; /*允许INTO中断*/
  16. IT0 = 1; /*下降沿产生中断*/
  17. while(1); /*等待中断*/
  18. }

电路仿真:

方式2——外接按键

  1. //按动按键触发中断
  2. #include <reg51.h>
  3. void x_int() interrupt 0 /*中断服务函数*/
  4. {
  5. P1 = (P1>>1) | 0x80;
  6. if(P1 == 0xff)
  7. {
  8. P1 = 0x7f;
  9. }
  10. }
  11. void main()
  12. {
  13. P1 = 0xfe;
  14. EA = 1; /*开中断总开关*/
  15. EX0 = 1; /*允许INTO中断*/
  16. IT0 = 1; /*下降沿产生中断*/
  17. while(1); /*等待中断*/
  18. }

电路仿真:

代码分析:

通过INT0引脚外接拨位开关,拨动开关形成外部中断,或者外接一按键,按动按键产生边沿信号形成外部中断,然后通过中断服务函数中的移位操作和逻辑运算等来改变LED小灯的状态。


四、写在最后

单片机这个东西学起来还真是有趣~(【狗头】)

如果你觉得这篇文章写的还不错的话,别忘记向小新竖起你的大拇指(点赞)哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/236883
推荐阅读
相关标签
  

闽ICP备14008679号