首页 > 编程知识 正文

两个51单片机串口通信程序,51单片机有几个串口

时间:2023-05-05 15:17:45 阅读:113728 作者:3284

//test9. pas程序新程序; //本程序使用Trubo51653359Turbo51.com//单片机PASCAL编译器////例9,单片机串行端口为定制协议向单片机发送以下多个命令//.询问指定的LED灯的开/关、蜂鸣器的开//.LED灯的状态或蜂鸣器的状态//,为此,从PC发送的命令帧为4 //开始|命令|设备编号|检查//开始: $01//命令//$4F (字符o ) :打开//$43 )字符c ) :关闭//$51 (字符q ) 3360查询/设备已按位将开始|设备编号|状态|检查//开始) $01//设备)/:关闭///前三个字符的值验证为值//CPU电路图。 请参阅例1 ////uses Delay,MyDefine。 typetcmdframe=array [1.4] of byte; var rx帧,tx帧: tcmd帧; RxCnt、tx CNT :字节; const //命令CMD_BEGIN=$01; CMD_OPEN=$4F; CMD_CLOSE=$43; CMD_QUERY=$51; //查询//设备状态DEV_ON=CMD_OPEN; DEV_OFF=CMD_CLOSE; //设备编号DEV_LED1=$30; //LED1 DEV_LED2=$31; DEV_LED3=$32; DEV_LED4=$33; DEV_LED5=$34; DEV_LED6=$35; DEV_LED7=$36; DEV_LED8=$37; DEV_FM=$38; //蜂鸣器//接收帧的各字节位置表意RX_FB_BEG=1; RX_FB_CMD=2; RX_FB_DEV=3; RX_FB_CHK=4; //发送帧的每个字节位置表意TX_FB_BEG=RX_FB_BEG; TX_FB_DEV=2; TX_FB_STA=3; TX_FB_CHK=4; 函数检测(a帧: tcmd帧) :字节; begin//result :=a frame [1] ora frame [2] xoraframe [3]; result :=a帧[1] a帧[2] a帧[3]结束; 功能检查框架(a frame : tcmd框架) :布尔型; begin result :=(a frame [1]=cmd _ begin ) and ) a frame [ rx _ FB _ chk ]=getcheck (a frame ) ); 结束; 产品发送数据; beginrepeatifti=falsethenbegininc (tx CNT ); SBUF:=TxFrame[TxCnt]; While TI=FALSE do begin end; TI:=FALSE; 结束; until TxCnt=4; 结束; 产品接收数据; begini fri=truethenbeginifrxcnt=4thenrxcnt :=0; Inc(rxCNT; RxFrame[RXCNT]:=SBUF; RI:=FALSE; 结束; 结束; procedure DoCommand; var SHL num :字节; beginifrxcnt=4thenbeginrxcnt :=0; //清零,避免重复以下操作//检查收到的数据是否正常进行了ifnotcheckframe(rxframe ) then exit; // 对命令字进行分析 Case RxFrame[RX_FB_CMD] of CMD_OPEN: begin // 检查设备号是否蜂鸣器 if RxFrame[RX_FB_DEV]=DEV_FM then FM:=FM_ON; // 检查设备编号是否为 LED if ( RxFrame[RX_FB_DEV]>=DEV_LED1) AND ( RxFrame[RX_FB_DEV]<=DEV_LED8) then begin // 开启对应的 LED ShlNum:=RxFrame[RX_FB_DEV]-DEV_LED1; LED:=LED AND (NOT (1 SHL ShlNum) ); end; end; CMD_CLOSE: begin // 检查设备号是否蜂鸣器 if RxFrame[RX_FB_DEV]=DEV_FM then FM:=FM_OFF; // 检查设备编号是否为 LED if ( RxFrame[RX_FB_DEV]>=DEV_LED1) AND ( RxFrame[RX_FB_DEV]<=DEV_LED8) then begin // 关闭对应的 LED ShlNum:=RxFrame[RX_FB_DEV]-DEV_LED1; LED:=LED OR (1 SHL ShlNum) ; end; end; CMD_QUERY: begin //查询 TxFrame[TX_FB_BEG]:=CMD_BEGIN; TxFrame[TX_FB_DEV]:=RXFrame[RX_FB_DEV] ; // 检查设备号是否蜂鸣器 if RxFrame[RX_FB_DEV]=DEV_FM then begin if FM=FM_ON then TxFrame[TX_FB_STA]:=DEV_ON else TxFrame[TX_FB_STA]:=DEV_OFF; end; // 检查设备编号是否为 LED if ( RxFrame[RX_FB_DEV]>=DEV_LED1) AND ( RxFrame[RX_FB_DEV]<=DEV_LED8) then begin // 关闭对应的 LED ShlNum:=RxFrame[RX_FB_DEV]-DEV_LED1; if (LED AND (1 SHL ShlNum))=$00 then TxFrame[TX_FB_STA]:=DEV_ON else TxFrame[TX_FB_STA]:=DEV_OFF ; end; TxFrame[TX_FB_CHK]:=GetCheck(TxFrame) ; TxCnt:=0; SendData; end; end; // end case end; // if Rxcnt=4end;// 串口中断,中断号serial在 system 中定义procedure OnSerial; interrupt Serial;begin end;var CMD:Char; /// 主程序开始 //begin // 环境初始化 LED:=$FF ; // 全不亮 FM:=FM_OFF ; RxCnt:=0; TxCnt:=0; // TMOD : D7 D6 D5 D4 | D3 D2 D1 D0 // T1 | T0 // GATE CT M1 M0 | GATE CT M1 M0 TMOD:=%00100000; // 设置 T1 工作方式为 2 ,自动重装的8位定时器 // TCON : D7 D6 D5 D4 | D3 D2 D1 D0 // TF1 TR1 TF0 TR0 | IE1 IT1 IE0 IT0 TH1:=$FD; // 9600 @12M TL1:=$FD; SM0:=FALSE; // 设置串口通讯模式为 1 SM1:=TRUE; REN:=True; // 允许串口接收数据 EA:=True; // 全局中断开 ES:=True; // 串口中断开 TR1:= TRUE ; // 打开定时器 1 // 循环里的命令可以中断同步进行 while true do begin ReciveData; DoCommand; end; end.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。