51单片机串口通信程序 含详细例子


-
含详细例子,RS232串口通信单片机接收发送数据的 C51程序,手把手教你用增强型51 实验板实现RS232 串口通信
TL= unsigned char)(256-(XTAL/(③32L*12L* baudrate));∥定时器0赋初值 SCON 0x50 PCON =0X00 TR1=1 旧=0x00;∥禁止任何中断 while(1) Whe(R|=0); R|=0: C=SBUF;∥从缓冲区中把接收的字符放入c中 SBUF=c;∥要发送的字符放入缓冲区 while(tI== 0) T=0; 4mmrm17 / E51Proc asy51Pro编程器主程序,负责通讯,管理编程操作 #include <e51 Pro. h> BYTE ComBuf18];∥/串口通讯数据缓存,发送和接收都使用 U| NT aDdress;/ROM中地址计数 UINT tImeout;超时计数 ProWork pw;/编程器一般撅作 void delay_ us( BYTE nUS川微秒纵延时<255us TH0=0; TL0=0 TR0=1; While(TL0<ηUs)/利用T0做定时计数器,循环采样,直到达到定时值 TR0=0; void Delay_msU|TnMs川豪秒级的延时<65535ms UINT n=0 TR0=1; while(n<nMs)∥/利用T0做定吋计数器,循环采样,直到达到定时值 TH0=0 while( THo<4) TRO= BooL Waitcomm等待上位机的命令,18字节 BYTEn=0 R|=0: while(!R)y∥等待第一个字节 ComBuf[n]=SBUF; R|=0 n++; for(n;n≤=17n++) tImeoUt while(!R tImeout++ f( tImeoUt>10000后17个字节都有超时限制 return 0 ComBuf[n=SBUF R|=0: return 1 BOOL WaitResp(等待上位机回应,1字节,有超时限制 nTime out=0 R|=0 while (!Ri) nTime○ut++; if(n T ime Out>50000) return o R|=0 ComBuf[O=SBUF return 1 BOoL WaitData()∥写器件时等待上位机数据,18字节,有超时限制 BYTE: R|=0 for(n=0; n<=17: n++) nTime○ut=0 while(!rl) nTime out++. if(n TimeOut> 10000) return o R|= ComBufl buF return 1 void senddata(y发送数据或回应操作完成,18字节 BYTE n=o for(n;n≤=17n++) T|=0 SBUF=Com Buf while(!TDy Tl=0; void Send Resp(/应上位机1个字节,在写器件函数中使用 T=0 SBUF=Com Buf[O] while(!Tit T=0 void SetVpp5VO∥/设置Vpp为5v P34=0; void SetVppOV()设置Vpp为0v P33=0 P34=1; void SetVpp12V(设置pp为12v P33=1; void RstProo/编程器复位 pw. fpProOver)∥/直接编程结束 Send Data();/通知上位机,表示编程器就绪,可以直接用此函数因为协议号( Com Buf[O门)还没被修改,下同 void Readsign()/读特征宇 pw. fpReadsign(; Send data();/通知上位机,送出读出器件特征字 void erase(川∥擦除器件 pw.fpEraseo Send data();/通知上位机,擦除了器件 void write(∥写器件 BYTE: pw. fplnitPro()/编程前的准备工作 Send data(;/应上位机表示进入写器件状态, 可以发米数据 while(1) f(WaitData(/如果等待数据成功 f( ComBuf0}=0X07川∥判断是否继续写 for(n=2;n<=17;n++) Com Buf2~17为待写入数据块 if( pw fpWrite(com Buf[n])∥<调用写该器件一个单元的函数 pw. fpProovert();/出错了就结束编程 Com Buf[O]=oXff SendResp(O,回应上位机个字节, 表示写数据出错了 WaitData();/等待上位机的回应后就结束 return aDdress++;//下一个单元 ComBuf[O]=1;/回应上位机一个字节,表示数据块顺利亢成,请求继续 SendRespo else if( ComBufl]==000)∥写器件结束 break else/能是通讯出错了 pw. fpProover( return; else∥等待数据失败 pw. fpProOver(: return pw. fpProover(;/编程结束后的工作 Delay_ms(50);∥/延时等待上位机写线程结束 ComBuf]=0;/通知上位机编程器进入就绪状态 Send DataO void read()∥读器件 BYTE n pw.tplnitPro();元设置成编程状态 Send Data(;/应上位机表示进入读状态 while(1) f(WaitResp()∥/等待上位机回应1个字节 f( ComBuf[O]==0/ Com Bu]=0表示读结束 break else if(( ComBufl]=0xf)/)xf表小重发 aDdress=n Address-0x0010 for(n=2n<=17;n++∥ ComBuf[2-17保存读出的数据块 ComBuf[n= pw. fpRead();/<<≤≤≤调用写该器件一个单元的函数 aDdress++;/一个单元 ComBuf0]=6:/l上位机发送读出的数据块 Send Data( break;/待回应失败 pw.fpProover();操作结束设置为运行状态 Com Buf[o]=0;〃道知上位机编程器进入就绪状态 Send Data(; void lock()∥写锁定位 pw flOck Send Datao ∥支持的F|D,请在这里继续添加 extern void PrepareProl00):FD=00:AT89C51编程器 extern void Prepare Pro01);/FD=01AT89c2051编程器 extern void PreparePro02();∥FD=02AT89S51编程器 void main() SP=0×60 SetVpp5V();/先初始化Vpp为5v SCON=OXOO TCON=0x00 ∥PCON=0x00;∥波特率*2 E=0x00 //TMOD: GATEC/TM1MOGATEC/TM1MO 0100001 TMOD=0x21;/T0用于延时程序 TH1=0xf TL1=0x,/)特率28800*2,注意PCON //SCON: SMO SM1 SM2 RENITB8 RB8 TIRI 01010000 SCON=0X50 TR1=1; Delay_ms(1000)/延时1秒后编程器自举 ComBuf[O=0 Send Data0; Whie(1y/口通讯采用查询方式 f(! Waitcomm()∥/如果超时通讯出错 Delay ms(500) ComBuf(O-=0;/让编程器复位使编程器就绪 switch( ComBuf1y根据F|D设置( ProWork)pW中的函数指针 case 0: ∥lt89c51编程器 Prepare Pro00(; break case 1 ∥lt89c2051编程器 Prepare Pro010; break case 2. ∥lt89s51编程器 PreparePro02 0; break; ∥case3:支持新器件吋,请继续向下添加 l break ∥/case4: ∥/ break; default: ComBuf[O]=oxff Com Buf[1]=0xf;∥示无效的操作 break switch( ComBuf]川根据操作|D跳到不同的操作函数 case 0x00 RstProt; break;/(程器复位 case oxo Reassign(; break;∥读特祉字 case x02 Erase(; break;∥擦瘵除器件 case 0x03 Wrte(; break;/写器件 case 0x04 Read) break;/读器件 case 0x05 Lock(); break;∥/写锁定位 default: Send Data(; break; void Init serial(void) TMOD=0x20;∥T1方式2 PCoN=0x00;∥PCON=00H,SMOD=0PD=PCON2=1进入扣电模式 TH1=1≡BAUD9600;∥BAUD:9600 SCON=0x50;∥串行通信方式1REN=1允许接收 ET1=0:∥/不允许中断 TR1=1;∥开启定时器1 ∥关闭所有中断允许位 mems(& serial Buf,0x00, SERIAL BUF LEN);∥/初始化 SerialBuf [ SERIAL BUF LEn] ★大kk大kk★大大木;;;大大kkk★古大*大大古k大大古kk;大大kk大k 名称: SendByte( 林*功能:串口发送一个字节 输入: cdAta *返回:无 说明:无 大★k古大内大大★★大大水古古大大古水大大★大古者大大大大大★木大大★内言大大古 void Send Byte(unsigned char ucData) SBUF cdAta while(!TI) CLRWDT, 6RS232串口通信程序 include sat89X52.H> unsigned char code dispcode1[=t welcome!3 unsignedcharcodedispcode2i=fwww.zhaoiian.comy unsigned char i,j, k, I, DData sbit rs= P3 5: sbit rw= p3 6 sbit e= p37: void delay {for(1=0;1<=100:1++){} void enable(//write order RS=O; RW=0; E=0; delay(; E=1; void enable()//write data RS=1; RW=0; E=0; dclay (; E= void initializtion //cd initializtion for(i=0;i<=100;i+ P0=OxO cnablcl P0=0x38 enable() PO=OxOf; enabled PO=0X06; enable

C语言51单片机串口通信程序求教_course
2013-11-17#include <reg51.h> #include <string.h> #include <intrins.h> #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3; bit read_flag=0; void init_serialcomm(void) { SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80; //SMOD=1; // TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz TH1 = 0xFD; //Baud:19200 fosc=11.0592MHz TL1 = 0xFD; //Baud:19200 fosc=11.0592MHz // IE |= 0x90; //Enable Serial Interrupt ES = 1; //使能串口中断 EA = 1; //打开主中断 TR1 = 1; // timer 1 run // TI=1; } //向串口发送一个字符 void send_char_com(unsigned char ch) { SBUF=ch; while(TI==0); TI=0; } //向串口发送一个字符串,strlen为该字符串长度 void send_string_com(unsigned char *str,unsigned int strlen) { unsigned int k=0; do { send_char_com(*(str + k)); k++; } while(k < strlen); } //串口接收中断函数 void serial () interrupt 4 using 3 { if(RI) { unsigned char ch; RI = 0; ch=SBUF; // count3=0; inbuf1[count3]=ch; count3++; if(count3==(INBUF_LEN)) { read_flag=1; count3=0; } } else if(TI) { TI=0; } } main() { init_serialcomm(); //初始化串口 count3=0; while(1) { if(read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag=0; //取数标志清0 send_string_com(inbuf1,INBUF_LEN); } } } 以上程序代码参考自龚建伟 串口中断接收、发送例程。本意是通过串口发送4个字节数据,单片机串口接收后,发送回4个字节数据(在串口助手显示出来)。 但我通过uvison3下载到stc12c5a60s2最少单片机系统,通过串口测试工具(波特率19200,校验位:无,数据位:8,停止位:1)发送数据为:ff ff ff ff (十六进制发),十六进制收,结果为发送4字节,接收2字节,串口助手接收到显示为77 ff, 程序不知道是哪里出错了,求正解。 我自己分析如下: 发送4字节,只接收到2字节?首先怀疑是串口初始化问题,但查不出。再看缓存的4字节数据,也提供了足够的空间,处理上也看不出问题。哪位高手指点下。非常感谢!!!
单片机一对多串口通讯的问题_course
2011-10-11现在用RS232进行一对多串口通讯的测试,我使用的是9位可变Mode 3方式通讯,波特率都是9600,服务器端的SM2为零,两台客户端的SM2一开始就置1。服务器的TX与两台客户端的RX连接,服务器的
618B
51单片机UART rs232异步串行通信C语言最简程序
2009-08-0851单片机UART rs232异步串行通信C语言最简程序
2KB
51单片机串口通信原理
2010-10-24单片机串口通信原理 详细 易于理解 很详细的代码演示 很详细的解说 很有价值的资料 值得一下
556B
51单片机串口通信汇编语言
2017-10-12BUSY BIT 20H.0 FLAG BIT 20H.1 EVENFLAG BIT 20H.2 TXDATA EQU 21H RXDATA EQU 22H ORG 0000H LJMP START
3.2MB
单片机与单片机之间串口通信
2019-06-16单片机与单片机之间串口通信,通过按键设置输入的字符,进行仿真,发送至另外一个单片机,类似于之前的电报。
-
博客
微信红包皮肤序列号哪里有?
微信红包皮肤序列号哪里有?
-
博客
CISSP考试指南笔记:4.1 网络体系结构原理
CISSP考试指南笔记:4.1 网络体系结构原理
-
下载
aspose pdf转图片相关.zip
aspose pdf转图片相关.zip
-
下载
TOSMBClient:围绕libDSM SMB客户端库的Objective-C绑定-源码
TOSMBClient:围绕libDSM SMB客户端库的Objective-C绑定-源码
-
博客
【测评】英国HS(HomogenisingSystems Ltd)公司HS超高压纳米均质机
【测评】英国HS(HomogenisingSystems Ltd)公司HS超高压纳米均质机
-
学院
C++异步串口通信
C++异步串口通信
-
学院
Python专题精讲 企业级应用日志管理
Python专题精讲 企业级应用日志管理
-
学院
2021 租车小程序 毕业设计 毕设 源码 源代码
2021 租车小程序 毕业设计 毕设 源码 源代码
-
博客
每日一题 冲冲冲 AcWing 420. 火星人
每日一题 冲冲冲 AcWing 420. 火星人
-
博客
Spring 5 笔记
Spring 5 笔记
-
下载
Portofino:Portofino 5是下一代开放源代码的Web开发框架Portofino。 其目的是帮助开发人员使用REST API和Angular UI创建现代的响应式企业应用程序-源码
Portofino:Portofino 5是下一代开放源代码的Web开发框架Portofino。 其目的是帮助开发人员使用REST API和Angular UI创建现代的响应式企业应用程序-源码
-
下载
松弛机器:一个性感,简单但功能强大且可扩展的松弛机器人-源码
松弛机器:一个性感,简单但功能强大且可扩展的松弛机器人-源码
-
下载
STM32L1xx_StdPeriph_Lib_V1.3.1.rar
STM32L1xx_StdPeriph_Lib_V1.3.1.rar
-
博客
分支和循环--c语言
分支和循环--c语言
-
博客
路由跳转 数据丢失
路由跳转 数据丢失
-
学院
基于Django的电子商务网站设计--第二章
基于Django的电子商务网站设计--第二章
-
下载
AspNetSeo:用于处理ASP.NET Web应用程序的SEO数据的助手-源码
AspNetSeo:用于处理ASP.NET Web应用程序的SEO数据的助手-源码
-
下载
cublas64_10.dll
cublas64_10.dll
-
下载
tododjangoccb:带有django web框架的todo应用程序,具有基于类的视图和ajax modal crud-源码
tododjangoccb:带有django web框架的todo应用程序,具有基于类的视图和ajax modal crud-源码
-
学院
JAVAEE主流框架之Spring框架实战开发教程(源码+讲义)
JAVAEE主流框架之Spring框架实战开发教程(源码+讲义)
-
博客
sudo漏洞修复升级
sudo漏洞修复升级
-
博客
如何在 ASP.Net Core MVC 中实现文件上传
如何在 ASP.Net Core MVC 中实现文件上传
-
学院
Python语言编程高级精讲课 从程序员到架构师的必修课
Python语言编程高级精讲课 从程序员到架构师的必修课
-
博客
cs反序列化1
cs反序列化1
-
下载
cudnn7.4版本(对应CUDA10.0)
cudnn7.4版本(对应CUDA10.0)
-
博客
【计算机视觉】图像二值化Thresholding(自动选择阈值和自适应阈值)
【计算机视觉】图像二值化Thresholding(自动选择阈值和自适应阈值)
-
学院
Metabase从入门到精通视频教程
Metabase从入门到精通视频教程
-
学院
微信支付2021系列之付款码支付一学就会java版
微信支付2021系列之付款码支付一学就会java版
-
下载
HackChrome:从Chrome获取用户:密码(包括版本<80> 80)-源码
HackChrome:从Chrome获取用户:密码(包括版本<80> 80)-源码
-
学院
SQL Server 2016 高可用灾备技术合集
SQL Server 2016 高可用灾备技术合集