【51单片机实验】3-单片机并行口与中断系统应用(附Proteus电路)

目录

一、实验目的

二、实验设备

三、实验内容

四、写在最后

本实验对应的实验报告


一、实验目的

  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秒延时

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

代码分析:

内层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秒定时

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

代码分析:

采用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——外接拨位开关

//拨动开关触发中断
#include <reg51.h>
void x_int() interrupt 0	/*中断服务函数*/
{
	P1 = (P1>>1) | 0x80;
	if(P1 == 0xff)
	{
		P1 = 0x7f;
	}	
}
void main()
{
	P1 = 0xfe;
	EA = 1;	/*开中断总开关*/
	EX0 = 1;	/*允许INTO中断*/
	IT0 = 1;   /*下降沿产生中断*/
	while(1);  /*等待中断*/
}

电路仿真:

方式2——外接按键

//按动按键触发中断
#include <reg51.h>
void x_int() interrupt 0	/*中断服务函数*/
{
	P1 = (P1>>1) | 0x80;
	if(P1 == 0xff)
	{
		P1 = 0x7f;
	}	
}
void main()
{
	P1 = 0xfe;
	EA = 1;	/*开中断总开关*/
	EX0 = 1;	/*允许INTO中断*/
	IT0 = 1;   /*下降沿产生中断*/
	while(1);  /*等待中断*/
}

电路仿真:

代码分析:

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


四、写在最后

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

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


版权声明:本文为weixin_46453773原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。