51单片机3键键盘电路图[只有三个按键,链接pc的]
发布网友
发布时间:2022-04-23 13:58
我来回答
共1个回答
热心网友
时间:2023-05-22 19:42
同学你好,我来帮你,你可以使用串口啊,比如:1:给你一个从PC发给单片机数据后,单片机再原样发给PC的参考代码:2:将51某一个(引脚)按键0,1状态,发给PC;
1::::::::::::::
#include <REG52.H>
bit Flag;
unsigned int R_D,S_D;
unsigned char i;
void usart_init(void); ///串口初始化
void main (void) {
usart_init(void); ///串口初始化
while(1)
{
if (Flag==1)
{
SBUF = S_D; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
Flag=0;
}
}
}
}
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
R_D = SBUF; //SUBF接受/发送缓冲器
S_D=R_D;///////返回PC发送
Flag=1;
}
}
void usart_init(void)///串口初始化
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3;// //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
2:::::::::::::
#include <REG52.H>
sbit p34=P3^4;////////定义一个按键
bit Flag=1;
unsigned int S_D;
unsigned char i;
void usart_init(void); ///串口初始化
void delay (unsigned int Z) ; //延时程序 Z倍 MS
void key_p34(void) ; /////按键检
void main (void) {
usart_init(void); ///串口初始化
key_p34(void) ; ////上电后检测一次按键的状态
if (Flag==1)//上电后发送一次按键的状态
{
SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
else
{
SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
while(1)
{
key_p34(void) ;
if (Flag==1)
{
SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
else
{
SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
}
}
void usart_init(void)///串口初始化
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3;// //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void delay (unsigned int Z)//延时程序 Z倍 MS
{
unsigned int x,y;
for(x=Z;x>0;x--)
for(y=110;y>0;y--) ;
}
void key_p34(void) /////按键检测
{
if(p34==0)
{ delay(10);
if(p34==0)
{
while(!p34) ;/////等待按键松手
Flag=0;
}
}
}