当前位置:首页 > 单片机
  • 指纹识别模块51单片机程序

    指纹识别模块51单片机程序

      硬件设计方案        本系统主要使用了指纹模块,MicroSD卡读写模块,PCF8563模块,蜂鸣器模块,矩阵按键模块,lcd1602,和STC90C516RD+   系统框图      1)指纹模块   采用FPM10A光学指纹模块。FPM10A光学指纹模块是经典的光学指纹模块,性能稳定,应用范围广,可选用TTL串口或USB接口,可使用51单片机   2)存储模块   方案一:采用EEPROM模块   EEPROM模块简单,采用iic通讯,但存储量小,寿命有限,没有锻炼价值,所以弃用。   方案二:采用MicroSD卡读写模块   MicroSD读写卡模块,采用SPI协议通讯,这个通讯协议还没接触过,且比EEPROM存储量大,使用普遍,所以本系统采用MicroSD读写卡模块。   3)实时时钟   采用PCF8563模块。该芯片比DS1302更为稳定,走时更准,功耗最低。   程序设计和设计思路   程序流程图      该项目实现签到,添加指纹,删除单个指纹,搜索指纹,和清空指纹等操作。   签到是搜索该指纹ID后,存储时间戳到MicroSD对应的扇区中,且蜂鸣器会响视为签到成功。功能选择使用4个按键,用循环向下选择的方式。添加指纹中,首先先获得指纹图像1,存储到buffer1中,再获得指纹图像2,存储到buffer2中,再写命令使buffer1和buffer2形成特征模板,再存入特定的ID中,最后初始化ID对应的MicroSD扇区。删除单个指纹和搜索指纹中,我使用两种方法找到该指纹的ID,一种是按键输入,还是用四个按键循环,二种是通过搜索指纹找到该指纹的ID,在按键指纹中需要判断该ID是否存在,通过在对应MicroSD卡设置标志位的方法,确定该ID是否在用,该标志位与指纹模块同步。搜索指纹找到ID后显示,对应ID的签到时间。清空指纹是清空指纹模块和对应的MicroSD卡扇区。

    时间:2020-08-06 关键词: 指纹识别 单片机

  • 单片机RS485通信接口、原理图、控制线

    单片机RS485通信接口、原理图、控制线

      RS485和RS232一样都是基于串口的通讯接口,数据收发的操作是一致的,所以使用的是同样WinCE的底层驱动程序。但是它们在实际应用中通讯模式却有着很大的区别,RS485接口为半双工数据通讯模式,而RS232接口为全双工数据通讯模式,数据的收发不能同时进行,为了保证数据收发的不冲突,硬件上是通过方向切换来实现的,相应也要求软件上必须将收发的过程严格地分开。   rs485特点汇总   采用差分信号。我们在讲 A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。尤其当工业现场环境比较复杂,干扰比较多时,采用差分方式可以有效的提高通信可靠性。RS485 采用两根通信线,通常用 A 和 B 或者 D+和 D-来表示。逻辑“1”以两线之间的电压差为+(0.2~6)V 表示,逻辑“0”以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信。   RS485 通信速率快,最大传输速度可以达到 10Mb/s 以上。   RS485 内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增加。   传输距离最远可以达到 1200 米左右,但是它的传输速率和传输距离是成反比的,只有在 100Kb/s 以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。   可以在总线上进行联网实现多机通信,总线上允许挂多个收发器,从现有的 RS485芯片来看,有可以挂 32、64、128、256 等不同个设备的驱动器。   RS485 的接口非常简单,与 RS232 所使用的 MAX232 是类似的,只需要一个 RS485转换器,就可以直接与单片机的 UART 串口连接起来,并且使用完全相同的异步串行通信协议。但是由于 RS485 是差分通信,因此接收数据和发送数据是不能同时进行的,也就是说它是一种半双工通信。   RS485 转换芯片很多,这节课我们以典型的 MAX485 为例讲解 RS485 通信,如图 18-1所示。      图 18-1 MAX485 硬件接口   MAX485 是美信(Maxim)推出的一款常用 RS485 转换器。其中 5 脚和 8 脚是电源引脚;6脚和 7 脚就是 RS485 通信中的 A 和 B 两个引脚;1 脚和 4 脚分别接到单片机的 RXD 和 TXD引脚上,直接使用单片机 UART 进行数据接收和发送;2 脚和 3 脚是方向引脚,其中 2 脚是低电平使能接收器,3 脚是高电平使能输出驱动器,我们把这两个引脚连到一起,平时不发送数据的时候,保持这两个引脚是低电平,让 MAX485 处于接收状态,当需要发送数据的时候,把这个引脚拉高,发送数据,发送完毕后再拉低这个引脚就可以了。为了提高 RS485 的抗干扰能力,需要在靠近 MAX485 的 A 和 B 引脚之间并接一个电阻,这个电阻阻值从 100欧到 1K 都是可以。   在这里我们还要介绍一下如何使用 KST-51 单片机开发板进行外围扩展实验。我们的开发板只能把基本的功能给同学们做出来提供实验练习,但是同学们学习的脚步不应该停留在这个实验板上。如果想进行更多的实验,就可以通过单片机开发板的扩展接口进行扩展实验。大家可以看到蓝绿色的单片机座周围有 32 个插针,这 32 个插针就是把单片机的 32 个 IO 引脚全部都引出来了。在原理图上体现出来的就是 J4、J5、J6、J7 这 4 个器件,如图 18-2 所示。      图 18-2 单片机扩展接口   这 32 个 IO 口中并不是所有的都可以用来对外扩展,其中既作为数据输出,又可以作为数据输入的引脚是不可以用的,比如 P3.2、P3.4、P3.6 引脚,这三个引脚是不可用的。比如P3.2 这个引脚,如果我们用来扩展,发送的信号如果和 DS18B20 的时序吻合,会导致 DS18B20拉低引脚,影响通信。除这 3 个 IO 口以外的其它 29 个,都可以使用杜邦线接上插针,扩展出来使用。当然了,如果把当前的 IO 口应用于扩展功能了,板子上的相应功能就实现不了了,也就是说需要扩展功能和板载功能之间二选一。   在进行 RS485 实验中,我们通信用的引脚必须是 P3.0 和 P3.1,此外还有一个方向控制引脚,我们使用杜邦线将其连接到 P1.7 上去。RS485 的另外一端,大家可以使用一个 USB转 RS485 模块,用双绞线把开发板和模块上的 A 和 B 分别对应连起来,USB 那头插入电脑,然后就可以进行通信了。   学习了第 13 章实用的串口通信方法和程序后,做这种串口通信的方法就很简单了,基本是一致的。我们使用实用串口通信例程的思路,做了一个简单的程序,通过串口调试助手下发任意个字符,单片机接收到后在末尾添加“回车+换行”符后再送回,在调试助手上重新显示出来,先把程序贴出来。   程序中需要注意的一点是:因为平常都是将 MAX485 设置为接收状态,只有在发送数据的时候才将 MAX485 改为发送状态,所以在 UartWrite()函数开头将 MAX485 方向引脚拉高,函数退出前再拉低。但是这里有一个细节,就是单片机的发送和接收中断产生的时刻都是在停止位的一半上,也就是说每当停止位传送了一半的时候,RI 或 TI 就已经置位并且马上进入中断(如果中断使能的话)函数了,接收的时候自然不会存在问题,但发送的时候就不一样了:当紧接着向 SBUF 写入一个字节数据时,UART 硬件会在完成上一个停止位的发送后,再开始新字节的发送,但如果此时不是继续发送下一个字节,而是已经发送完毕了,要停止发送并将 MAX485 方向引脚拉低以使 MAX485 重新处于接收状态时就有问题了,因为这时候最后的这个停止位实际只发送了一半,还没有完全完成,所以就有了 UartWrite()函数内DelayX10us(5)这个操作,这是人为的增加了 50us 的延时,这 50us 的时间正好让剩下的一半停止位完成,那么这个时间自然就是由通信波特率决定的了,为波特率周期的一半。      /****************************RS485.c 文件程序源代码*****************************/   #include 《reg52.h》   #include 《intrins.h》   sbit RS485_DIR = P1^7; //RS485 方向选择引脚   bit flagFrame = 0; //帧接收完成标志,即接收到一帧新数据   bit flagTxd = 0; //单字节发送完成标志,用来替代 TXD 中断标志位   unsigned char cntRxd = 0; //接收字节计数器   unsigned char pdata bufRxd[64]; //接收字节缓冲区   extern void UartAcTIon(unsigned char *buf, unsigned char len);   /* 串口配置函数,baud-通信波特率 */   void ConfigUART(unsigned int baud){   RS485_DIR = 0; //RS485 设置为接收方向   SCON = 0x50; //配置串口为模式 1   TMOD &= 0x0F; //清零 T1 的控制位   TMOD |= 0x20; //配置 T1 为模式 2   TH1 = 256 - (11059200/12/32)/baud; //计算 T1 重载值   TL1 = TH1; //初值等于重载值   ET1 = 0; //禁止 T1 中断   ES = 1; //使能串口中断   TR1 = 1; //启动 T1   }   /* 软件延时函数,延时时间(t*10)us */   void DelayX10us(unsigned char t){   do {   _nop_();   _nop_();   _nop_();   _nop_();   _nop_();   _nop_();   _nop_();   _nop_();   } while (--t);   }   /* 串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度 */   void UartWrite(unsigned char *buf, unsigned char len){   RS485_DIR = 1; //RS485 设置为发送   while (len--){ //循环发送所有字节   flagTxd = 0; //清零发送标志   SBUF = *buf++; //发送一个字节数据   while (!flagTxd); //等待该字节发送完成   }   DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定   RS485_DIR = 0; //RS485 设置为接收   }   /* 串口数据读取函数,buf-接收指针,len-指定的读取长度,返回值-实际读到的长度 */   unsigned char UartRead(unsigned char *buf, unsigned char len){   unsigned char i;   //指定读取长度大于实际接收到的数据长度时,   //读取长度设置为实际接收到的数据长度   if (len 》 cntRxd){   len = cntRxd;   }   for (i=0; i《len; i++){ //拷贝接收到的数据到接收指针上   *buf++ = bufRxd[i];   }   cntRxd = 0; //接收计数器清零   return len; //返回实际读取长度   }   /* 串口接收监控,由空闲时间判定帧结束,需在定时中断中调用,ms-定时间隔 */   void UartRxMonitor(unsigned char ms){   staTIc unsigned char cntbkp = 0;   staTIc unsigned char idletmr = 0;   if (cntRxd 》 0){ //接收计数器大于零时,监控总线空闲时间   if (cntbkp != cntRxd){ //接收计数器改变,即刚接收到数据时,清零空闲计时   cntbkp = cntRxd;   idletmr = 0;   }else{ //接收计数器未改变,即总线空闲时,累积空闲时间   if (idletmr 《 30){ //空闲计时小于 30ms 时,持续累加   idletmr += ms;   if (idletmr 》= 30){ //空闲时间达到 30ms 时,即判定为一帧接收完毕   flagFrame = 1; //设置帧接收完成标志   }   }   }   }else{   cntbkp = 0;   }   }   /* 串口驱动函数,监测数据帧的接收,调度功能函数,需在主循环中调用 */   void UartDriver(){   unsigned char len;   unsigned char pdata buf[40];   if (flagFrame){ //有命令到达时,读取处理该命令   flagFrame = 0;   len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中   UartAction(buf, len); //传递数据帧,调用动作执行函数   }   }   /* 串口中断服务函数 */   void InterruptUART() interrupt 4{   if (RI){ //接收到新字节   RI = 0; //清零接收中断标志位   //接收缓冲区尚未用完时,保存接收字节,并递增计数器   if (cntRxd 《 sizeof(bufRxd)){   bufRxd[cntRxd++] = SBUF;   }   }   if (TI){ //字节发送完毕   TI = 0; //清零发送中断标志位   flagTxd = 1; //设置字节发送完成标志   }   }   /*****************************main.c 文件程序源代码******************************/   #include 《reg52.h》   unsigned char T0RH = 0; //T0 重载值的高字节   unsigned char T0RL = 0; //T0 重载值的低字节   void ConfigTimer0(unsigned int ms);   extern void UartDriver();   extern void ConfigUART(unsigned int baud);   extern void UartRxMonitor(unsigned char ms);   extern void UartWrite(unsigned char *buf, unsigned char len);   void main(){   EA = 1; //开总中断   ConfigTimer0(1); //配置 T0 定时 1ms   ConfigUART(9600); //配置波特率为 9600   while (1){   UartDriver(); //调用串口驱动   }   }   /* 串口动作函数,根据接收到的命令帧执行响应的动作   buf-接收到的命令帧指针,len-命令帧长度 */   void UartAction(unsigned char *buf, unsigned char len){   //在接收到的数据帧后添加换车换行符后发回   buf[len++] = ‘ ’;   buf[len++] = ‘ ’;   UartWrite(buf, len);   }   /* 配置并启动 T0,ms-T0 定时时间 */   void ConfigTimer0(unsigned int ms){   unsigned long tmp; //临时变量   tmp = 11059200 / 12; //定时器计数频率   tmp = (tmp * ms) / 1000; //计算所需的计数值   tmp = 65536 - tmp; //计算定时器重载值   tmp = tmp + 33; //补偿中断响应延时造成的误差   T0RH = (unsigned char)(tmp》》8); //定时器重载值拆分为高低字节   T0RL = (unsigned char)tmp;   TMOD &= 0xF0; //清零 T0 的控制位   TMOD |= 0x01; //配置 T0 为模式 1   TH0 = T0RH; //加载 T0 重载值   TL0 = T0RL;   ET0 = 1; //使能 T0 中断   TR0 = 1; //启动 T0   }   /* T0 中断服务函数,执行串口接收监控 */   void InterruptTimer0() interrupt 1{   TH0 = T0RH; //重新加载重载值   TL0 = T0RL;   UartRxMonitor(1); //串口接收监控   }

    时间:2020-08-06 关键词: 通信接口 单片机 rs485

  • 51单片机与esp8266例程实现的LED无线控制

      一、关于51单片机和无线WIFI模块的接线方面   RXD、TXD、GND和51单片机的TXD、RXD、GND接好,模块其他引脚均为高电平,电源VCC是3.3V左右(两节1.5v干电池),本人由于没有稳压模块,偷懒了当时使用5V的直流源,测试结果目前没有问题(不过不建议啊!)   二、关于安卓手机方面   测试时可以使用,网络调试助手(下载这个app安装在手机即可)发送数字1表示小灯亮,0表示灯灭。后续想深入的话可以自己开发安卓app软件。   三、参数设置   由于参数的设置方法和步奏网上资料很全,这里提供相关的网址自行参考。   Uart-WiFi模块ESP8266把玩记http://www.51hei.com/bbs/dpj-30277-1.html   物联网wifi模块工作的STA和AP模式详细介绍http://www.hx-wulian.com/archives/239   四、资料可能存在不足之处,仅作参考!   /*********************************************************************   题目:基于STC12C560S2 单片机无线WIFI模块控制   内容:通过MCU上位机对ESP8266wifi模块的控制和设置,实现手机端控制LED灯   的亮灭。   注意:该型号单片机是普通89C51单片执行速度的12倍,内含RAM1280字节,ROM为60K,PCA 计数器,PWM发生模块,ADC转换模块等,晶振一定是11.0592MHz。   ********************************************************************/   #include 《reg52.h》 //包含头文件   #define uint unsigned int   #define uchar unsigned char   #define RELOAD_COUNT 0xFA //宏定义波特率发生器的载入值   //define RELOAD_COUNT (256-(((11520000/16)/12)/9600)) 也可以或波特率9600 //256-晶振频率/波特率x16=BRT   /*****************LED灯对应P0口的1个端口*************/   sbit LED0=P3^2;   /************波特率发生器相关功能寄存器的定义****************/   sfr AUXR=0x8E;   sfr BRT=0x9C;   sfr AUXR1=0xA2;   /*****************相关变量**************/   uchar Receive,i;   uint n;   uchar Recive_table[15]; //用于接收wifi模块反馈到MCU上的数据   /*******************************************************************   名称:延时函数   作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待。。.。。.。   ********************************************************************/   void ms_delay(uint t)   {   uint i,j;   for(i=t;i》0;i--)   for(j=110;j》0;j--);   }   void us_delay(uchar t)   {   while(t--);   }   /********************************************************************   名称:波特率发生器函数   作用:波特率发生器可以是T1定时器实现,也可以是MCU内部独立的波特率发生器,   各自不同的载入值计算式,具体根据寄存器相关设置来参考计算,以实现   异步串行通讯。(经测试,两种设置方式均可用,可任选一种。)   ********************************************************************/   void Uart_Init()//使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)   {   SCON=0x50; //设置为串行口以方式1工作,8位异步通讯,允许接收中断。   //一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。   PCON=0x80; //SMOD波特率选择位为1,SMOD=1.   TMOD=0x21; //设置定时器1为波特率发生器,工作在模式2,8位自动装载   TH1=RELOAD_COUNT;//波特率9600 ,TH1=256-FOSC/16/12/波特率   TL1=TH1;   EA=1; //总中断打开   ES=0; //关闭串口中断   TR1=1; //启动定时器1   }   /*   void Uart_Init()//使用独立的波特率发生器(STC12C560S2或带有独立波特率发生器//、//的单片机均可)   {   SCON=0x50; //设置为串行口以方式1工作,8位异步通讯,允许接收中断。   PCON=0x80; //SMOD波特率选择位为1,SMOD=1.   BRT=RELOAD_COUNT;//波特率9600 256-晶振频率/波特率x16=BRT   AUXR=0xD5; //T0、T1不12分频,速度是89C51的12倍,启动独立波特率//发生器,每个时钟计数一次   //设置串口1的波特率发生器为独立波特率发生器,   AUXR1=0x80; //切换到P1口   ES=1; //开启串口中断   EA=1; //开启总中断   }   */   /********************************************************************   名称:串口发送函数   功能:MCU向其他与其连接的设备发送数据(此处是无线WIFI模块ESP8266)   ********************************************************************/   void Send_Uart(uchar value)   {   ES=0; //关闭串口中断   TI=0; //清发送完毕中断请求标志位   SBUF=value; //发送   while(TI==0); //等待发送完毕   TI=0; //清发送完毕中断请求标志位   ES=1; //允许串口中断   }   /********************************************************************   名称:WIFI模块设置函数   作用: 启动模块,以便可以实现无线接入和控制   ********************************************************************/   void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组   {   while(*puf!=‘’) //遇到空格跳出循环   {   Send_Uart(*puf); //向WIFI模块发送控制指令。   us_delay(5);   puf++;   }   us_delay(5);   Send_Uart(‘ ’);//回车   us_delay(5);   Send_Uart(‘ ’); //换行   ms_delay(1000);   }   /****************************************************   名称:ESP8266发送数据函数   功能:用于与wifi模块相连的终端发送数据   *****************************************************/   void ESP8266_Sent(uchar *puf) // 数组指针*puf指向字符串数组   {   ESP8266_Set(“AT+CIPSEND=0,4”);   while(*puf!=‘’) //遇到空格跳出循环   {   Send_Uart(*puf); //向WIFI模块发送控制指令。   us_delay(5);   puf++;   }   us_delay(5);   Send_Uart(‘ ’); //换行   ms_delay(10);   }   /********************************************************************   名称:主函数   作用:程序的执行入口   ********************************************************************/   void main()   {   LED0=0;//关闭LED灯   Uart_Init();//使用独立的波特率发生器   ESP8266_Set(“AT+CWMODE=2”); //设置路由器模式 1 staTIon模式 2 AP   //点 路由器模式 3 station+AP混合模式   ESP8266_Set(“AT+RST”); //重新启动wifi模块   ESP8266_Set(“AT+CWSAP=”WIFI“,”1234567890“,11,4”);   //设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)   ESP8266_Set(“AT+CIPMUX=1”);//开启多连接模式,允许多个各客户端接入   ESP8266_Set(“AT+CIPSERVER=1,5000”); //启动TCP/IP 端口为8080 实现基于网络//控制   ES=1; //允许串口中断   while(1)   {   if((Recive_table[0]==‘+’)&&(Recive_table[1]==‘I’)&&(Recive_table[2]==‘P’))//MCU接收到的数据为+IPD时进入判断控制01来使小灯亮与灭   {   if((Recive_table[3]==‘D’)&&(Recive_table[6]==‘,’))   {   if(Recive_table[9]==‘0’)   {   LED0=0;//0 灯灭   ESP8266_Sent(“灯灭”);   //wifi模块向pc端或手机端 发送“灯灭   }   else if (Recive_table[9]==‘1’)   {   LED0=1; //1 灯亮   ESP8266_Sent(”灯亮“);   //wifi模块向pc端或手机端 发送”灯亮“   }   }   }   }   }   /*********************************************************************   名称:串行通讯中断   作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数   据正常的收发。   ********************************************************************/   void Uart_Interrupt() interrupt 4   {   static uchari=0;   if(RI==1)   {   RI=0;   Receive=SBUF; //MCU接收wifi模块反馈回来的数据   Recive_table=Receive;   i++;   if((Recive_table[i-1]==‘ ’))i=0; //遇到换行 重新装值   }   else TI=0;   }

    时间:2020-08-06 关键词: 无线 esp8266 单片机

  • 单片机通讯协议有哪些?

      现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。   1.自定义数据通信协议   这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。   通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。   帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。   地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。   数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。   校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。   2.上位机和下位机中的数据发送   物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。   在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。   void SendByte(unsigned char ch)   {   SBUF = ch;   while(TI == 0);   TI = 0;   }   上位机中关于串口通信的方式也有多种,这种方式不是指数据有没有缓冲的问题,而是操作串口的方式不同,因为PC上数据发送基本上都会被缓冲后再发送。对于编程来说操作串口有三种方式,一、使用windows系统中自带的串口通信控件,这种方式使用起来比较简单,需要注意的是接收时的阻塞处理和线程机制。二、使用系统的API直接进行串口数据的读取,在windows和linux系统中,设备被虚拟为文件,只需要利用系统提供的API函数即可进行串口数据的发送和读取。三、使用串口类进行串口操作。在此只介绍windows环境下利用串口类编程的方式。   CSerialPort是比较好用的串口类。它提供如下的串口操作方法: void WriteToPort(char* string, int len);   串口初始化成功后,调用此函数即可向串口发送数据。为了避免串口缓冲所带来的延时,可以开启串口的冲刷机制。3.下位机中的数据接收和协议解析   下位机接收数据也有两种方式,一、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论过。得出的结论是采用中断接收的方法比较好。   串口初始化成功后,调用此函数即可向串口发送数据。为了避免串口缓冲所带来的延时,可以开启串口的冲刷机制。   3.下位机中的数据接收和协议解析   下位机接收数据也有两种方式,一、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论过。得出的结论是采用中断接收的方法比较好。   数据包的解析过程可以设置到不同的位置。如果协议比较简单,整个系统只是处理一些简单的命令,那么可以直接把数据包的解析过程放入到中断处理函数中,当收到正确的数据包的时候,置位相应的标志,在主程序中再对命令进行处理。如果协议稍微复杂,比较好的方式是将接收的数据存放于缓冲区中,主程序读取数据后进行解析。也有两种方式交叉使用的,比如一对多的系统中,首先在接收中断中解析“连接”命令,连接命令接收到后主程序进入设置状态,采用查询的方式来解析其余的协议。   以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断中进行。数据包的格式如下:   0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D   其中0x55, 0xAA, 0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备的目的地址,0xF0为源地址,0x02为数据长度,后面接着两个数据0x23,   0x45,从目的地址开始结算累加、异或校验和,到数据的最后一位结束。   协议解析的目的,首先判断数据包的完整性,正确性,然后提取数据类型,数据等数据,存放起来用于主程序处理。代码如下:if(state_machine == 0) // 协议解析状态机{   if(rcvdat == 0x55) // 接收到帧头第一个数据 state_machine = 1; else   state_machine = 0; // 状态机复位}   else if(state_machine == 1){   if(rcvdat == 0xAA) // 接收到帧头第二个数据 state_machine = 2; else   state_machine = 0; // 状态机复位}   else if(state_machine == 2){   if(rcvdat == 0x7E) // 接收到帧头第三个数据 state_machine = 3; else   state_machine = 0; // 状态机复位   过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的标志位来进行协议的解析处理。   接收过程中,只要哪一步收到的数据不是预期值,则直接将状态机复位,用于下一帧数据的判断,因此系统出现状态死锁的情况非常少,系统比较稳定,如果出现丢失数据包的情况也可由上位机进行命令的补发,不过这种情况笔者还没有碰到。   对于主程序中进行协议处理的过程与此类似,主程序循环中不断的读取串口缓冲区的数据,此数据即参与到主循环中的协议处理过程中,代码与上面所述完全一样。   4.上位机中的数据接收和命令处理   上位机中数据接收的过程与下位机可以做到完全一致,不过针对不同的串口操作方法有所不同。对于阻赛式的串口读函数,例如直接进行API操作或者调用windows的串口通信控件,最好能够开启一个线程专门用于监视串口的数据接收,每接收到一个数据可以向系统发送一个消息。笔者常用的CSerialPort类中就是这样的处理过程。CSerialPort打开串口后开启线程监视串口的数据接收,将接收的数据保存到缓冲区,并向父进程发送接收数据的消息,数据将随消息一起发送到父进程。父进程中开启此消息的处理函数,从中获取串口数据后就可以把以上的代码拷贝过来使用。   CSerialPort向父类发送的消息号如下:   #define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.   因此需要手动添加此消息的响应函数:   afx_msg LONG OnCommunicaTIon(WPARAM ch, LPARAM port); ON_MESSAGE(WM_COMM_RXCHAR, OnCommunicaTIon) 响应函数的具体代码如下:   LONG CWellInfoView::OnCommunication(WPARAM ch, LPARAM port){   int retval = 0;   rcvdat = (BYTE)ch;   if(state_machine == 0) // 协议解析状态机 {   if(rcvdat == 0x55) // 接收到帧头第一个数据 state_machine = 1; else   state_machine = 0; // 状态机复位 }   else if(state_machine == 1) {   if(rcvdat == 0xAA) // 接收到帧头第二个数据 state_machine = 2; else   state_machine = 0; // 状态机复位 。。。。。.5.总结   以上给出的是通信系统运作的基本雏形,虽然简单,但是可行。实际的通信系统中协议比这个要复杂,而且涉及到数据包响应、命令错误、延时等等一系列的问题,在这样的一个基础上可以克服这些困难并且实现出较为稳定可靠的系统。

    时间:2020-08-06 关键词: 单片机 通讯协议

  • w5300单片机源码

      W5300在内存空间和数据处理能力等方面都有很大的提高。W5300特别适用于IPTV,IP机顶盒和数字电视等大流量多媒体数据的传输。通过一个集成有TCP/IP协议和10/100M的以太网MAC和PHY的单芯片可以非常简单和快捷地实现Internet连接。   W5300与主机(MCU)采用总线接口。通过直接访问方式或间接访问方式,W5300可以很容易与主机接口,就像访问SRAM存储器。W5300的通信数据可以通过每个端口的TX/RX FIFO寄存器访问。由于这些特性,即使一个初学者也很容易使用W5300实现Internet连接。   特性   支持软、硬件混合TCP/IP协议: TCP, UDP, ICMP, IGMP, IPv4, ARP, PPPoE, Ethernet;   支持8个独立的端口(sockets)同时连接;。   网络数据传输,速率可达到80Mbps;   支持ADSL连接 (支持PPPOE协议,带PAP/CHAP验证);   内部128K字节存储器作TX/RX缓存;   根据端口通信数据吞吐量动态调整内部TX/RX存储器分配;   内嵌10BaseT/100BaseTX以太网物理层,支持自动应答(全双工/半双工模式);   可选TX1:1 RX1:1 网络变压器接口YL18-2050S,YT37-1107S及YL2J011D,YL2J201A   支持自动极性变换(MDI/MDIX);   支持8/16位数据总线;l 0.18μm CMOS工艺;   3.3V工作电压,I/O口可承受5V电压,内部带1.8V电压调整器;   LQFP-100,14x14mm无铅封装。   单片机控制W5300源代码如下:   /**   ******************************************************************************   * @file W5100.c   * 本文件包括5个部分:   * 1. W5100初始化   * 2. W5100的Socket初始化   * 3. Socket连接   * 如果Socket设置为TCP服务器模式,则调用Socket_Listen()函数,W5100处于侦听状态,直到远程客户端与它连接。   * 如果Socket设置为TCP客户端模式,则调用Socket_Connect()函数,   * 每调用一次Socket_Connect(s)函数,产生一次连接,   * 如果连接不成功,则产生超时中断,然后可以再调用该函数进行连接。   * 如果Socket设置为UDP模式,则调用Socket_UDP函数   * 4. Socket数据接收和发送   * 5. W5100中断处理   *   * 置W5100为服务器模式的调用过程:W5100_Init()--》Socket_Init(s)--》Socket_Listen(s),设置过程即完成,等待客户端的连接。   * 置W5100为客户端模式的调用过程:W5100_Init()--》Socket_Init(s)--》Socket_Connect(s),设置过程即完成,并与远程服务器连接。   * 置W5100为UDP模式的调用过程:W5100_Init()--》Socket_Init(s)--》Socket_UDP(s),设置过程即完成,可以与远程主机UDP通信。   *   * W5100产生的连接成功、终止连接、接收数据、发送数据、超时等事件,都可以从中断状态中获得。   ******************************************************************************   */   #include“W5100.h” /* 定义W5100的寄存器地址、状态 */   #include“REG51.h”   typedef unsigned char SOCKET;   sbit SPI_CS= P1^0;   sbit SPI_SCK= P1^1;   sbit SPI_SO= P1^2;   sbit SPI_SI= P1^3;   sbit SPI_EN= P1^4;   sbit KEY= P1^5;   /* 端口数据缓冲区 */   unsigned char Rx_Buffer[20]; /* 端口接收数据缓冲区 */   unsigned char Tx_Buffer[20]; /* 端口发送数据缓冲区 */   /* 网络参数寄存器 */   unsigned char Gateway_IP[4]={192,168,2,254}; /* Gateway IP Address */   unsigned char Sub_Mask[4]={255,255,255,0}; /* Subnet Mask */   unsigned char Phy_Addr[6]={0x00,0x08,0xDC,0x01,0x02,0x03}; /* Physical Address */   unsigned char IP_Addr[4]={192,168,2,1}; /* Loacal IP Address */   unsigned char S0_Port[2]={0x13,0x88}; /* Socket0 Port number 5000 */   unsigned char S0_DIP[4]={192,168,2,43}; /* Socket0 DesTInaTIon IP Address */   unsigned char S0_DPort[2]={0x13,0x88}; /* Socket0 DesTInaTIon Port number 5000*/   unsigned char S0_State=0; /* Socket0 state recorder */   unsigned char S0_Data; /* Socket0 receive data and transmit OK */   unsigned char W5100_Interrupt;   /* UDP Destionation IP address and Port number */   unsigned char UDP_DIPR[4];   unsigned char UDP_DPORT[2];   void Delay(unsigned int x)   {   unsigned int i;   for(i=0;i《x;i++){   SPI_EN=1;   }   }   unsigned char SPI_ReadByte(void){   unsigned char i,rByte=0;   for(i=0;i《8;i++){   rByte《《=1;   rByte|=SPI_SO;   SPI_SCK=0;   Delay(10);   SPI_SCK=1;   SPI_SCK=0;   }   return rByte;   }   void SPI_SendByte(unsigned char dt)   {   unsigned char i;   for(i=0;i《8;i++)   {   if((dt《《i)&0x80)   {   SPI_SI=1;   }   else   {   SPI_SI=0;   }   SPI_SCK=0;   Delay(10);   SPI_SCK=1;   SPI_SCK=0;   }   }   unsigned char Read_W5100(unsigned short addr)   {   unsigned char i;   /* 置W5100的CS为低电平 */   SPI_CS=0;   /* 发送读命令 */   SPI_SendByte(0x0f);   /* 发送地址 */   SPI_SendByte(addr/256);   SPI_SendByte(addr);   /* 读取数据 */   i=SPI_ReadByte();   /* 置W5100的CS为高电平 */   SPI_CS=1;   return i;   }   void Write_W5100(unsigned short addr, unsigned char dat)   {   /* 置W5100的CS为低电平 */   SPI_CS=0;   Delay(100);   /* 发送写命令 */   SPI_SendByte(0xf0);   /* 发送地址 */   SPI_SendByte(addr/256);   SPI_SendByte(addr);   /* 写入数据 */   SPI_SendByte(dat);   Delay(100);   /* 置W5100的CS为高电平 */   SPI_CS=1;   }   void W5100_Init(void)   {   unsigned char i;   SPI_EN=1;SPI_SCK=0;SPI_CS=1;SPI_SO=1;   Write_W5100(W5100_MODE,MODE_RST); /*软复位W5100*/   Delay(100);   ///Write_W5100(W5100_MODE,0); /*软复位W5100*/   Delay(100); /*延时100ms,自己定义该函数*/   /*设置网关(Gateway)的IP地址,4字节 */   /*使用网关可以使通信突破子网的局限,通过网关可以访问到其它子网或进入Internet*/   for(i=0;i《4;i++)   Write_W5100(W5100_GAR+i,Gateway_IP); /*Gateway_IP为4字节unsigned char数组,自己定义*/   for(i=0;i《4;i++)   Gateway_IP=Read_W5100(W5100_GAR+i);   /*设置子网掩码(MASK)值,4字节。子网掩码用于子网运算*/   for(i=0;i《4;i++)   Write_W5100(W5100_SUBR+i,Sub_Mask); /*SUB_MASK为4字节unsigned char数组,自己定义*/   /*设置物理地址,6字节,用于唯一标识网络设备的物理地址值   该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号   如果自己定义物理地址,注意第一个字节必须为偶数*/   for(i=0;i《6;i++)   Write_W5100(W5100_SHAR+i,Phy_Addr); /*PHY_ADDR6字节unsigned char数组,自己定义*/   /*设置本机的IP地址,4个字节   注意,网关IP必须与本机IP属于同一个子网,否则本机将无法找到网关*/   for(i=0;i《4;i++)   Write_W5100(W5100_SIPR+i,IP_Addr); /*IP_ADDR为4字节unsigned char数组,自己定义*/   /*设置发送缓冲区和接收缓冲区的大小,参考W5100数据手册*/   Write_W5100(W5100_RMSR,0x55); /*Socket Rx memory size=2k*/   Write_W5100(W5100_TMSR,0x55); /*Socket Tx mempry size=2k*/   /* 设置重试时间,默认为2000(200ms) */   Write_W5100(W5100_RTR,0x07);   Write_W5100(W5100_RTR+1,0xd0);   /* 设置重试次数,默认为8次 */   Write_W5100(W5100_RCR,8);   /* 启动中断,参考W5100数据手册确定自己需要的中断类型   IMR_CONFLICT是IP地址冲突异常中断   IMR_UNREACH是UDP通信时,地址无法到达的异常中断   其它是Socket事件中断,根据需要添加 */   Write_W5100(W5100_IMR,(IMR_CONFLICT|IMR_UNREACH|IMR_S0_INT));   }   unsigned char Detect_Gateway(void)   {   unsigned char i;   Write_W5100((W5100_S0_MR),S_MR_TCP); /*设置socket0为TCP模式*/   Write_W5100((W5100_S0_CR),S_CR_OPEN); /*打开socket0*/   if(Read_W5100(W5100_S0_SSR)!=S_SSR_INIT)   {   Write_W5100((W5100_S0_CR),S_CR_CLOSE); /*打开不成功,关闭Socket,然后返回*/   return FALSE;   }   /*检查网关及获取网关的物理地址*/   for(i=0;i《4;i++)   Write_W5100((W5100_S0_DIPR+i),IP_Addr+1); /*向目的地址寄存器写入与本机IP不同的IP值*/   Write_W5100((W5100_S0_CR),S_CR_CONNECT); /*打开socket0的TCP连接*/   Delay(20); /* 延时20ms */   i=Read_W5100(W5100_S0_DHAR); /*读取目的主机的物理地址,该地址就是网关地址*/   Write_W5100((W5100_S0_CR),S_CR_CLOSE); /*关闭socket0*/   if(i==0xff)   {   /**********没有找到网关服务器,或没有与网关服务器成功连接***********/   /********** 自己添加处理代码 ***********/   return FALSE;   }   return TRUE;   }   void Socket_Init(SOCKET s)   {   unsigned int i;   /*设置分片长度,参考W5100数据手册,该值可以不修改*/   Write_W5100((W5100_S0_MSS+s*0x100),0x00); /*最大分片字节数=16*/   Write_W5100((W5100_S0_MSS+s*0x100+1),0x10);   /* Set Socket Port number */   switch(s)   {   case 0:   Write_W5100(W5100_S0_PORT,S0_Port[0]); /* Set Local Socket Port number */   Write_W5100(W5100_S0_PORT+1,S0_Port[1]);   Write_W5100(W5100_S0_DPORT,S0_DPort[0]); /* Set Destination port number */   Write_W5100(W5100_S0_DPORT+1,S0_DPort[1]);   for(i=0;i《4;i++)   Write_W5100(W5100_S0_DIPR+i,S0_DIP); /* Set Destination IP Address */   break;   case 1:   break;   case 2:   break;   case 3:   break;   default:   break;   }   }   /**   * @brief 设置Socket为客户端与远程服务器连接   *当本机Socket工作在客户端模式时,引用该程序,与远程服务器建立连接   *   *如果启动连接后出现超时中断,则与服务器连接失败,需要重新调用该程序连接   *该程序每调用一次,就与服务器产生一次连接   **/   unsigned char Socket_Connect(SOCKET s)   {   Write_W5100((W5100_S0_MR+s*0x100), S_MR_TCP); /*设置socket为TCP模式 */   Write_W5100((W5100_S0_CR+s*0x100), S_CR_OPEN); /*打开Socket*/   if(Read_W5100(W5100_S0_SSR+s*0x100)!=S_SSR_INIT)   {   Write_W5100(W5100_S0_CR+s*0x100,S_CR_CLOSE); /*打开不成功,关闭Socket,然后返回*/   return FALSE;   }   Write_W5100((W5100_S0_CR+s*0x100),S_CR_CONNECT); /*设置Socket为Connect模式*/   return TRUE;   /*至此完成了Socket的打开连接工作,至于它是否与远程服务器建立连接,则需要等待Socket中断,   以判断Socket的连接是否成功。参考W5100数据手册的Socket中断状态*/   }   /**

    时间:2020-08-05 关键词: 单片机 w5300

  • 51单片机连接ESP8266串口WiFi模块

      I2C简介   I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。   I2C工作原理   SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。   主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。   2C总线特点   (1)在硬件上,12C总线只需要一根数据线和一根时钟线两根线,总线接口已经集成在芯片内部,不需要特殊的接口电路,而且片上接口电路的滤波器可以滤去总线数据上的毛刺.因此I2C总线简化了硬件电路PCB布线,降低了系统成本,提高了系统可靠性。因为12C芯片除了这两根线和少量中断线,与系统再没有连接的线,用户常用IC可以很容易形成标准化和模块化,便于重复利用。   (2)I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工作。   (3)I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也利于标准化和模块化,缩短开发时问。   (4)连接到相同总线上的IC数量只受总线最大电容的限制,串行的8位双向数据传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。   (5)总线具有极低的电流消耗.抗高噪声干扰,增加总线驱动器可以使总线电容扩大10倍,传输距离达到15m;兼容不同电压等级的器件,工作温度范围宽。

    时间:2020-08-05 关键词: Wi-Fi 单片机 51单片机

  •  一种用于汽车电磁阀质量测试电源的设计

    一种用于汽车电磁阀质量测试电源的设计

    电磁阀在现代汽车中应用十分广泛,电磁阀的性能与汽车的性能紧密相关。施加到电磁阀的电源在实际工作时的状态是异常复杂的,主要表现在电磁阀电源的电压幅度、频率、占空比的复杂性和随机性。为了保证电磁阀出厂的质量,本文设计并制作了一种便于模拟汽车电磁阀实际工作状态的电源。根据电磁阀在汽车中的工作要求,对电磁阀在各种工作状态下的质量要求进行模拟测试。同时解决测试出口电磁阀产品性能指标的难题,为我国电磁阀的出口产品提供必要的技术性能测试设备。 1 系统结构与工作原理 如图1所示,整个系统包括单片机、I/O扩展电路、D/A转换电路、PWM产生电路、频率选择电路、光电隔离和驱动电路及键盘和显示电路。系统以单片机为控制中心,采用DDS芯片AD9851和PWM控制芯片SG3525为波形发生设备,采用8255A扩展单片机外围接口作为三路D/A转换电路数据输入口,三路模拟电压分别用于控制频率、占空比和幅度。通过单片机处理数据控制波形发生设备输出信号的频率和占空比,再通过后级的频率选择电路和光耦隔离与驱动电路,实现输出频率、占空比和幅度可调的PWM信号。此外,人机接口采用键盘和LCD显示,通过RS 232串口进行通信后,由PC机实现。 2 信号产生与控制电路设计 系统要求产生频率在O~25 000 Hz之间占空比可调的PWM信号,采用PWM控制芯片SG3525可以很方便地产生频率和占空比独立可调的PWM信号,但由于SG3525在150 Hz以下频率极不稳定,因此需要将信号分为两个频率段进行设计,其中低频段为O~200 Hz,采用AD9851作为信号发生器,高频段为200~25 000 Hz,采用SG3525作为信号发生器。 2.1 低频段PWM信号产生电路 AD9851是高集成度的直接数字频率合成器,该器件频带宽、频率与相位均可控。其主要组成为:相位累加器、相位相加器、波形存储器、数字相乘器和D/A 转换器。基本工作为:在采样时钟信号的控制下,通过由频率码控制的相位累加器输出相位码,将存储于只读存储器中的波形量化采样数据值按一定的规律读出,经 D/A转换和低通滤波后输出正弦信号。 低频段信号产生电路如图2所示,设计电路中,AD9851外接30 MHz有源晶振作为参考频率源。单片机与AD9851采用高速并行接口工作方式,以AT89C55的引脚P1.0~P1.7作为AD9851的并行数据输入端口,P2.O,P2.1,P2.2作为I/O口输出数据对AD9851的RESET,FQ_UD,W_CLK进行控制。AD9851输出频率可变的方波送到单片机外部中断INT0,P2.3为低频PWM信号输出端口。单片机具体输入方式为:有效复位信号RESET使输入数据地址指针指向第1个输入寄存器,W_CLK上升沿写入第1组8位数据,指针指向下一个输入寄存器。连续5个W_CLK上升沿完成全部40位控制数据的输入。此后WCLK信号上升沿无效。FQ_UD上升沿到来时这40位控制数据由输入寄存器写入频率,相位控制寄存器,更新输出频率和相位,同时把地址指针复位到第1个输入寄存器,等待下一组新数据的写入。 AD9851首先通过IOUT引输出频谱纯净的正弦信号,输出经外部无源低通滤波后,由引脚VINP进入AD9851内部高速比较器,最后由引脚 VOUTN输出得到稳定性很好的方波。将方波引入单片机外部中断引脚,中断设置为下降沿触发,将单片机端口P2.3设置为低频PWM信号输出端。如图3所示,P2.3口输出频率与INT0一致,占空比可调的矩形波。 具体控制占空比过程如下:单片机进入外部中断之后,将P2.3置高电平,延时一段时间t,再将P2.3置低电平。这样P2.3口就输出占空比q%=t/T的矩形波,通过改变延时t就能改变占空比,延时函数如下: 单片机晶振为12 MHz时,此函数延时8c μs,假设AD9851输出频率为f的方波送给INT0,例如需要产生占空比为q%的矩形波,则满足如下关系: 因此延时时间t=delay(1 250q/f)时,即可由P2.3口输出频率为f,占空比为q%的矩形波。需要注意的是,如果频率很高,T很小,因为延时函数t延时8μs整数倍,所以占空比控制精度将会无法保证,频率越高,精度越低。由于本设计低频率段在0~200 Hz范围内,AD9851送给外部中断引脚的方波周期比较大,因此采用上述方法可以比较精确地控制q在O~100内变化,输出比较理想的频率占空比独立可调的低频PWM信号。 2.2 高频段PWM信号产生电路 SG3525是一种性能优良、功能齐全、通用性强的单片集成脉宽调制控制器,由于它简单可靠及使用方便灵活,大大简化了控制电路的设计及调试。因此选择SG3525作为本设计的高频PWM信号发生器,产生200~25 000 Hz的PWM信号。 高频段PWM信号产生电路如图4所示。单片机通过两路D/A转换之后产生两个模拟电压信号,分别用于控制SG3525的占空比和频率。通过控制调频三级管 Q1的基极电压Ub来调节SG3525的2脚Non上的电流大小,达到控制SG3525输出PWM频率的目的。通过改变控制三级管Q2的基极电压Ub来调节SG3525的6脚RT上的电流大小,达到控制SG3525输出PWM占空比的目的。本设计中把SG3525的11脚、14脚与12脚接地,让PWM脉冲由13脚VC输出,这样既保证了13脚的输出与锁存器的输出一致,而且又输出频率占空比独立可调PWM信号。此外,由于输出频率和占空比分别与控制它们的两路模拟电压信号为线性关系,所以软件实现也很方便。 3 频率选择电路 需要将低频段与高频段PWM信号结合才能得到完整频率段PWM信号,因此需要进行频率选择,本系统的频率选择电路如图5所示。首先将两路 PWM信号分别转换为标准TTL电平,低频段PWM信号通过74LS00和上拉电阻即可实现TTL电平,在高频段由于SG3525输出幅值为12 V,因此需要5 V稳压管降低幅值,再由74LS00和上拉电阻输出TTL电平。通过单片机控制单片集成模拟开关MAX318来实现频率的选择,这里选用常开脚NO作为开关的输入,公用端COM作为输出信号。通过IN脚的真值来切换开关状态,分别通过单片机I/O端口P2.3和P2.4控制,当IN逻辑真值为0时,断开 NO端,当逻辑真值为1时,导通N0端。同一时刻只能有一个芯片的IN脚为高电平,另一个必须为低电平,否则会使两路信号发生串扰。 4 光耦隔离与驱动电路 PWM控制电路与驱动电路之间需要进行电气隔离,以消除主电路对信号发生电路的干扰。PWM信号发生电路产生的PWM信号电流太小,不能直接驱动功率放大管,而且无法调整输出PWM电源输出的幅度,由此设计了光耦隔离与驱动电路。电路如图6所示,PWM作为整个电路的控制信号,经过光耦隔离放大后再由两级开关三极管来控制主电路的通断,在电磁阀上产生频率和占空比可变的PWM脉冲信号,同时单片机通过D/A转换产生一路可变的模拟电压信号,该信号经过电压负反馈电路以稳定输出电压幅度,再通过连续几级射级跟随器以增大输入电流以驱动功率管,通过改变输入电压就可以改变施加在电磁阀上的PWM电压幅度,实现幅度在0~36 V之间任意设置。 5 结语 设计的用于模拟汽车电磁阀工作状态的PWM电源,通过矩阵键盘和LCD实现人机对话,通过单片机处理数据来控制PWM波的频率、占空比和幅度,所有对电源要求的数据都可以通过键盘传送给单片机,并且通过LCD实时显示。单片机产生的控制信号来模拟电磁阀的实际工作状态,可以对汽车电磁阀在各种工作状态下的质量要求进行检测,保障电磁阀出厂前的质量。该电源运行稳定、精度高,目前已成功应用到汽车电磁阀的生产企业,为企业创造了显著的经济效益,为我国电磁阀的出口做出了贡献。

    时间:2020-08-04 关键词: 单片机 现代汽车 电磁阀

  • 基于MK60和TSL1401的汽车停车位停车报警装置的设计

    基于MK60和TSL1401的汽车停车位停车报警装置的设计

    基于停车位的汽车停车报警系统是针对目前市场上被忽略的依据停车线为驾驶员设计的一款报警装置。该系统采用低成本的单片机、CCD传感器、超声波测距模块实现声光报警,具有方便调试,安装简单的特点。 随着社会经济的发展,汽车数量飞速增长,寻找停车位并准确停车是驾驶员必须面对的问题。一般停车位是用几条白线划分出来的,驾驶员坐在驾驶座上时,视野范围受限,利用后视镜只能观察侧后方白线且需要随时调整后视镜,往往停下后才发现车辆歪斜或者过于靠近白线等情况。如果能够提前预知车辆与白线的相对位置是否合理,就可以帮助驾驶员将车辆准确地停放到车位上,预防剐蹭等事故的发生。 基于停车位的汽车停车报警系统,与常见的汽车倒车雷达相似,除了周边障碍物,还针对停车位白线进行了报警设计。相对于价格昂贵的导航系统,该装置适用于配备低端车型,具有成本低廉、电路简单、精度满足需求的特点。 1 系统总体框图 汽车停车报警装置是一种安全辅助装置,由线性CCD图像传感器、超声波传感器、单片机控制系统、报警电路等组成。系统总体框图如图1所示。 图1系统总体框图核心控制器通过比对车身与白线或障碍物的相对距离来判断出车身停放是否准确合适,位置不合适即做出报警提示,使驾驶员能够更清楚地了解自己车辆周围障碍物的情况以及车辆与车位的相对信息,对于驾驶员的起步、停车和倒车都提供了很大的帮助,提高了驾驶员停放车辆的安全性。 2 主要器件及工作原理 由图1可知,系统所用的器件主要有单片机、CCD传感器、超声波测距模块。 2.1 单片机MK60N512VMD100 单片机是系统软件的载体,是控制系统的核心。系统中的线性CCD模块和超声波测距模块都是用软件驱动,选用K60系列单片机芯片MK60N512VMD100可满足需要[3]。 2.2 线性CCD传感器TSL1401 CCD图像传感器是一种可以直接将光信号转变为模拟电流信号的传感器,将电流信号放大并进行模数转换后,就可以实现图像的采集、存储、传输、处理和检索。从功能上说,CCD被分为面阵CCD和线阵CCD两大类。设计中使用CCD主要是检测停车位的白线,所以选择了较为简单的TSL1401线性CCD传感器。 2.3 超声波测距模块 超声波测距的主要方法包括幅值检测法、相位检测法、渡越时间法。本设计采用的HCSR04模块的测距法为渡越时间法。该模块可以提供2 cm~400 cm的非接触式距离感测功能,测距精度能达到3mm,模块包括超声波发射器和接收器以及控制电路。 3 设计中的细节问题 报警系统要达到预定的效果,还需注意传感器的设置、时序等问题。 3.1 线性CCD传感器 3.1.1 CCD个数及位置 CCD的功能是监测车辆相对于白线位置是否合适,防止车身歪斜或者靠近某侧白线,安装如图2所示。 如图2,通过比较6个线性CCD模块监测到的车身与白线的距离,可以判断车是否停好。 3.1.2 CCD曝光时间 因为汽车停车环境多变,必须考虑光线对于CCD输出信号的影响。要适应各种不同环境,不能使用一个固定参数。由于曝光量与输出电压密切相关,而曝光量取决于CCD模块所使用的镜头光圈大小以及程序所控制的曝光时间,相对于调整光圈大小,设置CCD程序锁控制其曝光时间更为简便。 3.1.3 CCD输出信号的放大 调节曝光时间即增加弱光环境下的曝光时间,减少强光环境下的曝光时间,但增加曝光时间会降低采样率,使控制周期变长,系统反应变慢。在保证不降低采样率的前提下,可采用放大器来增大线性CCD在晚上弱光时的输出电压。 3.1.4 驱动及时序 TSL1401 的驱动程序只需MCU控制CLK及SI两个端口按照既定时序发出方波信号,AO端就会依次输出128个像素点的模拟信号。 3.2 超声波测距时序 超声波测距时序如图3所示。控制器发出一个 10μs以上脉冲触发信号,测距模块即发出8个40 kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比,通过发射信号 到接收到回响信号的时间间隔可以计算得到车身与障碍物的距离。 距离=高电平时间&TImes;声速(340 m/s)/2。 4 软件设计 主程序流程如图4所示。初始化包括中断的初始化、I/O端口的初始化、定时器的初始化等。在初始化完成后,超声波测距模块和线性CCD模块开始工作,处理器接收其信号并进行处理,车身位置不合适时驱动报警。 5 测试结果及使用 测试使用实验小车,CCD选用蓝宙电子的TSL1401模块,利用集成运放构成11倍的放大电路,在晚上弱光环境下同样能达到50 Hz 的采样率,并且保证输出的电压在合理范围内。设置好偏差标准后,小车移动时,若车身位置不合适,可产生声光报警,达到设计及应用要求。 系统可直接安装于没有倒车装置的汽车上,成本低,调试简单。也可以在有倒车雷达的车辆上加装,以增强停车系统功能。在没有影像的情况下,用指示灯显示警示位置,比起只有报警音的倒车雷达,警示更直观。相对于利用导航系统锁定停车位并自动驻车的系统,该装置更适用于配置低端车型,或自行加装报警装置。

    时间:2020-07-30 关键词: 单片机 ccd传感器

  • 基于增强型51单片机的智能药箱的设计方案解析

    基于增强型51单片机的智能药箱的设计方案解析

    介绍了一种基于STC90C516RD+单片机的智能药箱的设计,主要结构有主控单元、时钟单元、报警单元、显示单元等。显示单元显示药品的相关信息及服药时间,有利于用户及时掌握各项信息;报警单元可以在规定的时间内进行报警提醒,保证了用户能够及时服药。 对于那些健忘的老人、需要长期坚持服用药物的患者、需要住院的病患以及工作繁忙的成年人来说,很难保证能清楚地记得不同药物的信息以及用药时间并且保证按时吃药。如何能够及时提醒以上人群按时按量吃药是一个难题。针对此问题,本文设计了一种基于增强型51单片机——STC90C516RD+单片机的智能药箱。药箱设有检测单元,检测在规定的时间内用户是否按时吃药,当检测到用户已按时吃药便会通过显示单元提示用户已经吃药,避免重复吃药。通过显示单元,用户可以方便地获取当前的用药情况、用药时间及药物信息等信息。 1工作原理 本设计主要由主控单元、时钟单元、检测单元、报警单元、显示单元、供电单元和上位机软件等7部分组成,其中主控单元由STC90C516 RD+单片机模块组成;时间单元由DS1302时钟模块组成,用于检测当前的时间信息;检测单元由光敏传感器模块和DS18B20模块组成,分别检测用药情况的和检测环境温度;报警单元由蜂鸣器模块和GSM短信模块组成,分别进行现场的声音报警提示与短信报警提示;显示单元显示药物名称、用法用量等药品的相关信息,用药的时间,是否用药以及当前的日期、时间等信息;供电单元提供系统所需电力;上位机软件通过RS232接口与主控单元进行通信。药箱结构示意如图1所示。 图1 智能药箱设计原理图 2各组成单元分析 2.1主控单元 主控单元在整个ICare系统中起信息处理和控制作用,主控芯片选用增强型51单片机——STC90C516RD+单片机。STC90C516RD+单片机是基于8051内核的新一代超强抗干扰、高速、低功耗的单片机,指令代码完全兼容传统8051单片机,包含中央处理单元、64 k字节Flash程序存储器、1280字节SRAM、35个双向输入/输出(I/O)口、3个16位定时器/计数器,8个中断源,片内时钟振荡电路。 2.2时钟单元 时钟单元采用的是DALLAS公司出品的DS1302芯片。DS1302是一种具有涓细电流充电能力的低功耗实时时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿等多种功能。DS13 02采用SPI三线接口与CPU进行同步通信,分别是复位(RST)、I/O数据线和串行时钟(SCLK)。 2.3检测单元 检测单元由光敏传感器模块和温度传感器DS18B20模块组成。 1)光敏传感器模块 光敏传感器模块在无光条件或者光强达不到没定阈值时即未打开药箱时,输出高电平;当外界环境光强超过设定阈值即打开药箱时,输出低电平。主控单元通过检测光敏传感器模块输出的高低电平判断患者是否打开药箱服药。光敏传感器模块原理图见图2. 图2 光敏传感器模块原理图 2)温度传感器DS18B20模块 DS18B20模块是一种常用的温度传感器,具有测温系统简单、测温精度高、连接方便、占用口线少、抗干扰能力强和精度高等优点。模块采用独特的单线接口方式,与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通信,测量结果以9—12位数字量方式串行传送。在使用中不需要任何外围元件。 主控单元通过温度传感器DS18B20模块实时检测当前的环境温度,并将当前的温度信息通过显示单元显示出来,显示效果见图5. 2.4报警单元 报警单元由蜂呜器模块和GSM短信模块组成。 1)蜂鸣器模块 蜂鸣器是一种一体化结构的电子讯响器,采用直流供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器模块结构简单、使用方便,通过主控单元单片机I/O口定时翻转电平即可驱动蜂呜器鸣响。 2)GSM短信模块 GSM短信模块采用希姆通300模块。希姆通300模块属于工业级GSM/GPRS模块,具有工业标准化接口,尺寸小,功耗低,采用单电压供电,支持EGSM900/1800/1900频段,支持AT指令设置,内嵌TCP/IP协议,可实现点对点发送和接收中文短信的功能。 在本设计中,GSM短信模块与主控单元之间采用串口通信的方式进行连接,如图3所示。 图3 GSM短信模块与主控单元通信示意图 2.5显示单元 显示单元采用2.4寸彩色tft液晶显示器,显示色彩为262 k(26万色),成像细腻,具有显示效果好、功耗低等优点。显示单元原理图如图4所示。 图4 显示单元原理图 引脚说明:1脚,接地(GND);2脚,电源引脚(Vcc);4脚,控制寄存器/数据寄存器选择引脚(RS),低电平时选择控制寄存器;5脚,写信号引脚(RW),低电平时有效;6脚,读信号引脚(RD),低电平时有效;7~14脚为8位数据总线(DB0~DB7);15脚为片选(CS),低电平时有效;16脚,复位脚(RST),低电平时有效;3、17、18脚悬空。显示单元显示效果见图5. 图5 显示单元显示效果

    时间:2020-07-30 关键词: 单片机

  • DIY一部够炫酷的自由落体电子鼓之PIC单片机在LCD显示器模拟

    DIY一部够炫酷的自由落体电子鼓之PIC单片机在LCD显示器模拟

    1.项目名称、项目的主要内容及目前的进展情况 项目名称:自由落体电子鼓。 项目背景:在科技飞速发展的21世纪,娱乐消费是一股不可忽视的新潮流,消费的方式也越来越多样化,其中电子产品消费类有着很大的前景。本项目是自由落体电子鼓,顺应了潮流,主要还是面向玩具开发、游戏、演艺、音乐等娱乐领域。 项目的主要内容:本项目主要面对消费电子类以及娱乐类产品,主要利用PIC单片机在LCD显示器上模拟实物有节奏地做自由落体,不同物体(如篮球、乒乓球、盘子、金属等)做自由落体落在地上发出不同的声音,对应物体模拟出对应类似乐器(如电子鼓、电子琴等)发出的声音。通过控制物体落下的时间间隔形成节奏达到电子乐器的效果。可以通过无线遥控按键按出不同音色的音频,屏幕上对应出现不同物体做自由落体掉到地上发出不同的音频,人为地制作出了一段动画。也可以通过把设计好的音频旋律让程序去执行,屏幕上出现不同物体做自由落体掉在地上发出声音,有节奏地发出声音,这种有趣的动画效果持续到旋律播放完为止。 目前的进展情况:具有PIC单片机开发经验。 2.项目关键技术及创新点的论述 创新点(1):使用LCD显示器模拟实物自由落体,给人予良好的视觉效果。 创新点(2):模拟实物自由落体所发出的音频达到电子鼓效果,给人予良好的听觉效果。 创新点(3):可通过遥控演奏出音乐节拍,同时在LCD上对应显示出动态物体随着节拍做自由落体。 关键技术(1):利用程序来控制PIC单片机及DAC不断的输出模拟信号,模拟出不同物体落地的音色音调,通过功放输出。 关键技术(2):用严谨的程序控制LCD模拟出物体自由落体。 关键技术(3):利用程序控制模拟音频跟模拟物体自由落体发出的声音达到统一。 关键技术(4):模拟物体落地的声音,通过D/A把数字信号转换为模拟信号。 3.技术成熟性和可靠性论述 我们已通过仿真实验证明,该方法不仅有效地操作。团队成员均有比较扎实的单片机基础和设计功底和音频信号处理方面的专业知识,完全有能力保证该项目的顺利实施,最终完成项目。 项目实施方案 1.方案基本功能框图及描述 自由落体电子鼓系统,由PIC32单片机、LCD灰屏、D/A功放、电源、喇叭、红外遥控器等部分组成。 2.基本功能 (1)设计一个(4&TImes;4)的红外键盘控制器,并将16个键设置成16个音。 (2)通过红外键盘给控制器发送信号,经过D/A功放将数字信号转化为模拟信号放大输出音频,发出与键盘对应的音阶,同时对应地动态地在LCD上显示物体从上砸下来的效果。 (3)模拟物体自由落体以及物体落地的音色。模拟的物体如篮球、乒乓球、盘子等物体做自由落体落地作为信号发出声音模拟出电子鼓的效果,形成节奏,达到音色统一。 3.系统元件 (1)PIC单片机 PIC32可提供工作频率80MHz的32位MIPS处理器内核、512KB的编程FLASH、32KB的RAM内存以及众多的外围设备。这些设备包括USB控制器、定时器/计数器、串口控制器A/D转换器以及更多的设备。该板具有大量的I/O接口和电源选项,其中也包括USB电源。基于PIC32单片机设计自由落体电子鼓,由于乐音实际上是有固定周期的信号,我们可以用PIC32的一个定时器控制,管脚上输出方波周期信号,产生乐音。根据不同的信号,调节定时器的溢出时间,可输出不同频率的乐音,每个乐音的音高(频率)是固定的.再通过D/A转换器产生固定频率的方波信号以推动喇叭发出旋律。并使用LCD显示器来显示音阶输入所对应图像的相关消息。 (2)LCD显示屏 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。LCD液晶模块的读写控制信号/RD、WR、RAM分别由PIC32的RE0、RE1控制,RE2连接片选信号/CE,RC5连接指令和数据通道选择信号C/D,液晶模块复位由PIC32的程序控制,在单片机初始化时对液晶复位,VO用于调节液晶显示的对比度。    (3)D/A功率放大器 先把数字信号进行转换为模拟信号,通过音频功率放大器对比较小的音频信号进行放大,使其功率增加,然后输出。其原理如图所示,前置放大主要完成对小信号的放大,使用一个同向放大电路对输入的音频小信号的电压进行放大,得到后一级所需要的输入。后一级的主要对音频进行功率放大,使其能够驱动电阻而得到需要的音频。 (4)红外遥控器 遥控器采用比较简单的方案实现。遥控器上的按键与基板上的按键功能完全等同。 4.需要的开发平台 (1) MPLAB IDEv8.41硬件调试及编程工具。 (2) 软件开发环境 MPLAB IDE v8.41。 (3) 编译器MPLAB IDE。 5.需要扩展的外设子板 (1)PmodAMP1——扬声器/耳机放大器 (2)Pmod-DA2——两路12位D/A输出接口

    时间:2020-07-29 关键词: diy 单片机 lcd显示器

  • 无线控制器驱动陪护机器人的设计

    无线控制器驱动陪护机器人的设计

    一、项目概述 1.1 引言 随着计算机和单片机的发展,自动化控制正在不断地更新和进步,越来越多越来越先进的机器人相继问世,陪护机器人的出现也就成为必然。 1.2 项目背景/选题动机 随着计算机和单片机的发展,自动化控制正在不断地更新和进步,越来越多越来越先进的机器人相继问世。随着社会和时代的发展,医疗护理的费用会不断增长,因此可以设想设计一种陪护机器人来陪护病人,卧床病人在无人陪护,要取某种东西的时候,需要机器人的帮助。 二、需求分析 2.1 功能要求 在履带车机器人的基础上,添加一组升降架,在升降加上安装一组手臂,可以实现取放水杯、物品等,在视频采集系统的帮助下,病人可以通过无线控制器驱动陪护机器人到达指定位置,然后控制升降器电动机使升降架升起到需要的高度,再调整好方位,驱动手臂抓取所要取的水杯或其他物品。使卧床的病人在无人陪护的情况下也可以自己取到所需要的的物品。 2.2 性能要求 在驱动机器人时速度、方向都要控制好,本体要具有很好的稳固性,升降架在升降过程中应该协调流畅,在取放物品时,要做到准确到位,另外还需要抓紧抓牢。 三、方案设计 3.1 系统功能实现原理 系统硬件结构框图 原理: 陪护机器人主要由四部分组成:1、履带车2、升降架3、机械手臂4、摄像头 履带车由电机、驱动轮、承重轮、履带和车架组装而成,在车架上装有电源、电路板、无线接收器,在车体上部有一组(两排)滑槽。陪护机器人的移动是由履带车的移动来实现的,履带车可以实现前进、后退、转向,使陪护机器人移动到所需要的位置。 升降架是由多组平行四边形的不锈钢板铰接而成,下部一端铰接在车体滑槽一端,另一端则设置为可以在滑槽中滑动并且与电机相连,在电机的驱动下可以实现在滑槽中来回滑动,从而使升降架升起或降低,使陪护机器人可以取到不同高度的物体,放在不同的高度位置。 机械手臂实现取放物品,两组手臂可以实现同方向转动,调节方位,亦可以相向或反向转动,取放物品。 摄像头采集视频信息,采集到的信息发射到电脑接收器上,由电脑显示视频信息,操作者根据视频信息来操纵陪护机器人。 3.2 硬件平台选用及资源配置 1、EVK1100 控制器2、电源系统3、电机驱动系4、履带车本体5、升降系统 6、无线通信系统系统7、视频采集系统 EVK1100 控制器 EVK1100 控制器是陪护机器人本体的控制中心,在接收来自无限控制器的信号后,指示各个电机作出相应。 二、电源系统 电源系统主要由两块电池组成:一块为12V的动力电源,这块电池主要给各个电机提供动力,包括履带车电动机、升降架电动机、机械手臂电动机、摄像头电动机,还要给摄像头提供动力;另一块为5V电池,主要为单片机提供动力。 三、电机驱动系统 电机驱动系统是整体的动力系统,其中包括履带车电机、升降架电机、机械手臂电机、摄像头转动电机。 履带车本体 履带车本体由电机、驱动轮、承重轮、履带和车架组装而成,在车架上装有电源、电路板、无线接收器,在车体上部有一组(两排)滑槽。陪护机器人的移动是由履带车的移动来实现的,履带车可以实现前进、后退、转向,使陪护机器人移动到所需要的位置。 五、升降系统 升降系统主要由升降架、升降电机、滑槽组成,升降架是由多组平行四边形的不锈钢板铰接而成,下部一端铰接在车体滑槽一端,另一端则设置为可以在滑槽中滑动并且与电机相连,在电机的驱动下可以实现在滑槽中来回滑动,从而使升降架升起或降低,使陪护机器人可以取到不同高度的物体,放在不同的高度位置。 六、无线通信系统系统 无线通信系统系统主要由陪护机器人本体上的无线信号发射器和电脑无线信号接收器组成。主要功能是帮助电脑完成对陪护机器人的控制,实现信息反馈。 七、视频采集系统 视频采集系统主要由摄像头、摄像头转动电机、电池等组成,视频采集系统将采集到的信息发射到电脑接收器上,由电脑显示视频信息,操作者根据视频信息来操纵陪护机器人。 3.3系统软件架构 3.4 系统软件流程 程序运行流程图 在视频采集系统的帮助下,病人可以通过无线控制器驱动陪护机器人到达指定位置,然后控制升降器电动机使升降架升起到需要的高度,再调整好方位,驱动手臂抓取所要取的水杯或其他物品,然后操纵陪护机器人返回,使卧床的病人在无人陪护的情况下也可以自己取到所需要的的物品。 3.5 系统预计实现结果 在视频采集系统的帮助下,病人可以通过无线控制器驱动陪护机器人到达指定位置,然后控制升降器电动机使升降架升起到需要的高度,再调整好方位,驱动手臂抓取所要取的水杯或其他物品,然后操纵陪护机器人返回,使卧床的病人在无人陪护的情况下也可以自己取到所需要的的物品。 另外,制造陪护机器人的成本较低,性价比高,还节省了人力。如果陪护机器人能够批量生产,将为社会带来很大的收益

    时间:2020-07-29 关键词: 机器人 单片机

  • 基于AVR单片机的直线开关磁阻电机高精度位置控制

    基于AVR单片机的直线开关磁阻电机高精度位置控制

    一、项目概述 1.1 引言 电机是工业生产不可缺少的动力设备,电机的品种很多,作用也相当广泛。直线开关磁阻电机时一种新型的牵引电机。其主要有以下优点:结构简单,制作成本不高。工作稳定且能够在恶劣的环境下长时间正常工作,比如高温环境,开关磁阻电机有较好的散热性能,可以在高温下正常工作。随着电力电子技术的发展,开关磁阻电机控制将会变得更加容易并且控制效果更好。这种电机启动转矩大,过载能力强,调速范围广。直线开关磁阻电机除了具有以上优点以外,在一些需要做直线运动的场合,它显示出了强大的优越性:再也不需要像传统的做直线运动的装置那样,通过丝杆等传动装置将旋转的运动转化为直线运动。这样再一次的将中间环节给节省下来了,不仅降低了设备的成本,而且能量利用率也得到了提高。开关磁阻电机控制精度高,在高精度加工领域和大功率传输方面有广泛的应用前景。 1.2 项目背景/选题动机 现在有很多高精度加工平台需要直线运动的牵引机构,而目前的加工平台大部分都是利用旋转电机做牵引,再通过机械传动装置将运动形式转化为直线运动加以利用。这样不仅设备成本会很高,而且效率也不高。而直线开关磁阻电机本身的运动形式就是直线的,如果运用到这些设备上的话就会大大降低设备成本且效率也将会得到提高。 二、需求分析 本次设计大体分为四大部分: (1)系统总体方案的设计,包括系统功能分析、系统架构的建立、系统硬件设计等过程。 (2)基于单片机A/D,D/A,PWM等资源的应用。 (3)电机模块的设计。 2.1 功能要求 (1)电流传感器 传感器负责采集直线电机电流以反馈给控制器进行处理。 (2)位置编码器 位置编码器将电机的运动的位置反馈给控制器处理。 (3)微控制器 微控制器负责处理传感器采集的电流、编码器反馈回来的位置。当位置指令给出以后,电机准确且迅速运动到指定位置。 (4)键盘模块 键盘模块负责给定输入。 直线开关磁阻电机位置控制系统架构如图1所示。 图1 系统架构图 2.2 性能要求 (1)稳定性 该系统能够稳定的工作,抗干扰能力好。 (2)快速性和实时性 电机能够迅速的动作达到指定位置,达到实时控制的目的。 (3)准确性 电机能够准确的运动到指定位置。

    时间:2020-07-29 关键词: 电机 单片机

  • 基于GSM的太阳能农业大棚多功能智能监控系统模块设计

    基于GSM的太阳能农业大棚多功能智能监控系统模块设计

    一、项目概述 1.1 引言 当今温室大棚产业不断扩大,人们对于健康的要求也越来越高,温室大棚提高农产品的质量,就必须要有适宜的生长环境。 本文介绍的基于GSM的太阳能农业大棚多功能智能监控系统,通过太阳能给单片机供电,设置不同的大棚植物所需的最适宜生长环境参数,系统实时检测环境值,并在液晶模块上显示,如果与设置参数不同,则会启动报警装置,并通过GSM模块给大棚管理者发送信息,同时自动采取相应操作。我们相信在未来的生活中,尤其是在温室大棚中会起到很重要的作用。 1.2 项目背景/选题动机 近二十年来,我国十分重视农业的发展,对农业设施做了很多投资,温室大棚就是其中最重要的一个项目。它作为一种新型的农业作物种植技术,已经突破了传统作物种植受地域、自然环境、气候等诸多因素的限制,对农业生产有重大意义。产量提高了,但是随着人们生活水平的提高,健康也更加的被人们所关注,温室大棚农产品的质量也是人们关心的焦点,。然而大棚绿色农产品怎么样才能最好的生长呢?目前我国温室大棚多依靠人工经验进行管理,或单片机控制的单参数,单回路的较多,人们无法,通过自己的经验能精准的控制给予蔬菜水果等植物,最佳适宜生长参数。温室大棚自动化程度不高,效率低。就农作物的生长环境而言,光照,温度,湿度是最基本的要素,而温室大棚的智能监控系统是实现其生产自动化,高效率化的最关键,最重要的环节。作为智能监控系统必须能够实现对以上要素的数据进行采集,分析,处理,并且进行相应的报警和智能控制,从而使得温室大棚的农作物能生长在一个最佳适宜的生长环境中。 二、需求分析 2.1 功能要求 单片机所需电能有太阳能提供,可以设置各种植物生长所需的光照度,温湿度值,系统实时采集环境值,并在液晶上显示。如果超标或不足,系统会自动报警,并自动采取开关灯,开关门,灌溉,卷帘等操作。系统会通过GSM模块给大棚管理者发送报警信息。本系统既可用于大面积的温室大棚种植,也可用于特殊植物的小面积培育。系统架构如图2.1所示: 图2.1 系统架构 2.2 性能要求 由太阳能供电,湿度测量范围:20%~90%RH,温度测量范围:0~+50℃,信号传输距离可达20米以上,采集的数据信息在液晶上显示。单片机控制GSM模块,将参数信息发送给管理者。 三、方案设计 3.1 系统功能实现原理 如下图所示:该系统主要由以下几大模块组成:太阳能供电模块,传感器模块(光照度传感器,温湿度传感器),GSM模块,智能控制模块(开关门,开关灯,灌溉,卷帘),键盘模块,液晶显示模块。系统硬件结构框图如图3.1所示: 图3.1 系统硬件结构框图 3.1.1 太阳能供电模块 太阳能是一种干净的可再生的新能源,越来越受到人们的青睐,在人们生活、工作中有广泛的作用, 其中之一就是将太阳能转换为电能,太阳能电池就是利用太阳能工作的。 太阳能供电模块采用深圳市万家好太阳能公司生产的5 W多晶硅太阳能电池,最大电压18V,多晶硅太阳能电池的光电转换效率约12%左右。从制作成本上来讲,比单晶硅太阳能电池要便宜一些,材料制造简便,节约电耗,总的生产成本较低,因此得到大量发展。 3.1.2 传感器模块 光照度传感器:光照度是农作物生长的重要参数之一,在设施农业中光照度的检测越来越得到科技工作者的重视。目前设施农业温室大棚环境控制用的光照度检测电路中,所使用的敏感元件大多为硅光电池。实际上光敏二极管较硅光电池有许多优点,有很高的带宽,价格便宜,特别是光电流与光照度之间呈较好的线性关系,因此他在光耦合隔离器、光学数据传输装置和测试技术中得到广泛的应用。因此本系统是根据光敏二极管的感光特性,设计一种简单实用的光照度检测电路。 温湿度传感器: 温湿度对农作物的生长也相当重要。本系统采用的是DHT11数字温湿度传感器,它是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。 3.1.3 GSM模块

    时间:2020-07-29 关键词: gsm 太阳能 智能监控 单片机

  • 以51单片机系列为核心 腹腔压力动态测量仪

    以51单片机系列为核心 腹腔压力动态测量仪

    腹腔是一个封闭的腔隙,其中的任何器官体积增加超过一定限度均可导致腹内高压,腹腔压力监测旨在通过观察腹部手术后及重症病人的腹内压变化,为及时地给予干预性治疗、护理提供有效的依据。现在对腹腔压力的测量,人们通常采用测量膀胱压力的办法,这种方法是通过一根导尿管插入膀胱,并往膀胱缓慢灌注大约50ml生理盐水,然后测量液体从膀胱流出时的压力。这种方法简单实用,测量数值能够真实反映人体腹腔压力值。但是这种方法有一个非常致命的缺点:每测量一次膀胱压力就需要灌注一次,医务人员不可能不停的去灌注生理盐水,一般的重症监护是每隔4~12小时灌注测量一次,这种间断测量就有可能影响医务人员及时了解病人腹腔压力变化情况,甚至延误实施抢救的最佳时间。本文正是考虑了以往测量方法的弊端,以单片机为核心设计了一种经济实用的腹腔压力动态测量仪,其主要特点是:对病人进行无痛无创连续腹腔压力测量,能实现腹腔压力数据动态采集、存储、显示,以便于医务人员及时掌握病人病情。 测量原理 要对重症病人进行腹腔压力测试,必须进行连续监控,所以我们采用了一种新方法来测量腹腔压力。系统原理框图如图1,注水泵通过导尿管往被测 量人的膀胱注入生理盐水,这里使用的导尿管采用双通道导尿管,注水泵从一个通道往膀胱中灌水,注水速度保持在4ml/h,压力传感器从另一个通道测量流出的水的压力变化情况。传感器将压力变化情况转换成微弱的电压幅度变化(0~75mv),经过模拟放大器放大后得到变化范围在0~4.5v左右的电压变化值,再使用单片机控制a/d转换器对这个模拟电压进行采样,经过单片机进行数据处理后送显示器显示。这个过程使用注水泵不停的注入生理盐水,传感器也不间断的对压力值进行测量,显示器动态刷新测量结果,这样就可以实现长期动态监测。 从测量原理来讲,与传统的测量方法相比有两个方面的改进。 一方面,这里采用双通道导尿管代替了传统测量方法中的普通导尿管。使用双通道导尿管可以用一个通道来进行液体连续灌注,同时使用另一个通道来测量液体经过膀胱后流出时的压力。在传统方法中使用的导尿管只有一个通道,所以灌注的时候不能测量,只有灌注了一定的量之后(一般灌注50ml),撤掉灌注设备,然后接上测量设备开始测量液体从膀胱流出时的压力。 另一方面,为了实现动态测量,我们采用了单片机(at89s52)来控制整个系统的动态工作。at89s52在系统中主要用来控制a/d转换器进行数据动态采集,把采集到的压力数据进行实时处理,控制显示器动态刷新显示结果。在传统方法中,由于只测量一次压力数值,所以一般不采用微处理器进行动态管理,测量设备软硬件都更简单。 系统硬件设计 系统采用at89s52作为主控制器,控制数据采集、运算和显示。压力传感器采用npc1210高精度压力传感器,压力传感器输出的是0~75mv微弱电压信号。传感器的输出信号经双绞屏蔽线传出,送入放大器进行放大。放大器选用icl7650这种高精度运算放大器,它具有输入偏置电流小、失调小、增益高、共模抑制能力强、且价格低廉等优点,放大器电路如图2所示。 图2 放大电路 对传感器输出的微弱电压信号放大60倍左右输出送a/d转换器。选用8位a/d转换器ad0809实现模拟信号到数字信号的转换,用at89s52控制a/d转换器采集放大器输出的范围在0~4.5v的模拟电压信号。at89s52与ad0809的接口电路如图3,得到的数字信号送at89s52进行处理。后端采用3位共阳极数码管显示结果,由单片机p2口输出段码,p1口输出位码。 图3 at89s52与ad0809的接口电路 系统软件设计 主要子程序模块包括:系统初始化、a/d转换程序、平均滤波子程序、标度变换子程序、二进制转bcd码子程序。主程序流程图如图4所示。为了防止病人由于咳嗽等偶然原因造成的腹腔压力陡变影响,在数据处理方面,采用了平均滤波方法以减小偶然误差。图5为平均滤波子程序流程图。该子程序采用平均滤波的方法进行数据处理,即将连续采样10次的数据去掉最大值和最小值之后进行累加求和,按8次采样值取平均数,即得有效采样值,存入发送缓冲区。 图4 主程序流程图 图5 平均滤波子程序流程图 止信号干扰的注意事项 系统应用于对危重病人腹腔压力的监测,可靠性成为设计时要考虑的重点。系统使用高精度压力传感器检测压力变化,对干扰信号的抑制也就成为设计成败的关键。在设计中主要作如下考虑: (1)为了抑制因为电源电压波动引起的噪声影响,增加去藕电容、屏蔽罩和滤波电路。 (2)各逻辑电路芯片中未使用的输入端,根据逻辑关系接至已使用芯片的输入端或者接地,或者接高电平,以减少外部干扰信号对系统的影响。 (3)时钟脉冲信号配置适当靠近cpu,选择短而粗的引线。 (4)对弱信号线进行屏蔽保护;电源线与信号线分开走线,以防止线间串扰。 (5)合理布置地线:由于本系统的信号工作频率为11.0592mhz,数字地与模拟地分开,分别与电源端地线相连,而且尽量加大模拟电路的接地面积;接地线尽量加粗,以防止接地电位会随电流的变化而变化,使系统的定时信号电平不稳定,使系统的抗噪声性能变差。 (6)任何信号线都不形成环路;走线尽量要短而直;尽量减少过孔量;尽量用45°折线而不用90°折线布线。 (7)时钟线要垂直于i/o口线,可以减少i/o口线对时钟电路的干扰。 (8)模拟信号输入线、参考电压端尽量远离数字电路信号线。 (9)在软件设计时采用平均滤波的方法减小偶然误差。 结论 本文设计了腹腔压力动态测量系统,采用双通道导尿管,用连续灌注,连续测量的方式来实现对腹腔压力的动态测量。测量仪选用低功耗8位单片机at89s52对压力传感器采集的腹腔压力信号进行实时分析及处理。所设计的腹腔压力动态测量仪带有数码管显示器, 能实时显示所检测的腹腔压力信号。测量仪对传统的设备和方法加以改进,对熟悉传统设备的医务人员也不会带来更多的负担。这种腹腔压力测量仪摒弃了传统的人工定期监测的方法,采用了先进的连续测量的方法,为重症病人的腹腔压力监控开辟了新的途径。

    时间:2020-07-28 关键词: 医疗电子 单片机

  • 最简单的单片机PID控制算法程序

    这个程序应用在51单片机上的 /*************定义全局变量*****************/ uchar Kp,TI,Td int Set_speed; /*************PID初始化函数***************/ void PID_init(void){ Serror=0; FError=0; Kp=30; TI=500; Td=10; } int PID_control(int Now_speed) { int Error,Serror,result; Error=Now_speed-Set_speed; Serror=Serror+Error; result=(Kp*Error+Kp*0.05/TI*Serror+Kp*Td/0.05*(Error-FError)); FError=Error; //对占空比进行限幅处理 if(result《10) {result=0;} else if(result》1000) {result=1000;} return result; }

    时间:2020-07-24 关键词: 单片机 pid控制

  • 跳舞机器人的软件部分设计:主控单片机程序和从机程序

    跳舞机器人的软件部分设计:主控单片机程序和从机程序

    一、软件架构与通信协议 1、软件架构 在开始前,我们来复习一下第一期文章中提到的软件架构图。 首先介绍一下软件的架构,小π机器人的软件部分主要包含手机APP程序、上位机程序、主控单片机程序和从机程序构成。本周主要讲解主控单片机程序和从机程序,下周将讲解手机APP程序和上位机程序。小π机器人的软件架构图如下图所示: 主控单片机收到数据以后先判断是动作指令还是其他指令。如果是动作指令,直接将指令发给动作控制单片机,动作控制单片机调用不同的数组,输出不同的PWM,使舵机的转过不同角度,从而实现各种不同动作。如果是其他指令,比如三色RGB灯的控制,解析出三色的数据,输出不同电压,实现脸部变色功能。比如喇叭,可以播放SD卡中的音乐。 2、通信协议 为了方便手机与单片机之间、上位机与单片机之间、主机与从机之间的通信,我们定义了属于自己的通信协议。 通信协议的基本格式为。 例如动作指令。其中,“”代表指令结束。这句话的意思就是向前走5步。其它动作指令也是类似的。 灯光颜色选择指令由三条指令构成,分别为,和。众所周知,红、绿、蓝是光的三原色,通过控制红、绿、蓝的比例,就可以实现任意颜色的输出。R、G、B是英文红色red、绿色green、蓝色blue的首字母,分别代表红色、绿色和蓝色。R、G、B的参数变化范围为0-255,这样就可以变化出1600多万种颜色。 二、单片机选择 为了方便大家编写单片机的程序,我们采用的是完全开源的Arduino系列单片机。Arduino由一个欧洲开发团队于2005年冬季为艺术生开发,所以比较简单,容易上手。Arduino由硬件(各种型号的Arduino板)和软件(Arduino IDE)组成。下图为常用的几款Arduino。 Arduino IDE可以在Windows、Macintosh OSX、Linux三大主流操作系统上运行。Arduino语言基于wiring语言开发,是对 avr-gcc库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,人人都可以快速的进行开发。Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。 总之,Arduino具有跨平台、开发简单、开源的优点,所以我们采用的Arduino系列单片机。 三、运动控制简析 小π机器人有4个自由度,换句话说,小π机器人的运动主要是通过控制4个舵机来实现的。4个舵机在一定时间内依次转动不同的角度,再通过一定的排列组合,就可以实现前进、左转、右转、后退等简易动作和摇头、抬脚、晃腿、弹跳等复杂的动作。 舵机的输入线共有三条,红色中间,是电源线,一边黑色的是地线。舵机的控制信号为周期是20ms的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。 由于一次改变PWM占空比太多,舵机转动速度过快、转动角度太大,会造成动作不协调、也不美观,而且运动过快容易造成小π机器人的不平衡。所以要控制小π机器人做一个特定的动作,只能分多次控制舵机的角度,每次只转动一点角度,延时一定时间后再次改变舵机的角度,这个延迟时间一般为几个毫秒,这样就可以使舵机比较平缓的转动相应的角度。 四、其余硬件部分程序 1、蓝牙模块 蓝牙模块使用的是HC-06,负责与手机之间进行通信。单片机与蓝牙模块之间的通信采用的是串口通信。波特率设置为115200,设置代码为Serial.begin(115200)。发送命令代码为Serial.println(””)。 2、音频播放模块 主控单片机通过模拟人按压独立按键产生一个脉冲信号控制蓝牙音频模块,实现切换歌曲、调节音量、播放与暂停的功能。 例如,定义播放/暂停键为2号端口,初始化代码为: pinMode(2,OUTPUT); 产生一个脉冲信号代码为: digitalWrite(2,HIGH);//2号端口置为高电平 delay(200);//延时200毫秒 digitalWrite(2,LOW); //2号端口置为低电平 delay(1000);//延时1秒 3、七彩LED控制 主控单片机产生三个不同PWM信号实现对七彩LED的控制,最终达到灯光秀的效果。 PWM信号是数字方波,其中频率是恒定的,但信号接通时间的一小部分(占空比)可以在0和100%之间变化。 4、触摸功能 三根触须使用的是金属材料,人摸触须时,由于端口电平的改变触发中断,执行相应的操作。 中断设置代码如下: pinMode( pinInterrupt, INPUT);//设置管脚为输入 //Enable中断管脚, 中断服务程序为onChange(), 监视引脚变化 attachInterrupt(digitalPinToInterrupt(pinInterrupt),onChange,CHANGE); 5、语音互动功能 将语音以数组的形式存到SD卡中,每次进行语音互动时,提取相应的数据,产生音频输出信号,经过滤波后通过喇叭播放相应的语音。 6、SD卡模块 SD卡模块读写可以采用SPI模式或者SDIO模式读写数据。 SD库允许读取和写入SD卡,例如在Arduino以太网盾上。该库支持标准SD卡和SDHC卡上的FAT16和FAT32文件系统。它使用简短的8.3名称作为文件。传递给SD库函数的文件名可以包含用正斜杠分隔的路径,例如“directory / filename.txt”。由于工作目录始终是SD卡的根目录,因此无论是否包含前导斜杠(例如,“/file.txt”等同于“file.txt”),名称都是指同一个文件。从版本1.0开始,该库支持打开多个文件。 微控制器和SD卡之间的通信使用SPI,它发生在数字引脚11,12和13(在大多数Arduino板上)或50,51和52(Arduino Mega)上。另外,必须使用另一个引脚来选择SD卡。这可以是硬件SS引脚 - 引脚10(在大多数Arduino板上)或引脚53(在Mega上) - 或调用SD.begin()时指定的另一个引脚。 请注意,即使您不使用硬件SS引脚,也必须将其保留为输出或SD库不起作用。 这些模块的代码都比较简单、网上也有大量的例程。需要什么程序,大家自由组合就好了。

    时间:2020-07-21 关键词: 蓝牙 机器人 单片机

  • gsm模块如何与单片机通信?

    gsm模块如何与单片机通信?

      51单片机与GSM模块实现通信   1、检测串口线的好坏   1)将串口线插在电脑上,用短路子短接串口的2脚和3脚   2)打开串口调试助手   3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能接收到自己发的数据表示串口线是正常的,否则是坏的。   2、下完单片机程序后,看看串口是否有数据发出检测   3、单片机上与模块通信的4个灯表示的含义   1)DO灯   一直闪表示单片机串口与GSM模块串口通信不正常,否则串口通信正常   2)D1灯   灯亮就表示模块注册上网络,否则没有注册上网络   3)D2灯   灯亮表示开始发短信   4)D3灯   灯亮表示发短信结束   4、单片机板子与GSM模块的连接   单片机---------GSM模块   VCC--------vcc(P5的第3脚)   GND--------GND(P5的第4脚)   RX_232(表示单片机的发)----------RXDPC_232(模块的收(P5的第5脚))   TX_232(表示单片机的收)----------TXD_PC232(模块的发(P5的第6脚))   gsm模块和单片机连接   单片机连接GSM模块,直接就是把异步串行通信口的TX和RX连上就可以,别忘了地线。   注意事项:   1、不同的单片机有不同的电压,一般GSM模块的输入输出电平是2.85V,51系列的电平是5V,一般在51输出的TX那根线上串联2K的电阻,基本上可以使用。如果是3.3V的单片机,这个电阻就可以很小,几百欧姆就可以。   2、GSM模块本身的电源和SIM卡电路很麻烦,首先是大多数GSM模块都是用FPC40的接口,排线的间距只有零点五毫米,而且是塑料外壳,不好焊接。焊不好的话工作不稳定。其次是电源部分较麻烦,GSM模块的发射电流较大,最大瞬间电流2A!所以电源部分一般要用LM2576这种大电流的DC-DC变换器来提供4V的电压,DCDC电路设计本身就很不容易,个人应用比较难,需要做电路板。搭接的不稳定。还有SIM卡部分,SIM卡与GSM模块通信本身就是个复杂的高频过程,电路抗干扰能力强,我曾经试过用电线给它们连接起来,没有十分钟,就掉线了。所以SIM卡部分也需要精心设计,别看只有五根数据线而已。   单片机控制TC35GSM模块的方法   1、硬件连接   电路见下图只需设计一个TTL转RS232电平电路,连接到MCU的UART口,另一端直接连接到TC35。   2、指令输出的方法   单片机串口设置成模式1(9600,N,8,1),依次将AT+xxx以ASCII码形式输出到UART口;接收TC35的数据采用中断方式。这里给出详细的程序清单(Keil C51),不介绍编程的方法。程序见下:   //AT指令的定义   char code AT_Tc35[]=“AT+”; //连机   char code Bps_Tc35[]=“IPR=38400”; //波特率   char code Text_Tc35[]=“CMGF=1”; //文本模式   char code Read_Tc35[]=“CMGR=”; //读信息   char code Erase_Tc35[]=“CMGD=”; //删除信息   char code Send_Tc35[]=“CMGS=”; //发送信息   char code Creg_Tc35[]=“CREG?”; //注册   //模式设置   void UART_Init(void)   {   SCON=0x50; //01010000b=》1模式scon,#11011000b;   ES=l;   }   //发送-个ASCII   void SendASC(unsigned char ASC)   {   bit es;   es=ES;   ES=0;//关闭中断   TI=0;   SBUF=ASC;   while(!TI);   TI=0;   ES=es;   )   //发送命令到TC35   void SendToTc35(unsigned char* p,unsigned char Long)   {   while(Long--)   {   SendASC(*p++);   }   }   // 通讯中断接收程序   void Rs485_Do(void) interrupt 4 using 1   {   if(RI==l)   {   RI=0;   RsBuq[RsPoint++]=SBUF;   if fRsPoint》=sizeof(RsBuf))   {   RsPoint=0;//FlagRs485=0;   } //数据处理   }   }   // 发送AT连机命令   char code AT_Code[]=“OK”;   void Send_AT(void)   {   unsigned char *p;   while(1)   {   ClrRsBuf(RsBuf,sizeof(RsBuf));   SendToTc35(AT_Tc35,2); //“AT”   SendASC(OVER);   //************等待应答“ok“   ES=1; //必须中断   Delay(50);   P=strstr(RsBuf,AT_Code);   if(p!=NULL) break;   }   )   //发送bps连机命令   void Send_BPS(void)   {   SendToTc35(AT_Tc35,3); //”AT+“   SendToTc35(Bps_Tc35,sizeof(Bps_Tc35)-1);//”IPR=19200“   SendASC(OVER);   }   //设置文本   void SetText(void)   {   SendToTc35(AT_Tc35,3); //”AT+“   SendToTc35(Text_tc35,sizeof(Text_tc35)-1);//”IPR=19200“   SendASC(OVER);   Delay(100):   //删除短信息   unsigned char EraseMsg(unsigned char index)   {   unsigned char *p,i=20;   SendToTc35(AT_Tc35,3); //”AT+“   SendToTc35(Erase_Tc35,sizeof(Erase_Tc35)-1);//”IPR=19200“   SendASC(index);   SendASC(OVER);   ES=1;   while(i--)   {   Delay(200);   P=strstr(RsBuf,AT_Code);   if(P!=NULL) {return 1;}   }   return 0;   }   //读取短信息   char code Ask_No[]=”+CMGR:0,,0“;   char code ERROR{]=”ERROR“;   char code Ask_Tc35[]=”/“;   unsigned char ReadMsg(unsigned char index)   {   unsigned char *p,i;   unsigned char Buf[40];   SendToTc35(AT_Tc35,3); //”AT+“   SendToTc35(Read_Tc35,sizeof(Read_Tc35)-1);   SendASC(index);   SendASC(OVER);   ES=1; //必须中断   Delay(600);   /*-------   ES=0:   SendToTc35(RsBuf,99);   ES=1;   */|   p=strstr(RsBuf,ERROR);   if(P!=NULL)   {   Send_AT();return 0;   p=strstr(RsBuf,Ask_No);//无信息   if(p!=NULL)return 0;   p=strstr(RsBuf,Ask_Tc35);//20个字节后是MSG   if(p==NULL) return 0;   p=p+21;   for(i=0;i《sizeof(Buf);i++)   {   Buf[i]=*p++;   }   if(EraseMsg(index)==0) return 0;   p=strcpy(RsBuf,Buf); //放回RsBuf   return 1;   )   //发送短信息   char code SK[]=”》“;   void SendMsgStart(void)   {   unsigned char *p,i=10;   SendToTc35(AT_Tc35,3); //”AT+“   SendToTc35(Send_Tc35,sizeof(Send_Tc35)-1);//”IPR=19200“   SendASC(YinHao);   SendToTc35(Mp1.Hand,sizeof(Mp1.Hand)); //”AT+“   SendASC(YinHao);   SendASC(OVER);   ES=1;   while(i--)   {   Delay(100); //Get”》“   p=strstr(RsBuf,SK);//”》“   if(p!=NULL)   {   ClrRsBuf(RsBuf,sizeof(RsBuf));   Delay(150); //Get”》“   break;   }   }   }

    时间:2020-07-17 关键词: 单片机 gsm模块 tc35

  • 单片机C语言之串口通信协议

    单片机C语言之串口通信协议

      串口通信概述   串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。   常用三种串口通信协议   1、RS-232   RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。   从计算机连出的线的截面。   RS-232针脚的功能:   数据:   TXD(pin 3):串口数据输出(Transmit Data)   RXD(pin 2):串口数据输入(Receive Data)   握手:   RTS(pin 7):发送数据请求(Request to Send)   CTS(pin 8):清除发送(Clear to Send)   DSR(pin 6):数据发送就绪(Data Send Ready)   DCD(pin 1):数据载波检测(Data Carrier Detect)   DTR(pin 4):数据终端就绪(Data Terminal Ready)   地线:   GND(pin 5):地线   其它   RI(pin 9):铃声指示   2、RS-422   RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。   3、RS-485   RS-485(EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个设备的能力,你可以使用一个单个RS-485口建立设备网络。出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。   串口的基本结构   SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。   当发送使用时,就采用SBUF=XXX; (XXX为需要传送的数据)   当接收使用时,采用XXX=SBUF;   记得因为是串行的所以传输都是一位一位进行的。   T1溢出率:T1计时器的溢出频率(就是计时器每次低位计满向高位进位时间的倒数)   用处:用于计算波特率(每秒传输二进制代码的位数)   串口通信方式   并行   适合短距离通信,并行通信控制简单、相对传输速度快(8位一起传输)。   串行   只能一位一位的传送。   同步(了解)   建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙。   发送方对接收方的同步可以通过外同步和自同步   异步(常)   以字符(构成的帧)为单位进行传输。数据位从低到高传送。   格式:   这里的空闲时间是任意的。   单片机C语言之串口通信协议   现在我们要做一个实验,将一个字节从51单片机发送到电脑串口调试助手上。这个实验的目的是为了掌握串口通信协议的收发过程。   虚拟串口   实验一、虚拟串口实验   一般单片机都有专门的串口引脚,51里面分别是P3.0和P3.1,这些引脚拥有串口的硬件电路,因此使用它们并不需要设置信号的发送停止。为了掌握协议,我们使用其他的引脚来模拟串口,所以也叫虚拟串口。这里我们选用P1.0,然而注意到我们51单片机要发送数据给电脑,必须经过一个串口转USB设备(即TTL电平转换为RS232电平),而限于我们的开发板只有P3.0与P3.1连接到了串口转USB设备,所以我们可以将P1.0短接到P3.1 。 下图是这个串口转USB的原理图。   代码如下:   #include “reg51.h”   /*   将P1.0虚拟成串口发送脚TX   以9600bit/s的比特率向外发送数据   因为波特率是 9600bit/s   所以me发送一位的时间是 t=1000000us/9600=104us   */   sbit TX=P3^1; //P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1   #define u16 unsigned int //宏定义   #define u8 unsigned char   u8 sbuf;   bit ti=0;   void delay(u16 x)   {   while(x--);   }   void TImer0_Init()   {   TMOD |= 0x01;   TH0=65440/256;   TH0=65440%256;   TR0=0;   }   void Isr_Init()   {   EA=1;   ET0=1;   }   void Send_Byte(u8 dat)   {   sbuf=dat;//通过引入全局变量sbuf,可以保存形参dat   TX=0; //A 起始位   TR0=1;   while(TI==0); //等待发送完成   TI=0; //清除发送完成标志   }   void TF0_isr() interrupt 1 //每104us进入一次中断   {   staTIc u8 i; //记录进入中断的次数   TH0=65440/256;   TL0=65440%256;   i++;   if(i》=1 && i《=8)   {   if((sbuf&(1《《(i-1)))==0) // (sbuf&(1《《(i-1)))表示取出i-1位   {   TX=0;   }   else   {   TX=1;   }   }   if(i==9) //停止位   {   TX=1;   }   if(i==10)   {   TR0=0;   i=0;   ti=1; //发送完成   }   }   void main()   {   TX=1; //使TX处于空闲状态   Timer0_Init();   Isr_Init();   while(1)   {   Send_Byte(65); //0x41   delay(60000);   }   }   实验引入了定时器0来控制发送线上的各个位的保持时间。首先main函数进入,TX置1则使发送线处于空闲,这时候发送方和接受方都处于空闲。接下来初始化定时器0,TR0置0表示还不要启动定时器0。接着中断系统初始化,此时中断系统已经开启。进入while循环,先进Send_Byte()函数,将65传给形参dat,dat再将65赋值给sbuf,到这里准备工作就做好了。接着TX置0,这个是起始位,要保持这个起始位104us。于是就启动定时器TR0置1,计时器开始计数。当第一次溢出的时候,也就是过了104us,进入中断,同时接收方也侦测到了这个突然被拉低的信号,于是迅速启动自己的定时器。进入中断子函数后,先是重装定时器初值,然后i加1,也就是当i=1时,就应该发送数据的最低位了,总共有8位数据,所以使用条件语句if(i》=1 && i《=8)来判断是否发送完数据位。然后再通过if(i==9) 来发送停止位,最后当i=10时,也就是发送完了,这时候要关闭定时器(那么程序也就),同时i置0,ti置1(才能跳出while(ti==0)循环),最后将ti置0,保证下次要发送字节时让程序停留在while(ti==0)。   片上串口   以上说的是虚拟串口,上文中谈到与串口相关的引脚P3.0与P3.1,事实上51单片机自带片上串口,那这个串口又该怎么使用呢?   片上串口支持同步模式与异步模式。简单来说同步模式就是指有时钟线,而异步模式无时钟线。这里的时钟线是指在同步通信时,用一根线专门传输时钟信号,这个信号用来与要发送的每一位保持同步,这样就避免了例如异步通信中因为采用定时器而引入的时间误差。   片上串口还支持8位模式和9位模式。如下图所示   其中D0-D7是一个字节的8个位。9位模式只是多了一个位TB8,这个TB8的作用是奇偶校验或多机通信。奇偶校验原理这不加分析。多机通信时比如主机只发送数据给网络中的一台地址为0x02的设备,这时候先让TB8为1,前面的D0-D7则为地址即0x02,之后再让TB8为0,前面的D0-D7则为数据了。   上面设置了片上串口的模式,另外还要设置串口的波特率。   片上串口的波特率等于定时器1工作在方式2时溢出率的32分频。如果要定时器1工作在方式2,那么TMOD=0x20。另外要保证为32分频,我们还必须设置计数器初值。设晶振为11.0592Mhz,则定时器的计数脉冲为F=f/12,则定时器每计一个脉冲的时间为T=12/f。又令计数器的起点为x,则溢出一次要计的脉冲数为(256-x)。所以在计数起点为x时,溢出一次的时间为t=12/f*(256-x)。则对应的溢出率为1/t=f/(12*(256-x))。对应的波特率就为b=f/(384*(256-x))。   x=256-f/(384*b)   其中f为晶振频率,b为希望的波特率,x为定时器的计数起点TH1的值。   例如当晶振为11.0592M,希望波特率为9600bit/s,则TH1=253。题外话,我们同样可以演算出在其他常用波特率情况下,TH1始终为一个整数。这里也就解释了为什么51里面选用了11.0592M的晶振而不是12M,这样就保证了串口的时序更加准确,虽然牺牲了定时器的准确度。   实验二,片外串口发送一个字节。   好了现在开始我们的实验之旅。直接看代码吧。   #include “reg51.h”   #define u16 unsigned int   #define u8 unsigned char   void delay(u16 x)   {   while(x--);   }   void Uart_Init() //串口初始化   {   SCON=0x50; //8位异步模式   TMOD|=0x20; //定时器1工作方式2   TH1=253;//9600bit/s   TR1=1;   }   void Send_Byte(u8 dat)   {   SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器   while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位   TI=0;   }   void main()   {   Uart_Init();   while(1)   {   Send_Byte(‘m’);   delay(60000);   }   }   实验二较之实验一,代码减少了很多,而且不用考虑繁琐的位发送时序。只需要明白各个寄存器SCON,TMOD,TCON,SBUF的用法。TI是SCON中的第一位,为发送中断请求标志位。在本方式中,在停止位开始发送时由内部硬件置位,响应中断后TI必须又软件清零。   实验三、片上串口发送一个字符串   上面介绍了如何发送一个字节,那如何发送一个字符串甚至文本呢?这里我们首先介绍下字符串的概念。   字符串:从存储器的某个地址开始,连续存放多个字符的ASCII码,并且在最后一个字符的后面存放一个0,这段连续的内存空间就叫字符串,最后的0叫字符串的结束符。注意这里的0和加单引号的0不是一个概念,加单引号的0是指0的ASCII码。   数组与字符串的关系:字符串是数组的一种特殊情况,数组在特定条件下可当做字符串用。C语言用双引号描述一个字符串,如“abcd”。   下面我们通过一个实验来展示如何发送字符串。我们实验的目标是打印字符串“Hello World ! 第一!”到打印机。直接上代码。   #include “reg51.h”   #define u16 unsigned int   #define u8 unsigned char   void delay(u16 x)   {   while(x--);   }   void Uart_Init() //串口初始化   {   SCON=0x50; //8位异步模式   TMOD|=0x20; //定时器1工作方式2   TH1=253;//9600bit/s   TR1=1;   }   void Send_Byte(u8 dat) //串口发送一个字节   {   SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器   while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位   TI=0;   }   void Send_String(u8 *str) //发送一个字符串 *str为字符串第一个字符的地址   {   abc: //标号   if(*str != 0)   {   Send_Byte(*str);   str++;   goto abc;   }   }   void main()   {   Uart_Init();   while(1)   {   Send_String(“Hello World! 第一!”);   Send_Byte(10);   delay(60000);   delay(60000);   }   }   实验效果

    时间:2020-07-16 关键词: 通信协议 单片机 串口通信

  • 实现51单片机与GSM模块通信介绍

    实现51单片机与GSM模块通信介绍

    51单片机与GSM模块实现通信 1、检测串口线的好坏 1)将串口线插在电脑上,用短路子短接串口的2脚和3脚 2)打开串口调试助手 3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能接收到自己发的数据表示串口线是正常的,否则是坏的。 2、下完单片机程序后,看看串口是否有数据发出检测 3、单片机上与模块通信的4个灯表示的含义 1)DO灯 一直闪表示单片机串口与GSM模块串口通信不正常,否则串口通信正常 2)D1灯 灯亮就表示模块注册上网络,否则没有注册上网络 3)D2灯 灯亮表示开始发短信 4)D3灯 灯亮表示发短信结束 4、单片机板子与GSM模块的连接 单片机---------GSM模块 VCC--------vcc(P5的第3脚) GND--------GND(P5的第4脚) RX_232(表示单片机的发)----------RXDPC_232(模块的收(P5的第5脚)) TX_232(表示单片机的收)----------TXD_PC232(模块的发(P5的第6脚)) gsm模块和单片机连接 单片机连接GSM模块,直接就是把异步串行通信口的TX和RX连上就可以,别忘了地线。 注意事项: 1、不同的单片机有不同的电压,一般GSM模块的输入输出电平是2.85V,51系列的电平是5V,一般在51输出的TX那根线上串联2K的电阻,基本上可以使用。如果是3.3V的单片机,这个电阻就可以很小,几百欧姆就可以。 2、GSM模块本身的电源和SIM卡电路很麻烦,首先是大多数GSM模块都是用FPC40的接口,排线的间距只有零点五毫米,而且是塑料外壳,不好焊接。焊不好的话工作不稳定。其次是电源部分较麻烦,GSM模块的发射电流较大,最大瞬间电流2A!所以电源部分一般要用LM2576这种大电流的DC-DC变换器来提供4V的电压,DCDC电路设计本身就很不容易,个人应用比较难,需要做电路板。搭接的不稳定。还有SIM卡部分,SIM卡与GSM模块通信本身就是个复杂的高频过程,电路抗干扰能力强,我曾经试过用电线给它们连接起来,没有十分钟,就掉线了。所以SIM卡部分也需要精心设计,别看只有五根数据线而已。 单片机控制TC35GSM模块的方法 1、硬件连接 电路见下图只需设计一个TTL转RS232电平电路,连接到MCU的UART口,另一端直接连接到TC35。

    时间:2020-07-15 关键词: 单片机 gsm模块

  • PLC与单片机有什么不同

    PLC与单片机有什么不同

    想搞清楚PLC与单片机有什么不同,在网上搜了许多,看得头都大了,还是一团雾水。最后把其中说到点子上的一些句子,综合起来认真分析总结,本人认为PLC与单片机的差别应该是: 1.PLC是应用单片机构成的比较成熟的控制系统,是已经调试成熟稳定的单片机应用系统的产品。有较强的通用性。 2.而单片机可以构成各种各样的应用系统,使用范围更广。单就“单片机”而言,它只是一种集成电路,还必须与其它元器件及软件构成系统才能应用。 3.从工程的使用来看,对单项工程或重复数极少的项目,采用PLC快捷方便,成功率高,可靠性好,但成本较高。 4.对于量大的配套项目,采用单片机系统具有成本低、效益高的优点,但这要有相当的研发力量和行业经验才能使系统稳定。 从本质上说,PLC其实就是一套已经做好的单片机(单片机范围很广的)系统。 但PLC也有其特点:PLC广泛使用梯形图代替计算机语言,对编程有一定的优势。你可以把梯形图理解成是与汇编等计算器语言一样,是一种编程语言,只是使用范围不同!而且通常做法是由PLC软件把你的梯形图转换成C或汇编语言(由PLC所使用的CPU决定),然后利用汇编或C编译系统编译成机器码!PLC运行的只是机器码而已。梯形图只是让使用者更加容易使用而已。 如所说,那么MCS-51单片机当然也可以用于PLC制作,只是8位CPU在一些高级应用如: 大量运算(包括浮点运算),嵌入式系统(现在UCOS也能移植到MCS-51)等,有些力不从心而已,不过加上DSP就已经能满足一般要求了,而且同样使用梯形图编程,我们可把梯形图转化为C51再利用KEIL的C51进行编译。我们也能发现不用型号的PLC会选用不同的CPU,其实也说明PLC就是一套已经做好的单片机系统。 既然如此,当然也可以用单片机直接开发控制系统,但是对开发者要求相当高(不是一般水平可以胜任的),开发周期长,成本高(对于一些大型一点的体统你需要做实验,印刷电路板就需要一笔相当的费用,你可以说你用仿真器,用实验板来开发,但是我要告诉你,那样做你只是验证了硬件与软件的可行性,并不代表可以用在工业控制系统,因为工业控制系统对抗干扰的要求非常高,稳定第一,而不是性能第一,所以你的电路板设计必须不断实验,改进)。当你解决了上述问题,你就发现你已经做了一台PLC了,当然如果需要别人能容易使用你还需要一套使用软件,这样你可以不需要把你的电路告诉别人。你也不可能告诉别人。 这样一看PLC其实并不神秘,不少PLC是很简单的,其内部的CPU除了速度快之外,其他功能还不如普通的单片机。通常PLC采用16位或32位的CPU,带1或2个的串行通道与外界通讯,内部有一个定时器即可,若要提高可靠性再加一个看家狗定时器问题就解决了。 另外,PLC的关键技术在于其内部固化了一个能解释梯形图语言的程序及辅助通讯程序,梯形图语言的解释程序的效率决定了PLC的性能,通讯程序决定了 PLC与外界交换信息的难易。对于简单的应用,通常以独立控制器的方式运作,不需与外界交换信息,只需内部固化有能解释梯形图语言的程序即可。实际上,设计PLC的主要工作就是开发解释梯形图语言的程序。现在的单片机完全可以取代PLC。以前的单片机由于稳定性和抗电磁干扰能力比较的弱和PLC是没有办法相比的 现在的单片机已经做到了高稳定性和很强的抗干扰能力在某些领域已经实现了替换。

    时间:2020-07-12 关键词: plc 单片机

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包