单片机采集键盘输入的密码 通过232 串口方式1 给上位机发送信息 上位机只要显示密码 有一个确认键清零就可以了
串口通信程序
- 提问者网友:焚苦与心
- 2021-04-24 14:51
- 五星知识达人网友:怀裏藏嬌
- 2021-04-24 16:17
根据你的要求,写了几个简单的子函数。
#include<reg52.h>
#define N 6 //方便修改密码的长度
sbit key=P1^0; //确定发送密码,发送完后将密码清0
unsigned char i,a[N]; //定义数组来存放密码
void serial_init()//串口初始化
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd; //波特率为9600,标准波特率
TL1=0xfd;
TR1=1; //启动定时器1
PCON&=0x7f; //SMOD=0,这里不需要倍频
SCON=0x40; //设置串口为工作方式1
}
void serial_send() //串口发送函数
{
for(i=0;i<N;i++)
{
TI=0; //串口发送完毕标志位清0
SBUF=a[i]; //发送数组中存放的密码字符
while(!TI); //等待发送完毕
}
}
void keyscan() //键盘扫描
{
if(!key) //用独立键盘简单举例,按下为低电平
{
delay(10);//延时10毫秒,去抖。delay()函数省略
if(!key)
{
while(!key); //松手监测
serial_send(); //发送密码
for(i=0;i<N;i++) //发送完毕清0
a[i]=0;
}
}
}
void main()
{
serial_send() ;
while(1)
{
keyscan() ;
}
}
大概就是这个思路,你可以把密码键盘的值都写在keyscan()函数里,可以加删除键(密码输错可以退格),最好加个显示,密码虽然不能显示出来,但还是要显示输入的个数吧。还有个要提醒你的,就是上位机软件的编写,下位机发送的格式要与上位机接收的格式对应(字符或者数字)。
- 1楼网友:夜风逐马
- 2021-04-24 17:13
//===================================================================== // 多机通讯主机程序 //zhuji.c //writer:谷雨 2008年3月22日于EDA实验室 //注:主机先发送地址,接收到应答后,再发送数据 //=====================================================================
#include<reg52.h>
#define addr1 0x31 //从机1地址 #define addr2 0x32 //从机2地址
unsigned char xx[10]; unsigned char p = 0;
void delay_1ms(unsigned int i) { unsigned char j; while ((i--)!=0) {for (j=0;j<125;j++);} } void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0xF3; TL1 = 0xF3;
PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 SM2 = 0; TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许
} void Serial_INT() interrupt 4 { if(!RI) return;
ES = 0; RI = 0; xx[p] = SBUF; p++; ES = 1; } void send_addr(unsigned char addr) //发送地址 { p = 0; TB8 = 1; //发送地址帧 SBUF=addr; //发送地址 while(!TI); //等待发送完毕 TI=0; //软件复位TI } void send_data(unsigned char ddata) //发送数据 { TB8=0; //发送数据帧 SBUF=ddata; //发送数据 while(!TI); TI=0; //软件复位TI }
void main() { Uart_Init(); delay_1ms(2000); while(1) { send_addr(addr1); //向从机1发地址 send_data(0x33); send_data(0x01);
delay_1ms(500); if(xx[9]=='0') P1=0xaa;
delay_1ms(500);
send_addr(addr2); //向从机2发地址 send_data(0x33); send_data(0x01);
delay_1ms(500); if(xx[9]=='9') P1=0x55;
delay_1ms(500); } // while(1); }
//===================================================================== // 多机通讯从机1程序 //cong1.c //writer:谷雨 2008年3月22日于EDA实验室 //注: //=====================================================================
#include<reg52.h> #define addr 0x31 //从机1地址
unsigned char receive; unsigned char xx[ ]={"1234567890"};
void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0xF3; TL1 = 0xF3;
PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收
TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许
}
void Serial_INT() interrupt 4 { if(!RI) return; RI=0; if(RB8==1) { if(SBUF==addr) SM2=0; else SM2=1; } if(RB8==0) receive=SBUF; }
void SendOneByte(unsigned char c) { TB8=0; SBUF = c; while(!TI); TI = 0; } void SendListChar(unsigned char *DData,unsigned char Ef) { unsigned char L=0;
if(Ef!=0) { for( ;L<Ef;L++) //显示有效长度 SendOneByte(DData[L]); //发送单个字符 }else while (DData[L]!='\0') //发送至字串结束 { SendOneByte(DData[L]); //发送单个字符 L++; //下一个字符 } }
void main() { Uart_Init(); while(1) { switch(receive) { case 0xff: break; case 0x01: //在此可以写入要完成的动作,最多可完成256个动作 SendListChar(xx,0); break; case 0x02: break; case 0x33: P1=!P1; //为方便其间,赋值给P1口,测P1口电平来检测该程序 break; default: break; } receive=0xff; } }