怎样将51单片机实验板的按键信号传给PC啊。比如按一个键,51给PC发送一个'a'字符。
3个回答
展开全部
同学你好,我来帮你,你可以使用串口啊,比如: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;
}
}
}
不懂得欢迎交流
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;
}
}
}
不懂得欢迎交流
展开全部
我给你段程序,我写的,还有上位机的,一个数据采集与控制的,有你需要东西,这里有照片http://www.baidu.com/p/tm790116?from=super
..........
这是初始化程序
;--------------------------------------------------
; 初始化程序
;--------------------------------------------------
CSH: NOP
NOP
MOV R0,#38H
MOV R1,#8
MOV A,#00H
CSHH: MOV @R0,A
INC R0
DJNZ R1,CSHH
MOV 20H,#0FFH ;按键数据
MOV 2DH,#0FFH ;输出控制
MOV 4FH,#01H ;本机地址号
MOV 40H,#01H ;查询指针
;----------串口初始化----------
;定时器工作设置
MOV TMOD,#20H;T1为模式2
MOV TH1,#0F3H;波特率为2400
MOV TL1,#0F3H
;串口设置
MOV SCON,#50H;UART工作在MODE1,SM1=1 REN=1
;程序参数初始化
SETB TR1
MOV IE,#100100000B
SETB ES
SETB EA
SETB TR1
JMP ZCX
MOV P2,#00H
MOV R3,#00
MOV 49H,#1DH
CS2: MOV R0,#30H
MOV 48H,#08H
CS1: NOP
MOV A,R3
MOV @R0,A
INC R0
DJNZ 48H,CS1
MOV 4AH,#70H
CS3: NOP
CALL DSPLAY
DJNZ 4AH,CS3
INC R3
DJNZ 49H,CS2
MOV 30H,#0AH
MOV 31H,#19H
MOV 32H,#08
MOV 33H,#09
MOV 34H,#0CH
MOV 35H,#05
MOV 36H,#02
;--------------------------------------------------
; 主程序程序
;--------------------------------------------------
ZCX: NOP ;
CALL DSPLAY ;调用显示子程序
CALL CXCX ;调用查询子程序
NOP ;
JNB P3.7,BDYX ;本地还是远程控制
JMP ZCX1 ;
BDYX: NOP ;JNB P3.7,BDYX
CALL KEY ;本地是否有按键动作
MOV P1,20H ;
CALL BJ ;高用比较子程序
ZCX1: JMP ZCX
...............
这是串口发通信子程序
;-----------------------------------------------
;串口中断处理程序
;-----------------------------------------------
CKZD: NOP ;串口中断
CLR EA
JBC RI,UART ;
CLR TI ;
JMP FSCX ;
UART: MOV R6,#07 ;接收八位数据
MOV R0,#50H ;
TXCL: CLR RI ;
MOV @R0,SBUF ;第一位数 是否为本机地址,是则接收数据,不是则退出
MOV R3,#250 ;是否是干扰信号是则退出
TXYS1: MOV R4,#250 ;
TX1: JB RI,TX2 ;
DJNZ R4,TX1 ;
DJNZ R3,TXYS1 ;
JMP UARTCK11 ;
TX2: INC R0 ;
MOV @R0,SBUF ;数据存入50-57H
CLR RI ;
DJNZ R6,TX1 ;
MOV A,50H
CJNE A,#1BH,UARTCK11 ;联络信号
MOV A,4FH ;50H为本机地址号
CJNE A,51H,UARTCK11 ;判断是否为本机,是则下行,不是则放弃处理
MOV A,52H ;第一位数为指令
CJNE A,#01H,UART1 ;指令为1是显示复制子程序
CALL XSFZ ;显示复制子程序
JMP UARTCK11 ;
UART1: CJNE A,#02H,UART2 ;
MOV 54H,2DH ;
JMP FSCX ;
UART2: CJNE A,#03H,UART3 ;
MOV 20H,54H ;
MOV 2DH,54H
JMP UARTCK11 ;
UART3:
UARTCK11: SETB EA
RETI
还有什么问题,可以加我,291918938
..........
这是初始化程序
;--------------------------------------------------
; 初始化程序
;--------------------------------------------------
CSH: NOP
NOP
MOV R0,#38H
MOV R1,#8
MOV A,#00H
CSHH: MOV @R0,A
INC R0
DJNZ R1,CSHH
MOV 20H,#0FFH ;按键数据
MOV 2DH,#0FFH ;输出控制
MOV 4FH,#01H ;本机地址号
MOV 40H,#01H ;查询指针
;----------串口初始化----------
;定时器工作设置
MOV TMOD,#20H;T1为模式2
MOV TH1,#0F3H;波特率为2400
MOV TL1,#0F3H
;串口设置
MOV SCON,#50H;UART工作在MODE1,SM1=1 REN=1
;程序参数初始化
SETB TR1
MOV IE,#100100000B
SETB ES
SETB EA
SETB TR1
JMP ZCX
MOV P2,#00H
MOV R3,#00
MOV 49H,#1DH
CS2: MOV R0,#30H
MOV 48H,#08H
CS1: NOP
MOV A,R3
MOV @R0,A
INC R0
DJNZ 48H,CS1
MOV 4AH,#70H
CS3: NOP
CALL DSPLAY
DJNZ 4AH,CS3
INC R3
DJNZ 49H,CS2
MOV 30H,#0AH
MOV 31H,#19H
MOV 32H,#08
MOV 33H,#09
MOV 34H,#0CH
MOV 35H,#05
MOV 36H,#02
;--------------------------------------------------
; 主程序程序
;--------------------------------------------------
ZCX: NOP ;
CALL DSPLAY ;调用显示子程序
CALL CXCX ;调用查询子程序
NOP ;
JNB P3.7,BDYX ;本地还是远程控制
JMP ZCX1 ;
BDYX: NOP ;JNB P3.7,BDYX
CALL KEY ;本地是否有按键动作
MOV P1,20H ;
CALL BJ ;高用比较子程序
ZCX1: JMP ZCX
...............
这是串口发通信子程序
;-----------------------------------------------
;串口中断处理程序
;-----------------------------------------------
CKZD: NOP ;串口中断
CLR EA
JBC RI,UART ;
CLR TI ;
JMP FSCX ;
UART: MOV R6,#07 ;接收八位数据
MOV R0,#50H ;
TXCL: CLR RI ;
MOV @R0,SBUF ;第一位数 是否为本机地址,是则接收数据,不是则退出
MOV R3,#250 ;是否是干扰信号是则退出
TXYS1: MOV R4,#250 ;
TX1: JB RI,TX2 ;
DJNZ R4,TX1 ;
DJNZ R3,TXYS1 ;
JMP UARTCK11 ;
TX2: INC R0 ;
MOV @R0,SBUF ;数据存入50-57H
CLR RI ;
DJNZ R6,TX1 ;
MOV A,50H
CJNE A,#1BH,UARTCK11 ;联络信号
MOV A,4FH ;50H为本机地址号
CJNE A,51H,UARTCK11 ;判断是否为本机,是则下行,不是则放弃处理
MOV A,52H ;第一位数为指令
CJNE A,#01H,UART1 ;指令为1是显示复制子程序
CALL XSFZ ;显示复制子程序
JMP UARTCK11 ;
UART1: CJNE A,#02H,UART2 ;
MOV 54H,2DH ;
JMP FSCX ;
UART2: CJNE A,#03H,UART3 ;
MOV 20H,54H ;
MOV 2DH,54H
JMP UARTCK11 ;
UART3:
UARTCK11: SETB EA
RETI
还有什么问题,可以加我,291918938
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用串口通信,在主程序里加键盘检测,检测到按下之后就发送给PC
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询