微控制器在工控方面的使用对策.doc_第1页
微控制器在工控方面的使用对策.doc_第2页
微控制器在工控方面的使用对策.doc_第3页
微控制器在工控方面的使用对策.doc_第4页
微控制器在工控方面的使用对策.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言单片机是微型计算机的一个重要的分支。自1976年Intel公司推出第一款8位单片机MCS48开始,单片机在短短几十年间获得了长足的发展,从最开始的4位机到更高性能的8位机,到速度更快,片内资源更为丰富的增强型8位机、16位机甚至32位机,其性能不断增强,功能也日益完善。目前64位机已经面世。在这微控制器大家族中,MCS51、52系列兼容机借助其本身雄厚的基础与实力,重回单片机霸主的宝座。既然微控制器功能如此强大,那是否可以像PLC一样,在工业自动化程控中得到普及。 本论文将分六章介绍如何用单片机构造一个PLC小型控制系统。该系统包括:(一)设计一个12进8出带通讯功能的控制板 (二)输入输出部份程序的编写 (三)外置EEPROM外部数据存储器的编写 (四)STC系列内置EEPROM单片机的编写 (五)多机通讯程序的编写(六)与PC通讯的编写/*/(一) 设计一个12进8出带通讯功能的控制板在线路设计构造上分为:输入部份、输出部分、CPU部份、RS485通信部份、外部EEPROM部份。接线端口J1、R18、D1D12、U1U3、R1、R2共同组成输入部份,其中D1D12为发光二级管,主要是用作输入显用,R18这它们总的限流电阻。U1U3为光耦型号TLP_521_4。R1、R2为9脚电阻排,阻值为4.7K10K均可。输出部份:KA1KA8为输出小型继电器(均为常开输出方式)。U10型号ULN2803为8位电流驱动放大器,高电平触发。R10R17、D14D21组成输出显示,即当某个KA得电吸合时与之相对应的LED就会被点亮。J3为输出接线端子。CPU部份:U5为DIP_40封装形式的单片机,可选用AT89系列,也可选用STC系列等。C1为单片机的上电复位电容。C2、C4、Y1为单片机晶振系统。RS485通信部份由R3R5、R7R9、U6、U7、C3、D13组成,其中U6为75176,U7为NE555。外部EEPROM部份只有一块24C16串口寄存器(2K8bit),线路中已将A0A2(地址码)端相联接并且接地。外部I/O接线图如图(二)。为了提高控制板的他稳定性,输入输出均采用全光耦隔离设计。如果输入信号线较远,可以将12伏的直流电改为24伏,与此同时也要将R18改为2.2k左右,小型继电器线圈电压也改为24V即可。(图二)/*/(二)输入输出部份程序的编写2.1如何跳过按键抖动实际上,在人按下一次按键时,并不是理想中的只出现一次干净利落的低电平脉冲,由于按键中弹性元件或用导线替代按键时导线弹性、触点的接触电阻和电路的分布电容的影响,在按下按键或抬起按键时,脉冲前沿和后沿均会出现一系列尖毛刺,如下图三所示:(图三)而单片机运行的速度特别快,结果在按下一次按键时单片机却检测为多次按键。为避免出现这种情况,通常:(一)根据按键抖动的频率和人们按键的速度,调用10ms左右的延时程序来跳过按键抖动的时间:(二)检测按键按下后稳定的低电平即可。据此,在按键判断程序中则要调用一个延时10ms的延时子程序。;-以下是延时汇编程序,延时约10ms-;时间继电器KT10MS: MOV R5,#0BHF1: MOV R7,#02HF2: MOV R6,#0FFHF3: DJNZ R6,F3 DJNZ R7,F2 DJNZ R5,F1 RET;-以下是延时C程序,延时约10ms子函数-/*= */void kt10ms(unsigned int count) /*在这个调用子函数中设计了一个计数器count,*/ /*设计用时为1则为10ms,如为100则延时为100*10ms */ unsigned int i,j,k; /*最终延时为1秒钟,计数器最大可设为65536 */ for(i=0;icount;i+) for(j=0;j10;j+) for(k=0;k120;k+) ;2.2 如何定义输入与输出布尔代数为了更方便的控制输入与输出点,可用程序宏定义来实现。可将输入点定义为SB0、SB1或者是将它定义成像三菱PLC那样(X000、X001),输出点则可定义成KA1、KA2或者是Y000、Y001。这样使用起来就好了许多。;=用汇编程序定义输入输出点=;定义输入部份 ;定义输出部份 SB0 EQU P1.0 KA1 EQU P0.0 SB1 EQU P1.1 KA2 EQU P0.1 SB2 EQU P1.2 KA3 EQU P0.2 SB3 EQU P1.3 KA4 EQU P0.3 SB4 EQU P1.4 KA5 EQU P0.4 SB5 EQU P1.5 KA6 EQU P0.5 SB6 EQU P1.6 KA7 EQU P0.6 SB7 EQU P1.7 KA8 EQU P0.7 SB8 EQU P3.2 SB9 EQU P3.3 SB10 EQU P3.4 SB11 EQU P3.5;=用C程序定义输入输出点=/*输入按钮定义*/. /*输出继电器定义*/sbit SB0=P10; sbit KA1=P00;sbit SB1=P11; sbit KA2=P01;sbit SB2=P12; sbit KA3=P02;sbit SB3=P13; sbit KA4=P03;sbit SB4=P14; sbit KA5=P04;sbit SB5=P15; sbit KA6=P05;sbit SB6=P16; sbit KA7=P06;sbit SB7=P17; sbit KA8=P07;sbit SB8=P32;sbit SB9=P33;sbit SB10=P34;sbit SB11=P35;通过这样的定义后,不管是用汇编还是用C语言都很方便。例如:将控制板上输出端口KA1吸合,用汇编如下: CLR KA1; 将此单片机P1.0清零,就可让板上的KA1吸合 SETB KA1; 将此单片机P1.0置1,就可让板上的KA1失电用C语言则如下所示: KA1=0; KA1吸合 KA1=1; KA1失电(三)外置EEPROM外部数据存储器的编写3.1 AT24系列存储器的特性AT24系列存储器芯片采用CMOS工艺制造,内置有高压泵,可在单电压供电条件下工作。其标准封装为8脚DIP封装形式,如下所示为各引脚的功能:* SCL:串行时钟。在该脚的上升沿时,系统将数据输入到每个EEPROM器件,在下降沿时输出。* SDA:串行数据。该引脚为开漏极驱动,可双向传送数据。* A0、A1、A2:器件/页面寻址。为器件地址输入端。* Vcc:一般输入+5V的工作电压。* WP:硬件写保护。3.2 总线状态及时序A24C01的SCL及SDA两总线可通过一个电阻上拉为高电平,SDA上的数据仅在SCL为低电平周期时才能改变。当SCL为高电平时,SDA的改变表示“开始”和“停止”状态。此时,所有地址和数据字都以8位串行码方式输入输出EEPROM。* 开始状态:SCL为高电平时,SDA由高电平转入低电平。该命令必须在其它命令前执行。* 停止状态:SCL为高电平时,SDA由低电平转入高电平。该命令可终止所有通信。* 确认:相同总线上的设备在收到数据后,以置SDA为低电平的方式对其进行确认。3.2 器件寻址AT24系列EEPROM在开始状态后需紧接一个8位器件地址,以进行应读写操作。3.3 24c0124c16读写驱动程序sbit a0=ACC0;/定义ACC的位,利用ACC操作速度最快sbit a1=ACC1;sbit a2=ACC2;sbit a3=ACC3;sbit a4=ACC4;sbit a5=ACC5;sbit a6=ACC6;sbit a7=ACC7;void s24(void) _nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;void s240(void) _nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0;void p24(void) sda=0;scl=1;_nop_();sda=1;void p240(void) sda0=0;scl0=1;_nop_();sda0=1;unsigned char rd24(void) sda=1;scl=1;a7=sda;scl=0;scl=1;a6=sda;scl=0;scl=1;a5=sda;scl=0;scl=1;a4=sda;scl=0;scl=1;a3=sda;scl=0;scl=1;a2=sda;scl=0;scl=1;a1=sda;scl=0;scl=1;a0=sda;scl=0;sda=1;scl=1;scl=0;return(ACC);void wd24(unsigned char dd) ACC=dd;sda=a7;scl=1;scl=0;sda=a6;scl=1;scl=0;sda=a5;scl=1;scl=0;sda=a4;scl=1;scl=0;sda=a3;scl=1;scl=0;sda=a2;scl=1;scl=0;sda=a1;scl=1;scl=0;sda=a0;scl=1;scl=0;sda=1;scl=1;unsigned char read(unsigned int address) /读EEPROM的内容,addtess为地址unsigned char dd;dd=(address&0x7ff)/256)1;s24();wd24(0xa0|dd);scl=0;wd24(address);scl=0;s24();wd24(0xa1|dd);scl=0;dd=rd24();p24();return(dd);void write(unsigned int address,unsigned char dd) /写内容进EEPROM,address为地址,dd为要 /写入的数据unsigned char ddd;ddd=(address&0x7ff)/256)10) break; /此行防止由于eeprom器件损坏后的死循环scl=0;(四)STC系列内置EEPROM单片机的编写现在升级版51、52系列中,STC系列的单片机还是比较好买,与此同时相对来讲还算是先进。4.1 STC89C51RC/RD+ 系列单片机命名规则 STC89 XX XX XX 40 XXXXX 何种封装:如PDIP、PLCC、PQFP、DIP 工作温度范围: I:工业级:40度+85度 C:商用级:0度70度 工作频率:25:工作频率可到25Mhz40:工作频率可到40Mhz50:工作频率可到50MhzRAM大小:RC:RAM为512RD+:RAM为1280程序空间大小,如: 51是4K,52是8K,53是15K54/16K,58/32K,516/64K工作电压: C:为5.5V3.4VLE:为2.0V3.8V4.2 RC/RD+系列8051单片机ISP/IAP特殊功能寄存器 助记符 地址 功能 ISP_DATA E2H ISP/IAP操作时的数据寄存器。 ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也需放在此处。助记符 地址 功能ISP_ADDRL E4H ISP/IAP操作时的地址寄存器高八位ISP_ADDRH E3H ISP/IAP操作时的地址寄存器低八位ISP_CMP E5H ISP/IAP操作时的命令模式寄存器ISP_TRIG E6H ISP/IAP操作时的命令触发寄存器,ISP_CONTR E7H ISP/ISP控制寄存器4.3 STC系列EEPROM的专用子程序范例用DATA还是EQU声明新增特殊功能寄存器地址要看编程者所用的汇编/编译器。ISP_DATA EQU 0E2HISP_ADDRH EQU 0E3HISP_ADDRL EQU 0E4HISP_CMD EQU 0E5HISP_TRIG EQU 0E6HISP_CONTR EQU 0E7H;定义ISP/IAP命令及及等待时间ISP_IAP_BYTE_TEAD EQU 1 ;字节读ISP_IAP_BYTE_PROGRAM EQU 2 ;字节编程,前提是该字节是空,0FFH。ISP_IAP_SECTOR_ERASE EQU 3 ;扇区擦除,要某一字节为;空,要擦除一扇区。WAIT_TIME EQU 0 ;设置等待时间,40MHz以下0,20MHz以下1,10MHz以下2,5MHz以下3。;=字节读子程序范例=MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节;地址需要改变时才需重新送地址。CLR EA ;关中断,此时各中断请求会被挂起,开中断立即响应,最新的D版本不需要关中断。MOV ISP_CONTR, #WAIT_TIME ;设置等待时间ORL ISP_CONTR, #10000000B ;允许ISP/IAP操作;以上两句可以合成一句并且只送一次就够了。MOV ISP_CMD,#ISP_IAP_BYTE_READ;送字节读命令,命令不需要改变时不需要重新送命令。MOV ISP_TRIG,#46H; 先送46H,再送B9H到ISP/IAP触发寄存器MOV ISP_TRIG,#0B9H; 送完B9H后,ISP/IAP命令立即被触发。;CPU等待IAP动作完成后,才会继续执行程序,要先关中断(EA);再送46H,B9H到ISP/IAP触发器,起动ISP/IAP命令,关中断在;触发之前即可。NOP ;数据读出到ISP_DATA寄存器后,CPU继续执行程序MOV A,ISP_DATA ;将读出的数据送往ACC;以下语句可不用,只是出于安全考虑MOV ISP_CONTR,#00000000B ;禁止ISP/IAP操作MOV ISP_CMD,#00000000B ; 去除ISP/IAP命令MOV ISP_TRIG,#00000000B ;防止ISP/IAP命令误触发MOV ISP_ADDRH,#0 ;送地址高字节单元为00,指向非EEPROMMOV ISP_ADDRL,#0 ;送地址低字节单元为00,防止误操作SETB EA ;开中断,CPU处理完ISP/IAP动作即可开中断;=字节编程范例=;该字节为FFH/空时,可以对其编程,否则不行,要先执行扇区擦除MOV ISP_DATA,#ONE_DATA;送字节编程数据到ISP_DATAMOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节;地址需要改变时才需重新送地址。CLR EA ;关中断,此时各中断请求会被挂起,开中断立即响应,最新的D版本不需要关中断。MOV ISP_CONTR, #WAIT_TIME ;设置等待时间ORL ISP_CONTR, #10000000B ;允许ISP/IAP操作;以上两句可以合成一句并且只送一次就够了。MOV ISP_CMD,#ISP_IAP_BYTE_PROGRAM;送字节读命令,命;令不需要改变时不需要重新送命令。MOV ISP_TRIG,#46H; 先送46H,再送B9H到ISP/IAP触发寄存器MOV ISP_TRIG,#0B9H; 送完B9H后,ISP/IAP命令立即被触发。;CPU等待IAP动作完成后,才会继续执行程序,要先关中断(EA);再送46H,B9H到ISP/IAP触发器,起动ISP/IAP命令,关中断在;触发之前即可。NOP ;字节编程成功后,CPU继续执行程序;以下语句可不用,只是出于安全考虑MOV ISP_CONTR,#00000000B ;禁止ISP/IAP操作MOV ISP_CMD,#00000000B ; 去除ISP/IAP命令MOV ISP_TRIG,#00000000B ;防止ISP/IAP命令误触发MOV ISP_ADDRH,#0 ;送地址高字节单元为00,指向非EEPROMMOV ISP_ADDRL,#0 ;送地址低字节单元为00,防止误操作SETB EA ;开中断,CPU处理完ISP/IAP动作即可开中断;=扇区擦除子程序范例=;没有字节擦除,只有扇区擦除,512字节/扇区,扇区里面任意一个;字节的地址都是扇区地址,无需求首地址,单片机会自己处理。;建议同一次修改的数据放在同一扇区;如果要对某一个扇区进行擦除,而其中有些字节的内容需要保留,;则需将其先读到单片机内部RAM中保存,再将该扇区擦除,然后;将须保留的数据写回该扇区,所以每个扇区中用的字节数越少越好,;操作起来越灵活越快。强烈建议同一次修改的数据放在同一扇区。MOV ISP_ADDRH,#SECTOR_FIRST_BYTE_ADDR_HIGH;送扇区起始地址高字节 MOV ISP_ADDRL,#SECTOR_FIRST_BYTE_ADDR_LOW;送扇区起始地址低字节LCR EA ;关中断,此时各中断请求会被挂起,一开中断立即响应;最新的D版本不需要关中断。MOV ISP_CONTR, #WAIT_TIME ;设置等待时间ORL ISP_CONTR, #10000000B ;允许ISP/IAP操作;以上两句可以合成一句并且只送一次就够了。MOV ISP_CMD,#ISP_IAP_SECTOR_ERASE;送扇区擦除命令MOV ISP_TRIG,#46H; 先送46H,再送B9H到ISP/IAP触发寄存器MOV ISP_TRIG,#0B9H; 送完B9H后,ISP/IAP命令立即被触发。;CPU等待IAP动作完成后,才会继续执行程序,要先关中断(EA);再送46H,B9H到ISP/IAP触发器,起动ISP/IAP命令,关中断在;触发之前即可。NOP ;扇区擦除成功后,CPU继续执行程序;以下语句可不用,只是出于安全考虑MOV ISP_CONTR,#00000000B ;禁止ISP/IAP操作MOV ISP_CMD,#00000000B ; 去除ISP/IAP命令MOV ISP_TRIG,#00000000B ;防止ISP/IAP命令误触发MOV ISP_ADDRH,#0 ;送地址高字节单元为00,指向非EEPROMMOV ISP_ADDRL,#0 ;送地址低字节单元为00,防止误操作SETB EA ;开中断,CPU处理完ISP/IAP动作即可开中断小常识;STC单片机的Data Flash,当EEPROM功能使用3个基本命令字节读,字节编程,扇区擦除。字节编程:如果该字节中有位为“0”,则须先将整个扇区擦除,因为只有“扇区擦除”才可以将“0”变为“1”。扇区擦除:只有:“扇区擦除”才能将“0” 擦除为“1”。(五)多机通讯程序的编写5.1 12进8出控制板上有一个RS485串口通讯,如图四所示。 在设计上只用了两枚IC(75176与NE555)就完成RS485的接口电路,实际的串行传输重任是75176来执行的,而555则是做单击的任务,图右侧的电阻与二极管的作用是在维持RS485的传输信号准位,即SIO的准位一定要比/SIO要高,以免接收串行数据时内部差动电路误判。(图四)RS485只用两条线就完成串行数据的传送与接收,所以在传输电路设计上有一个重点,那就是随时要把线路空出来给别人使用,而这一任务就是由555来负责,当8051有一个字节要从P3.1(TxD)送出时,8051串行数据第一个bit一定是0的起始位,这个数字状态0的信号也刚好触发555的单击,在这里我特地把555内单击的时间定为1ms,而555的输出端直接掌控75176的驱动使用脚,亦即555输出1时正是75176切换成输出推动的模式,而且此模式最多只维持1ms,之后又会自动回到接收的状态,把传输线的控制权交回。1ms的时间恰好是传输速度9600bit/s下传递1字节所需要的时间。5.2单片机多机通讯原理简述在实际应用系统中,经常会遇到多个微机处理器协调工作的情况,这就构成了一个分布式的多机系统。多机通讯中,主机与各个从机进行通讯,必须能对各个从机进行识别,这一识别功能可以由通讯双方的串口部分硬件完成,也可以使用软件实现。8051单片机的串口专门为这种多机通讯提供了识别功能,该功能是利用串口控制寄存器SCON的SM2位实现的。当串口以方式2或方式3工作时,发送和接收的每一帧信息都是11位,其中第9位数据位是可编程的,通过对SCON寄存器的TB8位置1或置0,以区别发送的是地址帧还是数据帧(规定地址帧的第9位为1,数据帧的第9位为0)。若从机的控制位SM2被设为1,则当接收的是地址帧时,数据装入SBUF,并置RI=1,向CUP发出中断请求,若接收的是数据帧,则不产生中断,信息被抛弃。若SM2被设为0,则无论是地址帧还是数据帧都将产生RI=1中断标志,数据装入SBUF。利用这一功能,可以按照如下步骤进行数据通讯:(1) 将所有SM2位置1,使其处于只接收地址帧的状态。(2) 主机发送一帧地址信息,其中前8位数据位表示通讯的从机地址,第9位为1,表示当前帧为地址帧。(3) 从机接收到地址帧后,将本机地址的与帧中地址进行比较。如果地址相同,将其SM2位置0,准备接收数据。如果地址不同,则丢弃当前数据,SM2位不变。(4) 主机发送数据帧,相应的从机接收,其它从机则不受影响。(5) 当主机需要与其他从机通讯时,可以再次发出地址帧寻呼从机,重复这一过程。5.3 多机通讯程序范例/* multi_m.c */* 多机通信的主机部分 */#include #include #define _MAX_LEN_ 64 / 数据最大长度#define _MHZ_ 11 / 设置单片机使用的晶振频率(11.0592MHz)/* 以下为程序协议中使用的握手信号 */#define _SUCC_ 0x0f / 数据传送成功#define _ERR_ 0xf0 / 数据传送错误void init_serial(); / 串口初始化void send_data(unsigned char *buf); / 发送数据void delay10ms(unsigned int count); / 延时子程序(10ms)void main()char buf_MAX_LEN_;unsigned char i = 0;unsigned char tmp;unsigned char addr; / 该字节用于保存要通信的从机地址/* 为缓冲区赋初值 */P0 = 0xff;while(P1 != 0) / 每隔100ms从P0口读取,若读取到0则表明数据采集结束*(buf+i) = P0;delay10ms(10); / 延时100msP0 = 0xff;i+;*(buf+i) = 0; / 缓冲区最后一个字节为0表示数据结束/* 读要访问的分机地址 */P0 = 0xff;addr = P0;/* 串口初始化 */init_serial(); / 初始化串口EA = 0; / 关闭所有中断/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */tmp = addr-1;while(tmp != addr)/* 发送从机地址 */TI = 0;TB8 = 1; / 发送地址帧SBUF = addr;while(!TI);TI = 0;/* 接收从机应答 */RI = 0;while(!RI);tmp = SBUF;RI = 0;/* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接收成功,否则将重新发送该组数据 */tmp = _ERR_;while(tmp != _SUCC_)send_data(buf); / 发送数据RI = 0;while(!RI);tmp = SBUF;RI = 0;while(1); / 程序结束,进入死循环/* 初始化串口 */void init_serial()TMOD = 0x20;/定时器T1使用工作方式2TH1 = 250; / 设置初值TL1 = 250;TR1 = 1; / 开始计时PCON = 0x80; / SMOD = 1SCON = 0xd0;/工作方式3,9位数据位,波特率9600bps,允许接收/* 发送数据 */void send_data(unsigned char *buf)unsigned char len; / 保存数据长度unsigned char ecc; / 保存校验字节len = strlen(buf); / 计算要发送数据的长度ecc = len; / 开始进行校验字节计算/* 发送数据长度 */TI = 0; TB8 = 0; / 发送数据帧SBUF = len; / 发送长度while(!TI);TI = 0;/* 发送数据 */for(i=0; ilen; i+)ecc = ecc(*buf); / 计算校验字节TB8 = 0; / 发送数据帧SBUF = *buf; / 发送数据buf+;while(!TI);TI = 0;/* 发送校验字节 */TB8 = 0; / 发送数据帧SBUF = ecc; / 发送校验字节while(!TI);TI = 0;/* 延时10ms,精度较低,参数count为延时时间 */void delay10ms(unsigned int count)unsigned int i, k;unsigned char j;unsigned int tmp;tmp = (int)(100*_MHZ_)/12);for(i=0; icount; i+)for(j=0; j100; j+)for(k=0; ktmp; k+);/*=*/* 多机通信的从机部分 */#include #include #define _MAX_LEN_ 64 / 数据最大长度#define _MHZ_ 11 / 设置单片机使用的晶振频率(11.0592MHz)/* 以下为程序协议中使用的握手信号 */#define _SUCC_ 0x0f / 数据传送成功#define _ERR_ 0xf0 / 数据传送错误void init_serial(); / 串口初始化unsigned char recv_data(unsigned char *buf); / 接收数据void Beep_ok(); / 蜂鸣表示数据接收ok,该函数代码未给出void main()char buf_MAX_LEN_;unsigned char i = 0;unsigned char tmp = 0xff;unsigned char addr; / 保存本机地址/* 从P1口读取本机地址 */P1 = 0xff;addr = P1;/* 串口初始化 */init_serial(); / 初始化串口EA = 0; / 关闭所有中断/* 进入设备应答阶段 */while(1)SM2 = 1; / 只接收地址帧/* 如果接收到的地址帧不是本机地址,则继续等待 */tmp = addr-1;while(tmp != addr)RI = 0;while(!RI);tmp = SBUF;RI = 0;/* 发送应答信号,并做好接收数据的准备 */TI = 0;TB8 = 0; / 主机不检测该位SBUF = addr;while(!TI);TI = 0;SM2 = 0; / 允许接收数据信息/* 数据接收 */tmp = 0xff;while(tmp = 0xff) / 如果数据校验失败则重新接收数据tmp = recv_data(buf); / 校验失败返回0xff,检测到地址帧则返回0xfe,接收成功则返回0if(tmp = 0xfe) / 在数据接收过程中,如果发现地址帧,则重新开始整个接收过程continue;Beep_ok(); / 蜂鸣表示数据接收成功/* 初始化串口 */void init_serial()TMOD = 0x20;/定时器T1使用工作方式2TH1 = 250; / 设置初值TL1 = 250;TR1 = 1; / 开始计时PCON = 0x80; / SMOD = 1SCON = 0xd0;/工作方式3,9位数据位,波特率9600bps,允许接收/* 接收数据,注意该函数使用buf指向的缓冲区保存数据,在数据末尾使用0表示数据结束 * 返回值为0,数据校验成功,返回值为0xfe,接受过程中接收到地址帧,返回值为0xff,数据校验失败 */unsigned char recv_data(unsigned char *buf)unsigned char len; / 该字节用于保存数据长度unsigned char ecc; / 该字节用于保存校验字节unsigned char i,tmp;/* 接收数据长度 */RI = 0;while(!RI);if(RB8 = 1) / 若当前接收为地址帧则返回0xfereturn 0xfe;len = SBUF;RI = 0;/* 使用len的值为校验字节ecc赋初值 */ecc = len;/* 接收数据 */for(i=0; ilen; i+)while(!RI);if(RB8 = 1) / 若当前接收为地址帧则返回0xfereturn 0xfe;*buf = SBUF; / 接收数据ecc = ecc(*buf); / 进行字节校验RI = 0;buf+;*buf = 0; / 表示数据结束/* 接收校验字节 */while(!RI);if(RB8 = 1) / 若当前接收为地址帧则返回0xfereturn 0xfe;tmp = SBUF;RI = 0;/* 进行数据校验 */ecc = tmpecc;if(ecc != 0) / 校验失败*(buf-len) = 0; / 清空数据缓冲区TI = 0; / 发送校验失败信号TB8 = 0;SBUF = _ERR_;while(!TI);TI = 0;return 0xff; / 返回0xff表示校验错误TI = 0; / 校验成功TB8 = 0;SBUF = _SUCC_;while(!TI);TI = 0;return 0; / 校验成功,返回0(六)与PC通讯的编写6.1 为何要与PC通讯8051的串口通信接口赋予了单片机新的面貌,所有的数据可以通过串行接口与其它仪器共享。原先许多设备的设置值要在面板上进行多次的调试,现在只要保留串行通信端口就行了,甚至于程序的更新也可以通过串行端口来下载,也就是说,8051添加了串行通信后,许多事情都可以进行远端遥控了。我设计的这个12进8出的单片机控制板上就有一个RS485的通讯端口,用这个通讯端口不但可以实现多机通讯,还可以与PC通讯,也可以将多块控制板联合起来与PC实现一个实时控制系统。如图五所示:(图五)只需将每板控制板上的通讯端口中的TXD相联,RXD相联,GND接地端相联,接好后再和RS485转换器相联即可。不过这时的接法是TXD(转换器)RXD(单片机控制板),RXD(转换器)TXD(单片机控制板),接地端不变。6.2 为何选用VB来编写电脑总控程序本人通过实践证明,如要用电脑来监控单片机,可采用如下编程软件:一、采用组态王。二、采用VC。三、采用VB。经过本人的使用来看,如采用组态王来做电脑主控,它存在的时题首先是执行速度慢。例如按下电脑画面上的启动按钮后,需要有3至5秒的滞后,但是从它的使用来讲,设计一个项目又十分好用而且开发的时间也快。不过一直到现在单片机与组态王之间的通讯我还没有写得出来(主要是单片机这部份,因为在组态王内部对单片机的通讯协议已做了规定,是我的水平有限写不出来)。如采用VC来编写那是最好的,这不过自学起来就困难的多。如采用VB来编写监控程序,这对大多数人来讲是比较实用的,同样也很好学,我也是采用VB来编写。VB提供了大量的控件供编程人员使用,编程人员可以方便地利用这些组件中的属性、方法、语言等以事件驱动方式开发应用程序。利用VB开发通信程序主要的方法有以下两种: (1)利用VB本身提供的控件MSComm。(2)利用Windows API应用程序接口。在实践中,用VB控件实现通信的方法比调用SDK的API动态链接库的方法更加方便、快捷,而且用较少的代码可以实现相同的功能,这就是用VB控件实现通信的优点所在。注意,当PC机与单片机系统通信时,单片机数据存储区(RAM)内的数据是十六进制,在信号线上传输的是十六进制数的ASCII码的二进制形式。而Windows系统下使用的是ANSI码,ANSI码仅在前126个与ASCII码相同。即在Windows 9X/2000下接收到的是十六进制数的ASCII码的字符串,可先转换为ANSI码后再在Windows 9X/2000下还原为十六进制数。具体如下:Code$=Hex(Asc(Readbuff$)下面是一个简单的VB通讯程序,可用来与单片机的多机通讯。VB程序如下:Private Sub Fasong_Click()Dim JIHAO(0) As Byte 机号Dim head_data(4) As Byte 5 Byte控制字Dim end_data(0) As Byte 1 Byte 结束字 JI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论