永发信息网

串口通信程序

答案:2  悬赏:20  手机版
解决时间 2021-04-25 15:01
  • 提问者网友:焚苦与心
  • 2021-04-24 14:51

单片机采集键盘输入的密码 通过232 串口方式1  给上位机发送信息 上位机只要显示密码 有一个确认键清零就可以了

最佳答案
  • 五星知识达人网友:怀裏藏嬌
  • 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;    } }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯