目录
一、实验目的
二、实验设备
三、实验内容
四、实验总结
本实验对应实验报告
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
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小灯共阳极)
2、P1接2个按键或拨位开关,一个按键为加1键,另一个为减1 键。P2接8个发光LED。编程实现按键状态的识别,变量的加1或减1操作。并通过串行口实现自发、自收。并将接收到的内容显示在P2口 的LED上。( 注:比较按键加消抖和不加消抖的区别)
程序及必要的注释:
/*P1.0、P1.1接两个开关控制加、减*/
#include
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小灯共阳极)
通常我们所使用的按键所用开关为机械弹性开关,由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随着一连串的抖动。这种抖动将会引起一次按键被误读为多次,从而对实验的现象造成影响,实验二中的P1.0和P1.1接两个按键,按动一次就有可能出现加了多次或者减了多次的现象,当然如果是在Proteus上进行软件仿真的话,没有按键的抖动也就没有这种错误的现象出现了。
消除按键抖动的方法有两种:分别为硬件消抖、软件消抖。硬件消抖是采用RS触发器电路或者RC积分电路;软件消抖是当检测出按键闭合之后执行一个10ms~20ms的延时程序,然后再次检测按键的状态,如果仍然保持闭合状态,则确认真正有按键按动而非抖动,执行相应的操作。
好了,以上就是本次实验的全部内容,对应的实验报告正在上传,上传成功后会在目录中放上相应资源的链接,有需要的小伙伴可以进行查看哦~
临近暑假,也请不要忘记学习,要多读书,多看报,少刷手机,多睡觉。㊗小伙伴们暑假快乐充实( •̀ ω •́ )✧
还有一句,不要在意封面!不要在意封面!不要在意封面!纯粹是我个人磕上头了,谁让这俩人一天都不消停呢~