【51单片机实验】5-串行接口与键盘接口技术应用(附Proteus电路)

目录

一、实验目的

二、实验设备

三、实验内容

四、实验总结

本实验对应实验报告


一、实验目的

1.掌握51单片机串行口的应用设计

2.掌握按键的工作原理和消抖动的方法


二、实验设备

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

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

3、Proteus仿真软件


三、实验内容

1、P1接8个按键或拨位开关,P2接8个发光LED,编程实现读入单片机P1状态,通过串行方式1实现自发、自收,并将接收到的内容从P2口的LED显示出来。(注意:TXD(P3.1)和RXD(P3.0)的接线。—实验箱的要求,仿真请忽略)

程序及必要的注释:

/*单片机自发自收,将P1口信息传给P2口*/
#include<reg51.h>
void main ()
{
	SCON = 0x50;	/*SCON=0101 0000,REN=1串口工作在方式一*/
	TMOD = 0x21;	/*T1方式二,T0方式一*/
	TH1 = 0xfd;
	TL1 = 0xfd;     /*设置波特率*/
	TR1 = 1;		/*启动T1定时*/
	while (1)
	{
		TI = 0;		 	/*扩展*/
		SBUF = P1;		/*把P1传给SBUF*/
		while (TI! = 1);
		TI = 0;			/*发送成功,发送中断标志位TI清零*/
		while (RI! = 1);
		RI = 0;			/*接收成功,接收中断标志位RI清零*/
		P2 = SBUF;		/*把SBUF传给P2,然后通过LED小灯显示*/
	}
}

分析与验证:

题目分析:根据题目中的要求,把单片机的TXD(P3.1)和RXD(P3.0)两个串行通信接口连接在一起,使得单片机的输出成为单片机的输入,实现自发自收。P1口连接8个拨位开关,P2口连接8个LED小灯,调整拨位开关,在LED小灯上可以把拨位开关的状态显示出来。

代码分析:将串行控制寄存器SCON的值设为0x50,即SM0SM1=01,REN为1,使得串口工作在方式一;定时器模式寄存器TMOD的值设为0x21,即定时器T1工作在方式二、T0工作在方式一;计算T1的重载值,使得定时器初值等于重载值,同时启动定时器定时;然后把P1口的状态传给发送SBUF,发送成功后把发送中断标志位TI清零;P2口进行接收,接收成功后把接收中断标志位RI清零,然后把P2口的状态传给接收SBUF;动态停机。

程序实现的功能:P1接拨位开关,P2接8个LED,调整拨位开关把开关的状态在LED上进行显示。

以下为Proteus仿真电路图(P3.0和P3.1短接,LED小灯共阳极)

P1=1010 1010​​​
P1=1111 0000
P1=1100 1100

2、P1接2个按键或拨位开关,一个按键为加1键,另一个为减1 键。P2接8个发光LED。编程实现按键状态的识别,变量的加1或减1操作。并通过串行口实现自发、自收。并将接收到的内容显示在P2口 的LED上。( 注:比较按键加消抖和不加消抖的区别)

程序及必要的注释:

/*P1.0、P1.1接两个开关控制加、减*/
#include<reg51.h>
sbit K1 = P1^0;
sbit K2 = P1^1;
unsigned char sub,add;

void main ()
{
	SCON = 0x50;	/*SCON=0101 0000,REN=1串口工作在方式一*/
	TMOD = 0x21;	/*T1方式二,T0方式一*/
	TH1 = 0xfd;		/*计算T1重载值*/
	TL1 = 0xfd;      /*设置波特率*/
	TR1 = 1;			/*启动T1定时*/
	P2 = 0xff;		/*设置LED小灯初值*/
	add = K1;		/*K1-P1.0控制+*/
	sub = K2;  		/*K2-P1.1控制-*/
	while (1)
	{
		T1 = 0;
		SBUF = K1;	/*把P1状态传给SBUF*/
		while (!TI);	//等待发送完成
		TI = 0;		//发送成功,TI清零
		while (!RI); 	//等待接收完成
		RI = 0;		//接收成功,RI清零
		if (add!= SBUF)
		{
			P2 = (~P2) + 1;
			P2 = ~P2;
			add = SBUF;		//+1
		}
		TI = 0;
		SBUF = K2;
		while (!TI);
		TI = 0;
		while (!RI);
		RI = 0;
		if (sub !=SBUF)
		{
			P2 =(~P2)-1;
			P2 = ~P2;
			sub = SBUF;		//-1
		}
	}
}

分析与验证:本题较题目一而言,只需在动态停机的while循环中添加控制P1.0加和控制P1.1减的两段代码即可。其中添加的两个if判断语句是为了判断P1.0和P1.1所连接的拨位开关状态是否发生变化,如果发生了变化则分别执行加、减操作。

程序实现的功能:初始时小灯值为零全灭,拨一次P1.0所连接的开关,小灯所代表的数值加一,拨一次P1.1所连接的开关,小灯所代表的数值减一。

以下为Proteus仿真电路图(P3.0和P3.1短接,LED小灯共阳极)

初始状态如下:P2=0xFF,LED小灯全灭
拨动P1.0连接的开关一次
拨动P1.1连接的开关一次

拨动P1.0连接的开关一次

四、实验总结

通常我们所使用的按键所用开关为机械弹性开关,由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随着一连串的抖动。这种抖动将会引起一次按键被误读为多次,从而对实验的现象造成影响,实验二中的P1.0和P1.1接两个按键,按动一次就有可能出现加了多次或者减了多次的现象,当然如果是在Proteus上进行软件仿真的话,没有按键的抖动也就没有这种错误的现象出现了。

消除按键抖动的方法有两种:分别为硬件消抖软件消抖。硬件消抖是采用RS触发器电路或者RC积分电路;软件消抖是当检测出按键闭合之后执行一个10ms~20ms的延时程序,然后再次检测按键的状态,如果仍然保持闭合状态,则确认真正有按键按动而非抖动,执行相应的操作。

好了,以上就是本次实验的全部内容,对应的实验报告正在上传,上传成功后会在目录中放上相应资源的链接,有需要的小伙伴可以进行查看哦~

临近暑假,也请不要忘记学习,要多读书,多看报,少刷手机,多睡觉。㊗小伙伴们暑假快乐充实( •̀ ω •́ )✧

还有一句,不要在意封面!不要在意封面!不要在意封面!纯粹是我个人磕上头了,谁让这俩人一天都不消停呢~

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是初九

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值