212210413 张景宝 数据采集.docx
- 文档编号:8837059
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:42
- 大小:251.71KB
212210413 张景宝 数据采集.docx
《212210413 张景宝 数据采集.docx》由会员分享,可在线阅读,更多相关《212210413 张景宝 数据采集.docx(42页珍藏版)》请在冰点文库上搜索。
212210413张景宝数据采集
数据采集与实践
基于串口通信的数据采集系统
综合
张景宝
应用电子技术
物理与电子技术学院
2010年6月28日
电工电子中心2009年5月绘制
基于串口通信的数据采集系统
一.任务解析(老师统一给出)
1、串口通信接口,单片机232接口与PC机232接口通信相关内容
2、单片机控制的ADC,电路,控制程序
3、上位机软件编写,VB基础,MSCOMM控件,代码分析
4、通信协议,为什么要通信协议,如何设计通信协议
5、温度(电压)数据采集系统设计实现
二.总要求(老师统一给出)
对【一】中5点任务,结合授课内容,查阅相关资料,进行实验验证,撰写书面报告(电子版)。
考虑到同学们的实际水平,要求你们立足老师提供的现成资料,完成实验验证,同时自己再查阅一些资料后,对所掌握的资料进行合理的整理,完成报告,对创新不作要求。
三.实验内容
3.1串口通信(核心内容)
=====================================================
//发送程序
=====================================================
voidsend_answer(unsignedcharn,unsignedchar*str)
{
unsignedchari,temp;
temp=n;
for(i=0;i temp=~temp+1; uart_putc(': '); uart_putc(hex_to_asc(n,1)); uart_putc(hex_to_asc(n,0)); for(i=0;i { uart_putc(hex_to_asc(*(str+i),1)); uart_putc(hex_to_asc(*(str+i),0)); } uart_putc(hex_to_asc(temp,1)); uart_putc(hex_to_asc(temp,0)); } ===================================================== //串口接收中断程序 ===================================================== voidserial_int(void)interrupt4 { staticunsignedchari=0; staticunsignedcharnum=0; staticunsignedcharrx_hlf=0; unsignedcharrx_dat; if(RI){ rx_dat=SBUF; RI=0; switch(num) { case0: if(rx_dat==': ')num=1;break; case1: if(rx_hlf){ rx_counter+=asc_to_hex(rx_dat); rx_hlf=0; num=2; } else{ rx_counter=asc_to_hex(rx_dat)<<4; rx_hlf=1; } break; case2: if(rx_hlf){ rx_buff[i]+=asc_to_hex(rx_dat); rx_hlf=0; if(++i>rx_counter){ num=0; i=0; rx_finish_flag=1; } } else{ rx_buff[i]=asc_to_hex(rx_dat)<<4; rx_hlf=1; } break; default: num=0;break; } } } ===================================================== //接收完毕后指令译码、执行。 通过SWITCH及其套用,可以定义很多 //想做的事 ===================================================== voidtast() { unsignedchari,temp; unsignedintj=100,k=100; if(rx_finish_flag){ temp=rx_counter; for(i=0;i<=rx_counter;i++)temp+=rx_buff[i]; if((temp==0)&&(rx_buff[0]==LOCAL_ID)){ switch(rx_buff[1]) { case0: task_example(rx_buff[2]);break; case1: while(j--)ADC_show();break; case2: TEM();break; case3: voltage();break; case4: switch(rx_buff[2]) { case0: test1();break; case1: test2();break; case2: test3();break; case3: test4();break; case4: test5();break; case5: test6();break; case6: test7();break; case7: test8();break; case8: test9();break; } case5: switch(rx_buff[2]) { case0: LED_TEST(0);break; case1: LED_TEST (1);break; case2: LED_TEST (2);break; case3: LED_TEST(3);break; case4: LED_TEST(4);break; case5: LED_TEST(5);break; case6: LED_TEST(6);break; case7: LED_TEST(7);break; } case6: switch(rx_buff[2]) { case0: hourinc();break; case1: hourdec();break; case2: minuteinc();break; case3: minutedec();break; } default: break; } } rx_finish_flag=0; } } 3.2ADC ===================================================== 定义接口 WR和RD接P36,P37,不用定义,包含reg51.h头文件就可以了。 CS片选信号直接接地,不用定义。 INTR接P35 ===================================================== sbitADCfinish=P3^5; unsignedintADC_read() { unsignedlongtemp; WR=1; while(ADCfinish); WR=0; RD=0; temp=P0; RD=1; value=(unsignedint)(100*5*temp/255); returnvalue; } 3.3VB编程 ===================================================== '满足通信协议的发送函数 '通过数组Out_Buff传递参数 '数组格式: 长1字节,数据N(长)字节(ID1字节,命令1字节,参数N-2字节) ===================================================== PrivateSubSend_Data() DimOutbyte()AsByte DimiAsByte DimTempAsByte DimCheckAsInteger ReDimOutbyte(0To(Out_Buff(0)*2+4))AsByte'头长校验 Check=0 Fori=0ToOut_Buff(0) Check=Check+Out_Buff(i) Next Outbyte(0)=&H3A Outbyte (1)=Asc(Hex((Out_Buff(0)And&HF0)/16)) Outbyte (2)=Asc(Hex(Out_Buff(0)And&HF)) Fori=1To(Out_Buff(0)+1) Outbyte(i*2+1)=Asc(Hex((Out_Buff(i)And&HF0)/16)) Outbyte(i*2+2)=Asc(Hex(Out_Buff(i)And&HF)) Next Temp=256-(CheckAnd&HFF)'校验位计算 Outbyte(Out_Buff(0)*2+3)=Asc(Hex((TempAnd&HF0)/16)) Outbyte(Out_Buff(0)*2+4)=Asc(Hex(TempAnd&HF)) Comm1.Output=Outbyte'发出数据 EndSub ===================================================== '满足通信协议的接收函数 ===================================================== SubComm1_OnComm() DimInbyte()AsByte DimStr_buffAsString DimTempAsByte SelectCaseComm1.CommEvent CasecomEvReceive If(Flag=False)Then Text2.Text=""'首次清屏 Flag=True EndIf DoWhile(Comm1.InBufferCount>0) Str_buff="" Inbyte=Comm1.Input Str_buff=Str_buff+Chr(Inbyte(0)) SelectCaseRx_Num Case0'头检测 If(Inbyte(0)=&H3A)ThenRx_Num=1 Rx_HL=True If(Text2.Text<>"")ThenText2.Text=Text2.Text+Chr(13)+Chr(10) Case1'数据长度获取 If(Rx_HL)Then Rx_buff(0)=Asc_Hex(Inbyte(0)) Rx_HL=False Else Rx_buff(0)=Rx_buff(0)*16+Asc_Hex(Inbyte(0)) Rx_HL=True j=1 Rx_Num=2 EndIf Case2'接受数据 If(Rx_HL)Then Rx_buff(j)=Asc_Hex(Inbyte(0)) Rx_HL=False Else Rx_buff(j)=Rx_buff(j)*16+Asc_Hex(Inbyte(0)) Rx_HL=True If(j<=Rx_buff(0))Then j=j+1 Else CallData_Check'数据处理 Rx_Num=0 EndIf EndIf EndSelect Text2.Text=Text2.Text+Str_buff Loop EndSelect EndSub ===================================================== 3.4通信协议 说明: 为了头和DATA区别开来,发送和接收都使用ASSII码。 校验: ~(长度N+DATA)+1 3.5数据采集实践 实验箱效果跟预期一样。 1 显示时间 2 显示电压 3 串口返回电压 4 串口返回温度 5 附加数码管、LED检测、串口时间调整等功能 四.经验总结 实验箱效果跟仿真一样,完成了VB上位机的编写,下位机程序的设计, 串口顺利返回电压及温度值,以及时间显示、调整,以及自己模式,串口 自动读取电压(温度)。 VB上位机还增加了软件运行时间记录,电脑当 前时间获取显示,以及欢迎及关闭对话框。 不足: 功能过于简单,没做远距离传输测试。 5.附录 =========================================================== 单片机程序 =========================================================== #include #defineLOCAL_ID2 #defineMAX_SIZE16 unsignedcharrx_buff[MAX_SIZE]; unsignedchartx_buff[MAX_SIZE]; #include"ADC0804.h" #include"szz.h" #include"tast.h" unsignedcharrx_finish_flag=0; unsignedcharrx_counter=0; externvoidtast(); externvoidrs232_port_init(void); externvoidtask_example(unsignedchar); externvoiduart_putc(unsignedchar); externvoidsend_answer(unsignedchar,unsignedchar*); voidmain() { rs232_port_init(); timer_ini(); while (1) { ADC_read(); //ADC_show(); //TEM_show(); tast(); if(ssz_bit)ssz_show(); } } unsignedcharhex_to_asc(unsignedcharda,unsignedcharhl) { unsignedchartemp; if(hl)temp=da>>4; elsetemp=da&0x0f; if(temp<10)return(temp+0x30); elsereturn(temp+0x37); } unsignedcharasc_to_hex(unsignedcharda) { if(da<0x3a)return(da-0x30); elsereturn(da-0x37); } voidsend_answer(unsignedcharn,unsignedchar*str) { unsignedchari,temp; temp=n; for(i=0;i temp=~temp+1; uart_putc(': '); uart_putc(hex_to_asc(n,1)); uart_putc(hex_to_asc(n,0)); for(i=0;i { uart_putc(hex_to_asc(*(str+i),1)); uart_putc(hex_to_asc(*(str+i),0)); } uart_putc(hex_to_asc(temp,1)); uart_putc(hex_to_asc(temp,0)); } //串口接收中断 voidserial_int(void)interrupt4 { staticunsignedchari=0; staticunsignedcharnum=0; staticunsignedcharrx_hlf=0; unsignedcharrx_dat; if(RI){ rx_dat=SBUF; RI=0; switch(num) { case0: if(rx_dat==': ')num=1;break; case1: if(rx_hlf){ rx_counter+=asc_to_hex(rx_dat); rx_hlf=0; num=2; } else{ rx_counter=asc_to_hex(rx_dat)<<4; rx_hlf=1; } break; case2: if(rx_hlf){ rx_buff[i]+=asc_to_hex(rx_dat); rx_hlf=0; if(++i>rx_counter){ num=0; i=0; rx_finish_flag=1; } } else{ rx_buff[i]=asc_to_hex(rx_dat)<<4; rx_hlf=1; } break; default: num=0;break; } } } voidrs232_port_init(void) { SCON=0x50;//串口工作在方式1,异步模式 PCON=0x00;//波特率翻倍 TMOD=0x20;//定时器1工作在方式2 TH1=0xfd;//波特率9600,晶振为11.0592MHz TL1=0xfd;//自动重装在赋值 TR1=1;//启动定时器,产生波特率 RI=0;//接收标志位清零 TI=0;//发送标志位清零 ES=1;//中断允许 EA=1;//总中断允许 } voidtask_example(unsignedcharda) { P1=~da; } voiduart_putc(unsignedcharc) { SBUF=c; while(! TI); TI=0; } voidvoltage(void) { unsignedintj; j=2*value; tx_buff[0]=0; tx_buff[1]=6; tx_buff[2]=((unsignedchar*)&j)[0]; tx_buff[3]=((unsignedchar*)&j)[1]; send_answer(4,&tx_buff[0]); } voidTEM(void) { unsignedintj; j=2*value*8; tx_buff[0]=0; tx_buff[1]=5; tx_buff[2]=((unsignedchar*)&j)[0]; tx_buff[3]=((unsignedchar*)&j)[1]; send_answer(4,&tx_buff[0]); } voidtast() { unsignedchari,temp; unsignedintj=100,k=100; if(rx_finish_flag){ temp=rx_counter; for(i=0;i<=rx_counter;i++)temp+=rx_buff[i]; if((temp==0)&&(rx_buff[0]==LOCAL_ID)){ switch(rx_buff[1]) { case0: task_example(rx_buff[2]);break; case1: while(j--)ADC_show();break; case2: TEM();break; case3: voltage();break; case4: switch(rx_buff[2]) { case0: test1();break; case1: test2();break; case2: test3();break; case3: test4();break; case4: test5();break; case5: test6();break; case6: test7();break; case7: test8();break; case8: test9();break; } case5: switch(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 212210413 张景宝 数据采集 数据 采集