前言
实验1:在开关S0~S7上设置好两位十进制(学号的低两位)的BCD码,开机后在两个数码管上显示两位十进制数。
实验2:将甲机P1口接8个开关设置的两位十进制(学号的低两位)BCD码,能过串口传送给乙机,乙机将这两位十进制数在两个数码管上显示。
参考链接
实验一
Keil
和书上实现差不多,就是把按钮换成闭合开关,流水灯换成数码管。当P1.0为0,即总开关S按下,表示允许并行读入开关K0~K7的状态数字量,通过P1.1把SH/~(LD)置零,则并行读入开关K0~K7的状态。再让P1.1=1,即SH/~(LD)置1,74LS165将刚才读到的开关数字量状态通过QH端串行发送到单片机的SBUF(串口缓冲寄存器)中,在中断服务子程序中把SBUF中的数据读到nRxByte单元,送到C51单片机的P2端口,也就是你学号最后两位的BCD码,在数码管上显示。
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=0x90;
sbit P1_1=0x91;
uchar nRxByte;
void delay(uint i) //延迟函数
{
uchar j;
for(i;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++);
}
void main()
{
SCON=0x10; //串口初始化为方式0
ES=1; //允许串口中断
EA=1; //允许全局中断
while(1); //死循环等待中断
}
void Serial_Port() interrupt 4 //口中断服务子程序
{
if(P1_0==0) //如果开关按下,读开关状态
P1_1=0; //P1^1=0并行读入开关状态
delay(1);
P1_1=1; //P1^1=1将开关的状态串行读入串口中
RI=0; //接收中断标志PI清零
nRxByte=SBUF; //接收的开关状态数据从SBUF读入到nRxByte单元中
P2=nRxByte; //开关状态数据送到P2口,在数码管上显示学号的最后两位
}
Proteus
原理图把按钮换成闭合开关,流水灯换成数码管(7SEG-BCD-GRN)。
实验所需的元器件
运行结果:
实验二
Keil
这个把第二个AT89C51的流水灯部分换成数码管(7SEG-BCD-GRN)。两个芯片要分别编译两个HEX可执行文件。
//甲机串行发送
//甲机串行发送
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void main(){
uchar temp=0;
TMOD=0x20; //设置定时器T1工作在方式2
TH1=0xfd; //波特率9600
TL1=0xfd;
SCON=0x40; //串口初始化方式1发送,不接收
PCON=0x00; //SMOD=0
TR1=1; //启动T1
P1=0xff; //设置P1口为输入
while(1){
temp=P1;
SBUF=temp;
while(TI==0);
TI=0;
}
}
//乙机串行接收
//乙机串行接收
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void main(){
uchar temp=0;
TMOD=0x20; //设置定时器1工作在方式2
TH1=0xfd; //波特率9600
TL1=0xfd;
SCON=0x50; //设置串口方式1接收,REN=1
PCON=0X00; //SOMD=0
TR1=1; //启动T1
while(1){
while(RI==0); //若RI等于0,未接受到数据
RI=0; //接收到数据,将RI清零
temp=SBUF; //读取数据存入SBUF
P1=temp; //接受的数据送到P1口控制数码管显示学号的最后两位
}
}
Proteus
见实验(1)— 实验(3)
单片机实验(二 ) --CSDN (封奚泽优)https://blog.csdn.net/weixin_64066303/article/details/134479372?spm=1001.2014.3001.5502单片机实验(三)--CSDN(封奚泽优)https://blog.csdn.net/weixin_64066303/article/details/134624276?spm=1001.2014.3001.5502