首页 51单片机与电脑串口通信的C程序(1)

51单片机与电脑串口通信的C程序(1)

举报
开通vip

51单片机与电脑串口通信的C程序(1)51单片机与电脑串口通信的C程序2009-10-1609:58例子1#include#includeunsignedcharch;bitread_flag=0;voidinit_serialcom(void)//串口通信初始设定{SCON=0x50; //UART为模式1,8位数据,允许接收TMOD|=0x20;//定时器1为模式2,8位自动重装PCON|=0x80;//SMOD=1;TH1=0xFD; //Baud:19200fosc="11".0592MHzIE|=0x90;  //EnableSerialIn...

51单片机与电脑串口通信的C程序(1)
51单片机与电脑串口通信的C程序2009-10-1609:58例子1#include#includeunsignedcharch;bitread_flag=0;voidinit_serialcom(void)//串口通信初始设定{SCON=0x50; //UART为模式1,8位数据,允许接收TMOD|=0x20;//定时器1为模式2,8位自动重装PCON|=0x80;//SMOD=1;TH1=0xFD; //Baud:19200fosc="11".0592MHzIE|=0x90;  //EnableSerialInterruptTR1=1;   //timer1runTI=1;}//向串口发送一个字符voidsend_char_com(unsignedcharch){SBUF=ch;while(TI==0);TI=0;}//串口接收中断函数voidserial()interrupt4using3{if(RI){RI=0;ch=SBUF;      read_flag=1;//就置位取数标志}}main(){init_serialcom();//初始化串口while(1){if(read_flag)//如果取数标志已置位,就将读到的数从串口发出{read_flag=0;//取数标志清0send_char_com(ch);}}}例子2//单片机串行口发送/接收程序,每接收到字节即发送出去//和微机相接后键入的字符回显示在屏幕上//可用此程序测试//#include#defineXTAL11059200  //CUP晶振频率#definebaudrate9600  //通信波特率voidmain(void){unsignedcharc;TMOD=0x20; //定时器1工作于8位自动重载模式,用于产生波特率TH1=(unsignedchar)(256-(XTAL/(32L*12L*baudrate)));TL1=(unsignedchar)(256-(XTAL/(32L*12L*baudrate)));        //定时器0赋初值SCON=0x50;PCON=0x00; TR1=1;IE=0x00;  //禁止任何中断while(1){while(RI==0);RI=0;c=SBUF;      //从缓冲区中把接收的字符放入c中SBUF=c;      //要发送的字符放入缓冲区while(TI==0);TI=0;}}例子3////////////////////////////////////////////////////////////////////////////////////////////////////E51Pro.c//Easy51Pro编程器主程序,负责通讯,管理编程操作///////////////////////////////////////////////////////////////////////////////////////////////////#includeBYTEComBuf[18];//串口通讯数据缓存,发送和接收都使用UINTnAddress;//ROM中地址计数UINTnTimeOut;//超时计数ProWorkpw;//编程器一般操作voidDelay_us(BYTEnUs)//微秒级延时<255us{TH0=0;TL0=0;TR0=1;while(TL010000)//后17个字节都有超时限制return0;}ComBuf[n]=SBUF;RI=0;}return1;}BOOLWaitResp()//等待上位机回应,1字节,有超时限制{nTimeOut=0;RI=0;while(!RI){nTimeOut;if(nTimeOut>50000){return0;}}RI=0;ComBuf[0]=SBUF;return1;}BOOLWaitData()//写器件时等待上位机数据,18字节,有超时限制{BYTEn;RI=0;for(n=0;n<=17;n){nTimeOut=0;while(!RI){nTimeOut;if(nTimeOut>10000){return0;}}RI=0;ComBuf[n]=SBUF;}return1;}voidSendData()//发送数据或回应操作完成,18字节{BYTEn=0;for(n;n<=17;n){TI=0;SBUF=ComBuf[n];while(!TI){}TI=0;}}voidSendResp()//回应上位机1个字节,在写器件函数中使用{TI=0;SBUF=ComBuf[0];while(!TI){}TI=0;}voidSetVpp5V()//设置Vpp为5v{P3_4=0;P3_3=0;}voidSetVpp0V()//设置Vpp为0v{P3_3=0;P3_4=1;}voidSetVpp12V()//设置Vpp为12v{P3_4=0;P3_3=1;}voidRstPro()//编程器复位{pw.fpProOver();//直接编程结束SendData();//通知上位机, 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同}voidReadSign()//读特征字{pw.fpReadSign();SendData();//通知上位机,送出读出器件特征字}voidErase()//擦除器件{pw.fpErase();SendData();//通知上位机,擦除了器件}voidWrite()//写器件{BYTEn;pw.fpInitPro();//编程前的准备工作SendData();//回应上位机表示进入写器件状态,可以发来数据while(1){if(WaitData())//如果等待数据成功{if(ComBuf[0]==0x07)//判断是否继续写{for(n=2;n<=17;n)//ComBuf[2~17]为待写入数据块{if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数{pw.fpProOver();//出错了就结束编程ComBuf[0]=0xff;SendResp();//回应上位机一个字节,表示写数据出错了WaitData();//等待上位机的回应后就结束return;}nAddress;//下一个单元}ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续SendResp();}elseif(ComBuf[0]==0x00)//写器件结束break;else//可能是通讯出错了{pw.fpProOver();return;}}else//等待数据失败{pw.fpProOver();return;}}pw.fpProOver();//编程结束后的工作Delay_ms(50);//延时等待上位机写线程结束ComBuf[0]=0;//通知上位机编程器进入就绪状态SendData();}voidRead()//读器件{BYTEn;pw.fpInitPro();//先设置成编程状态SendData();//回应上位机表示进入读状态while(1){if(WaitResp())//等待上位机回应1个字节{if(ComBuf[0]==0)//ComBuf[0]==0表示读结束{break;}elseif(ComBuf[0]==0xff)//0xff表示重发{nAddress=nAddress-0x0010;}for(n=2;n<=17;n)//ComBuf[2~17]保存读出的数据块{ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数nAddress;//下一个单元}ComBuf[0]=6;//向上位机发送读出的数据块SendData();}elsebreak;//等待回应失败}pw.fpProOver();//操作结束设置为运行状态ComBuf[0]=0;//通知上位机编程器进入就绪状态SendData();}voidLock()//写锁定位{pw.fpLock();SendData();}/////////////////////////////////////////////////////////////////////////////////////////////////////所支持的FID,请在这里继续添加///////////////////////////////////////////////////////////////////////////////////////////////////externvoidPreparePro00();//FID=00:AT89C51编程器externvoidPreparePro01();//FID=01:AT89C2051编程器externvoidPreparePro02();//FID=02:AT89S51编程器voidmain(){SP=0x60;SetVpp5V();//先初始化Vpp为5vSCON=0x00;TCON=0x00;//PCON=0x00;//波特率*2IE=0x00;//TMOD:GATE|C/!T|M1|M0|GATE|C/!T|M1|M0//    0  0 10 0  0 01TMOD=0x21;//T0用于延时程序TH1=0xff;TL1=0xff;//波特率28800*2,注意PCON//SCON:SM0|SM1|SM2|REN|TB8|RB8|TI|RI//    0 1 0 1 0 000SCON=0x50;TR1=1;Delay_ms(1000);//延时1秒后编程器自举ComBuf[0]=0;SendData();while(1)//串口通讯采用查询方式{if(!WaitComm())//如果超时,通讯出错{Delay_ms(500);ComBuf[0]=0;//让编程器复位,使编程器就绪}switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针{case0://at89c51编程器PreparePro00();break;case1://at89c2051编程器PreparePro01();break;case2://at89s51编程器PreparePro02();break;//case3:支持新器件时,请继续向下添加//break;//case4://break;default:ComBuf[0]=0xff;ComBuf[1]=0xff;//表示无效的操作break;}switch(ComBuf[0])//根据操作ID跳到不同的操作函数{case0x00:RstPro();//编程器复位break;case0x01:ReadSign();//读特征字break;case0x02:Erase();//擦除器件break;case0x03:Write();//写器件break;case0x04:Read();//读器件break;case0x05:Lock();//写锁定位break;default:SendData();break;}}}例子4voidInitSerial(void){TMOD=0x20; //T1方式2PCON=0x00;  //PCON=00H,SMOD=0 PD=PCON.2=1进入掉电模式TH1=TL1=BAUD_9600;//BAUD:9600SCON=0x50; //串行通信方式1REN=1允许接收ET1=0;  //不允许中断TR1=1;  //开启定时器1IE=0;  //关闭所有中断允许位memset(&SerialBuf,0x00,SERIAL_BUF_LEN);//初始化SerialBuf[SERIAL_BUF_LEN]}/**********************************************************名称:SendByte()**功能:串口发送一个字节**输入:ucData**返回:无**说明:无********************************************************/voidSendByte(unsignedcharucData){SBUF=ucData;     while(!TI){_CLRWDT_;}TI=0;}
本文档为【51单片机与电脑串口通信的C程序(1)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_654168
暂无简介~
格式:doc
大小:36KB
软件:Word
页数:15
分类:
上传时间:2022-08-05
浏览量:2