步進電機控制A_第1頁
步進電機控制A_第2頁
步進電機控制A_第3頁
步進電機控制A_第4頁
步進電機控制A_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

項目編號: 2015-2016學(xué)年第一學(xué)期微機原理(單片機)課程設(shè)計總結(jié)報告項目名稱:步進電機控制A班級:姓名:學(xué)號: 微機原理(單片機)課程設(shè)計任務(wù)書項目名稱:步進電機控制A內(nèi)容與要求:上位機:完成界面設(shè)計與通訊程序(1)能夠設(shè)置步進電機啟動、停止、正傳、反轉(zhuǎn)(2)能夠設(shè)置步進電機轉(zhuǎn)速(快、中、慢),圈數(shù)(3)能夠保存電機的工作狀態(tài)至文檔,從文檔讀取電機的工作狀態(tài)(4)可以對串口進行設(shè)置下位機:完成電路設(shè)計與控制程序(1)采用步進電機的控制,默認中速正傳1圈(2)按鍵1可控制電機的啟動和停止,按鍵2可控制電機的轉(zhuǎn)動方向,按鍵3可控制電機的轉(zhuǎn)速,按鍵4可控制轉(zhuǎn)動圈數(shù)(每按1次加1圈)(3)由串行LCD顯示當(dāng)前轉(zhuǎn)動方向、轉(zhuǎn)速、圈數(shù)(4)通過串口與上位機通訊。項目組任務(wù)分擔(dān)評價表姓名分擔(dān)任務(wù)組內(nèi)評價周歐翔LCD顯示模塊設(shè)計與編程、下位機串口通訊程序、上位機串口通訊程序、上位機界面、上位機控制程序6張璐下位機硬件連接、電路焊接、步進電機控制程序4課程設(shè)計報告評分表內(nèi)容總體方案硬件設(shè)計軟件設(shè)計結(jié)果分析明細清單問題分析心得體會參考文獻程序代碼格式規(guī)范總分學(xué)生1得分學(xué)生2得分微機原理(單片機)課程設(shè)計報告目錄1.總體方案…………………..12.硬件設(shè)計…………………..13.軟件設(shè)計…………………..34.結(jié)果分析或項目所實現(xiàn)的功能、指標………………55.明細清單…………………..66.設(shè)計調(diào)試中遇到的疑難問題及解決方法……….77.心得體會與建議…………………..78.參考文獻…………………..8附錄…………………..9微機原理(單片機)課程設(shè)計報告控制控制器LCD顯示模塊上位機步進電機模塊外部按鍵模塊圖1-1步進電機控制A總體功能模塊示意圖圖中,控制器為89C52MCU,負責(zé)與上位機通訊、控制步進電機的開閉轉(zhuǎn)速轉(zhuǎn)向圈數(shù)、控制LCD顯示、接受外部按鍵輸入;步進電機模塊為42BYGHW型步進電機,為系統(tǒng)的執(zhí)行模塊;外部按鍵模塊按鍵1可控制電機的啟動和停止,按鍵2可控制電機的轉(zhuǎn)動方向,按鍵3可控制電機的轉(zhuǎn)速,按鍵4可控制轉(zhuǎn)動圈數(shù)(每按1次加1圈);LCD顯示當(dāng)前轉(zhuǎn)動方向、轉(zhuǎn)速、圈數(shù);上位機設(shè)置步進電機啟動、停止、正傳、反轉(zhuǎn)、步進電機轉(zhuǎn)速(快、中、慢),圈數(shù),并保存電機的工作狀態(tài)至文檔,從文檔讀取電機的工作狀態(tài),可以對串口進行設(shè)置,由VS2010MFC編程而得。二、硬件設(shè)計控制芯片:80C52單片機學(xué)習(xí)板驅(qū)動芯片:UM2003顯示屏:LCD1602電機:42BYGHW混合式步進電機選擇控制芯片時還是選用80C52系列,板子當(dāng)然用面積小的比較好;電機的驅(qū)動芯片選用ULN2003,ULN2003是高壓大電流達林頓晶體管陣列系列產(chǎn)品,具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應(yīng)于各類要求高速大功率驅(qū)動的系統(tǒng),市場價5.00-6.00左右;與80C52學(xué)習(xí)板配套的LCD顯示屏一般都是LCD1602型號,市場價4.00-5.00左右;步進電機選用42BYGHW混合式步進電機,步進電機一般分為三種:反應(yīng)式、永磁式、混合式,反應(yīng)式步進一般為兩相,轉(zhuǎn)矩和體積較小,步進角一般為7.5度或1.5度;永磁式步進一般為三相,可實現(xiàn)大轉(zhuǎn)矩輸出,步進角一般為1.5度,但噪聲和振動都很大;混合式步進是指混合了永磁式和反應(yīng)式的優(yōu)點。它又分為兩相、三相和五相:兩相步進角一般為1.8度而五相步進角一般為0.72度,混合式步進電機隨著相數(shù)(通電繞組數(shù))的增加,步進角減小,精度提高,這種步進電機的應(yīng)用最為廣泛。42BYGHW市場價30.00-40.00左右。ULN2003作為電極的驅(qū)動芯片,由七個硅NPN達林頓管組成。ULN2003的每一對達林頓都串聯(lián)一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數(shù)據(jù)。除管腳8接地、管腳9接VCC之外,管腳1-7作為脈沖輸入端,管腳10-16脈沖信號輸出端。一般從80C52單片機輸出出來的脈沖作為脈沖的輸入端,脈沖信號輸出端輸出幅值12V及以上的脈沖來驅(qū)動電機轉(zhuǎn)動。詳細的硬件電路圖如下:三、軟件設(shè)計是否接收到數(shù)據(jù)電機狀態(tài)相應(yīng)改變用戶是否按下按鍵更新界面否是否是否接收到數(shù)據(jù)電機狀態(tài)相應(yīng)改變用戶是否按下按鍵更新界面否是否是電機狀態(tài)相應(yīng)改變更新界面?zhèn)鬟f給下位機圖3-1上位機程序流程圖開始根據(jù)電機狀態(tài)顯示并驅(qū)動電機是否接收到數(shù)據(jù)開始根據(jù)電機狀態(tài)顯示并驅(qū)動電機是否接收到數(shù)據(jù)電機狀態(tài)相應(yīng)改變是否是否有外部按鍵按下電機狀態(tài)相應(yīng)改變否是圖3-2下位機程序流程圖四、結(jié)果分析或項目所實現(xiàn)的功能、指標上位機運行界面如下:圖4-1上位機運行圖像圖中轉(zhuǎn)向0代表反轉(zhuǎn),1代表正轉(zhuǎn),"保存參數(shù)"按鈕能夠?qū)⒛壳暗碾姍C參數(shù)存入.txt文件中,“讀取參數(shù)”按鈕能夠?qū)?txt中的參數(shù)讀入。右下角的小框為接受到的下位機電機參數(shù)。第一位數(shù)字開閉字位‘0’代表電機停止,‘1’代表電機起轉(zhuǎn)。第二位數(shù)字為速度字位‘0’代表低數(shù),‘1’代表中數(shù),‘2’代表高速。第三位數(shù)字代表正反位,‘0’為反轉(zhuǎn),‘1’為正轉(zhuǎn)。最后一位數(shù)字代表圈數(shù)。運行前必須先設(shè)置好串口,才能使用。下位機組裝如下圖:圖4-2下位機組裝圖按鍵1可控制電機的啟動和停止,按鍵2可控制電機的轉(zhuǎn)動方向,按鍵3可控制電機的轉(zhuǎn)速,按鍵4可控制轉(zhuǎn)動圈數(shù)(每按1次加1圈),在電機停轉(zhuǎn)的時候,LCD顯示“OFF”,在電機啟動的時候,LCD第一行第一個單詞顯示“ON”,下個字符正轉(zhuǎn)顯示‘Z’反轉(zhuǎn)時顯示‘F’,然后顯示“LOOP:”后面跟圈數(shù),第二行顯示”SPEED:”,’L’代表低速,‘M’代表中速,‘H’代表高速。五、明細清單器件單價LY5A-L2AV4STC89C52學(xué)習(xí)板1602液晶顯示器42BYGHWULN2003合計:六、設(shè)計調(diào)試中遇到的疑難問題及解決方法周歐翔:1、對于MFC中C++串口類不熟悉,所以只能在網(wǎng)上查有關(guān)的實例,并按照自己的要求不停地修改,然后在實驗室不停地實驗,并且在界面中專門用了一個編輯框不停地查看回傳的數(shù)據(jù)。還有對于下位機串口設(shè)置方面有些不熟悉,我就一直在查找有關(guān)方面的書籍,以及相關(guān)的例子進行修改。2、對于串口的時序一開始的時候不是很懂,一開始的時候想著在上下位機通訊的時候就只是由上位機傳輸數(shù)字字符串,由字符在字符串中的位置來決定傳遞的是什么,但是時序老是出錯,最后沒有辦法,只有將所有的字符換成單獨的字母字符,這樣就不會出錯了。3、MFC在VS2010中的COMBO控件老是出錯,不能夠顯示下拉欄,在網(wǎng)上找了好多的實力也沒有解決,可能是我電腦配置的問題。所以最后我只是使用了普通的EDIT控件,在控件中輸入數(shù)據(jù)來達到設(shè)置串口的目的。張璐:1、硬件原理圖比較簡單,只是需要上網(wǎng)查閱相關(guān)管腳的資料。焊接電路時基本沒有什么問題,但是進行調(diào)試時電機不轉(zhuǎn)。用萬用表測VCC以及地端,并檢查各管腳有沒有虛焊。焊接沒有問題,我們又用示波器測量ULN2003的輸入信號和輸出信號,輸入信號即單片機的輸出信號為5v脈沖沒有問題,但輸出信號一直為高電平。無奈應(yīng)該是驅(qū)動芯片有問題。我們又換了一塊板子;2、第二次接入電路電機依舊不轉(zhuǎn),檢查過后發(fā)現(xiàn)是芯片插反了。調(diào)整過后電機終于轉(zhuǎn)了起來。但是電機轉(zhuǎn)動幅度不大。將控制程序中四路輸出相鄰的延時時間變長,電機終于正常轉(zhuǎn)動了。后來對電機控制的各種參數(shù)進行微調(diào),最終達到了實驗效果。七、心得體會與建議周歐翔:單片機是自動化行業(yè)在實際生產(chǎn)生活中必不可少的伙伴,現(xiàn)在越來越多的產(chǎn)品都涉及到了單片機領(lǐng)域,所以這次的課程設(shè)計對我意義頗深,特別是這種給你一個題目,自主去做的模式,非常符合實際生產(chǎn)中生產(chǎn)形式。自主查找信息,學(xué)習(xí)單片機芯片資料,尋找相關(guān)的例程,這些都是非常寶貴的經(jīng)驗。這個題目如果再往深了做就是結(jié)合手機安卓系統(tǒng)與上位機的通訊,或者就是手機充當(dāng)上位機,來遠程控制步進電機。我覺得老師在芯片資料方面給的不是太詳細,有些東西必須在網(wǎng)上找相似的器件才能夠滿足要求,加大了查找資料的難度,然后實驗報告所占的分值過多,實驗報告終究只是其次,最重要的還是將項目完成,所以我認為項目完成情況應(yīng)該占分數(shù)的大頭。張璐:單片機在各行各業(yè)的應(yīng)用都很廣泛,特別在自動化行業(yè)是重頭。之前做大創(chuàng)項目有接觸過這方面,所以上手并不難。對步進電機的控制之前沒有做過,但通過查閱資料后也大致明白了其具體原理,就是基于單片機自身產(chǎn)生的晶振,由串口輸出一定占空比的脈沖進而控制步進電機。硬件方面主要由我負責(zé),雖然之前做過DSP小車底盤的焊接,但是此次實驗硬件部分進行得也不是很順利。主要是有些芯片是壞掉的,所以耽誤了一些時間。上位機程序是由周歐翔同學(xué)編寫,但我也對相關(guān)知識進行了學(xué)習(xí),這種單獨做小項目能夠做出來成果后我們有很大的成就感,而且從中受益匪淺。課程設(shè)計時間安排較為靈活十分合理,我們也基本比較滿意??赡艽蠹覍τ隍炇盏却蠋煴容^有意見,我覺得老師本來就比較忙碌,我們等待驗收是應(yīng)該的,而且大部分同學(xué)第一次驗收都存在問題,都沒有太多的耐心。對于實驗室的建議就是,可以對用過的芯片、器件進行復(fù)查,有些器件已經(jīng)壞掉了,再給同學(xué)們繼續(xù)使用會耽誤項目的進程。最后感謝三位實驗老師的細心教導(dǎo)!參考文獻[1]林洋電子.LY5A-L2AV4原理圖.L[2]常州市合泰電機電器有限公司.42BYGHW產(chǎn)品說明書[3]郭天祥.新概念51單片機C語言教程入門提高【M】.北京.電子工業(yè)出版社附錄下位機源程序:#include<reg52.h>sbitlcden=P1^2;//LCD使能端sbitlcdrs=P1^0;//LCD控制端sbiton_off_key=P3^7;//按鍵1sbitorientation_key=P3^6;//按鍵2sbitspeed_key=P3^5;//按鍵3sbitloop_key=P3^4;//按鍵4bitclockwise_flag=1;//轉(zhuǎn)向位biton_off_flag=0;//開關(guān)位bitcom_flag=0;//COM位unsignedcharchar_num=0;unsignedcharon_off,clock=0;unsignedcharnum=1;unsignedcharloops=1;//圈數(shù)unsignedchartable_begin=0;unsignedcharcodetable1[]={0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};//電機運行表unsignedcharcodechar_table5[]="Speed:";//LCD顯示字符串?dāng)?shù)組unsignedcharcodechar_table4[]="Loop:";//LCD顯示字符串?dāng)?shù)組unsignedcharcodechar_table3[]="ONZ";//LCD顯示字符串?dāng)?shù)組unsignedcharcodechar_table2[]="ONF";//LCD顯示字符串?dāng)?shù)組unsignedcharcodechar_table1[]="OFF";//LCD顯示字符串?dāng)?shù)組unsignedcharspeed_c=0;unsignedcharloop_c=0;unsignedcharreceive_char=0;unsignedcharletter_inx=0;unsignedcharloop_count=0;//用于判斷已轉(zhuǎn)的圈數(shù)voiddelay(unsignedchari)//延時函數(shù){unsignedcharj,k; for(j=i;j>0;j--) for(k=125;k>0;k--) ;}voidwrite_status(unsignedcharcom)//LCD狀態(tài)設(shè)置{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}voidwrite_data(unsignedcharData)//LCD顯示一個字符{lcdrs=1;P0=Data;delay(5);lcden=1;delay(5);lcden=0;}voidinit_lcd()//LCD初始化{lcden=0;write_status(0x38);write_status(0x0c);write_status(0x06);write_status(0x01);write_status(0x80);}voidinit_com()//串口初始化{TMOD=0x20;TH1=0xfa;//波特率為4800TL1=0xfa;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;}voidsend_data()//向上位機發(fā)送數(shù)據(jù){ES=0; on_off=on_off_flag; clock=clockwise_flag; SBUF='0'+on_off; while(!TI); TI=0; SBUF='';while(!TI); TI=0; SBUF='0'+num; while(!TI); TI=0; SBUF='';while(!TI); TI=0;SBUF='0'+clock;while(!TI); TI=0; SBUF='';while(!TI); TI=0;SBUF='0'+loops;while(!TI); TI=0; ES=1;}voidkey()//檢查按鍵狀態(tài)的函數(shù){if(on_off_key==0) { delay(5); if(on_off_key==0) { on_off_flag=~on_off_flag; send_data(); ; while(on_off_key==0) ; } } if(orientation_key==0) { delay(5); if(orientation_key==0){ clockwise_flag=~clockwise_flag; loop_count=0; send_data(); while(orientation_key==0) ; } } if(speed_key==0) { delay(5); if(speed_key==0) { if(num==2) num=0; else num++; send_data(); while(speed_key==0) ; } } if(loop_key==0) { delay(5); if(loop_key==0){ loops++; send_data(); while(speed_key==0) ; } }}voiddisplay()//LCD顯示函數(shù){init_lcd();if(on_off_flag==0) {for(char_num=0;char_num<4;char_num++)write_data(char_table1[char_num]);}else{if(clockwise_flag==1){for(char_num=0;char_num<5;char_num++)write_data(char_table3[char_num]);for(char_num=0;char_num<5;char_num++)write_data(char_table4[char_num]);write_data('0'+loops); write_status(0x80+0x40); for(char_num=0;char_num<6;char_num++) write_data(char_table5[char_num]); if(num==0) write_data('L'); elseif(num==1) write_data('M'); elseif(num==2) write_data('H');} else{for(char_num=0;char_num<5;char_num++)write_data(char_table2[char_num]);for(char_num=0;char_num<5;char_num++)write_data(char_table4[char_num]);write_data('0'+loops); write_status(0x80+0x40); for(char_num=0;char_num<6;char_num++) write_data(char_table5[char_num]); if(num==0) write_data('L'); elseif(num==1) write_data('M'); elseif(num==2) write_data('H');}}}voiddispose()//判斷是否反向{if(clockwise_flag==0)table_begin=0;elsetable_begin=4;}voidmotor_run()//驅(qū)動電機{unsignedchari,j;if(on_off_flag==0)//如果需要停止電機{ display(); P1=0x00; return; } else {display(); if(loop_count==50*loops) { on_off_flag=0; loop_count=0; send_data(); return; } loop_count++; for(j=0+table_begin;j<4+table_begin;j++) { P1=table1[j]; for(i=(num+1)*2;i<10;i++) { delay(8); } } }}voidmain(){while(1){init_com();init_lcd();key(); dispose(); motor_run(); //}}voidreceive_data()interrupt4//中斷函數(shù),用于處理上位機傳遞的數(shù)據(jù){RI=0;receive_char=SBUF;if(receive_char==''){return;}if(receive_char=='f')on_off_flag=0;elseif(receive_char=='n')on_off_flag=1;elseif(receive_char=='l')num=0;elseif(receive_char=='m')num=1;elseif(receive_char=='h')num=2;elseif(receive_char=='u')clockwise_flag=0;elseif(receive_char=='c')clockwise_flag=1;elseif(receive_char>='0'&&receive_char<='9')loops=receive_char-'0';}上位機程序://motorDlg.h:頭文件//#pragmaonce#include"afxcmn.h"#include"mscomm1.h"#include"afxwin.h"http://CmotorDlg對話框classCmotorDlg:publicCDialogEx{//構(gòu)造public: CmotorDlg(CWnd*pParent=NULL); //標準構(gòu)造函數(shù)//對話框數(shù)據(jù) enum{IDD=IDD_MOTOR_DIALOG}; protected: virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDV支持//實現(xiàn)protected: HICONm_hIcon; //生成的消息映射函數(shù) virtualBOOLOnInitDialog(); afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam); afx_msgvoidOnPaint(); afx_msgHCURSOROnQueryDragIcon(); DECLARE_MESSAGE_MAP()public: afx_msgvoidOnNMCustomdrawSlider1(NMHDR*pNMHDR,LRESULT*pResult); afx_msgvoidOnBnClickedButton1(); afx_msgvoidOnBnClickedStart(); voidupdateStatus(); CSliderCtrlSpeed_Slider; intm_motor_on; intm_loop; intm_speed; intm_clockwise; afx_msgvoidOnBnClickedLoad(); afx_msgvoidOnBnClickedSave(); CMscomm1m_mscomm; afx_msgvoidOnBnClickedStop(); afx_msgvoidOnBnClickedOrientation(); afx_msgvoidOnDeltaposSpin1(NMHDR*pNMHDR,LRESULT*pResult); CStringm_clockwise_edit; CStringm_loop_edit; DECLARE_EVENTSINK_MAP() voidOnCommMscomm1(); boolComSendData(); CStringm_motor_status; CStringm_bode_str; CStringm_odd_str; CStringm_data_str; intm_bode; charm_odd; intm_data; afx_msgvoidOnBnClickedApplybutton(); CStringm_serial_num; intm_serial; CStringm_onoff; CStringm_strReceive; afx_msgvoidOnEnChangeEdit8(); CEditm_serial_edit; afx_msgvoidOnEnChangeBodeedit(); CEditm_bode_edit;};//motorDlg.cpp:實現(xiàn)文件//#include"stdafx.h"#include"motor.h"#include"motorDlg.h"#include"afxdialogex.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif//用于應(yīng)用程序“關(guān)于”菜單項的CAboutDlg對話框classCAboutDlg:publicCDialogEx{public: CAboutDlg();//對話框數(shù)據(jù) enum{IDD=IDD_ABOUTBOX}; protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//實現(xiàn)protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogEx(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)END_MESSAGE_MAP()//CmotorDlg對話框CmotorDlg::CmotorDlg(CWnd*pParent/*=NULL*/) :CDialogEx(CmotorDlg::IDD,pParent) ,m_motor_on(0) ,m_loop(1) ,m_speed(1) ,m_clockwise(1) ,m_clockwise_edit(_T("")) ,m_loop_edit(_T("")) ,m_motor_status(_T("")) ,m_bode_str(_T("")) ,m_odd_str(_T("")) ,m_data_str(_T("")) ,m_bode(0) ,m_odd(0) ,m_data(0) ,m_serial_num(_T("")) ,m_serial(0) ,m_onoff(_T("")) ,m_strReceive(_T("")){ m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCmotorDlg::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX); DDX_Control(pDX,IDC_SLIDER1,Speed_Slider); DDX_Control(pDX,IDC_MSCOMM1,m_mscomm); DDX_Text(pDX,IDC_EDIT2,m_clockwise_edit); DDX_Text(pDX,IDC_EDIT1,m_loop_edit); DDX_Text(pDX,IDC_BODEEDIT,m_bode_str); DDX_Text(pDX,IDC_ODDEDIT,m_odd_str); DDX_Text(pDX,IDC_DATAEDIT,m_data_str); DDX_Text(pDX,IDC_EDIT8,m_serial_num); DDX_Text(pDX,IDC_EDIT3,m_onoff); DDX_Text(pDX,IDC_EDIT4,m_strReceive); DDX_Control(pDX,IDC_EDIT8,m_serial_edit); DDX_Control(pDX,IDC_BODEEDIT,m_bode_edit);}BEGIN_MESSAGE_MAP(CmotorDlg,CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_NOTIFY(NM_CUSTOMDRAW,IDC_SLIDER1,&CmotorDlg::OnNMCustomdrawSlider1) ON_BN_CLICKED(IDC_START,&CmotorDlg::OnBnClickedStart) ON_BN_CLICKED(IDC_LOAD,&CmotorDlg::OnBnClickedLoad) ON_BN_CLICKED(IDC_SAVE,&CmotorDlg::OnBnClickedSave) ON_BN_CLICKED(IDC_STOP,&CmotorDlg::OnBnClickedStop) ON_BN_CLICKED(IDC_Orientation,&CmotorDlg::OnBnClickedOrientation) ON_NOTIFY(UDN_DELTAPOS,IDC_SPIN1,&CmotorDlg::OnDeltaposSpin1) ON_BN_CLICKED(IDC_APPLYBUTTON,&CmotorDlg::OnBnClickedApplybutton) ON_EN_CHANGE(IDC_EDIT8,&CmotorDlg::OnEnChangeEdit8) ON_EN_CHANGE(IDC_BODEEDIT,&CmotorDlg::OnEnChangeBodeedit)END_MESSAGE_MAP()//CmotorDlg消息處理程序BOOLCmotorDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); //將“關(guān)于...”菜單項添加到系統(tǒng)菜單中。 //IDM_ABOUTBOX必須在系統(tǒng)命令范圍內(nèi)。 ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { BOOLbNameValid; CStringstrAboutMenu; bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //設(shè)置此對話框的圖標。當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動 //執(zhí)行此操作 SetIcon(m_hIcon,TRUE); //設(shè)置大圖標 SetIcon(m_hIcon,FALSE); //設(shè)置小圖標 //TODO:在此添加額外的初始化代碼m_bode_str=_T("9600"); m_odd_str=_T("無"); m_data_str=_T("8"); m_serial_num=_T("11"); m_bode=4800; m_odd='n'; m_data=8; m_serial=1; Speed_Slider.SetRange(0,2); Speed_Slider.SetTicFreq(1); Speed_Slider.SetPos(0); m_mscomm.put_CommPort(11); m_mscomm.put_Settings(_T("9600,n,8,1")); m_mscomm.put_InputMode(1); m_mscomm.put_InputLen(0); m_mscomm.put_InBufferSize(1024); m_mscomm.put_OutBufferSize(1024); m_mscomm.put_RThreshold(1); m_mscomm.put_SThreshold(0); //m_mscomm.put_PortOpen(true);//打開串口 CStringstr1("1"); m_clockwise_edit=str1; CStringstr2;str2.Format(_T("%d"),m_loop); m_loop_edit=str2; updateStatus(); UpdateData(false); returnTRUE;//除非將焦點設(shè)置到控件,否則返回TRUE}voidCmotorDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID,lParam); }}//如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼//來繪制該圖標。對于使用文檔/視圖模型的MFC應(yīng)用程序,//這將由框架自動完成。voidCmotorDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//用于繪制的設(shè)備上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0); //使圖標在工作區(qū)矩形中居中 intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //繪制圖標 dc.DrawIcon(x,y,m_hIcon); } else { CDialogEx::OnPaint(); }}//當(dāng)用戶拖動最小化窗口時系統(tǒng)調(diào)用此函數(shù)取得光標//顯示。HCURSORCmotorDlg::OnQueryDragIcon(){ returnstatic_cast<HCURSOR>(m_hIcon);}voidCmotorDlg::OnNMCustomdrawSlider1(NMHDR*pNMHDR,LRESULT*pResult){ LPNMCUSTOMDRAWpNMCD=reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); //TODO:在此添加控件通知處理程序代碼 intpos=Speed_Slider.GetPos(); m_speed=pos; updateStatus(); ComSendData(); *pResult=0;}voidCmotorDlg::OnBnClickedStart(){ //TODO:在此添加控件通知處理程序代碼 m_motor_on=1; updateStatus(); ComSendData();}voidCmotorDlg::OnBnClickedLoad(){ //TODO:在此添加控件通知處理程序代碼 CStdioFilem_file; CStringm_path_str; CStringstr; TCHARszFilter[]=_T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); CFileDialogfile(TRUE,_T("txt"),NULL,OFN_HIDEREADONLY/*|OFN_OVERWRITEPROMPT*/|OFN_ALLOWMULTISELECT,szFilter,this); if(IDOK==file.DoModal()) { m_path_str=file.GetPathName(); m_file.Open(m_path_str,CFile::modeRead); CStringo_str,s_str,c_str,l_str; m_file.ReadString(o_str); m_file.ReadString(s_str); m_file.ReadString(c_str); m_file.ReadString(l_str); m_motor_on=_ttoi(o_str); m_speed=_ttoi(s_str); m_clockwise=_ttoi(c_str); m_loop=_ttoi(l_str); updateStatus(); m_file.Close(); } ComSendData();}voidCmotorDlg::OnBnClickedSave(){ //TODO:在此添加控件通知處理程序代碼 TCHARszFilter[]=_T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); CFileDialogfile(FALSE,_T(""),_T("my"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT/*|OFN_ALLOWMULTISELECT*/,szFilter,this); CStdioFilesfile; CStringm_path; CStringstr; intsize=0; if(IDOK==file.DoModal()) { m_path=file.GetPathName(); sfile.Open(m_path,CFile::modeCreate|CFile::modeWrite); CStringo_str,s_str,c_str,l_str; o_str.Format(_T("%d"),m_motor_on); m_motor_status+=o_str; s_str.Format(_T("%d"),m_speed); m_motor_status+=s_str; c_str.Format(_T("%d"),m_clockwise); m_motor_status+=c_str; l_str.Format(_T("%d"),m_loop); m_motor_status+=l_str; sfile.WriteString(o_str); sfile.WriteString(_T("\n")); sfile.WriteString(s_str); sfile.WriteString(_T("\n")); sfile.WriteString(c_str); sfile.WriteString(_T("\n")); sfile.WriteString(l_str); sfile.Close(); }}voidCmotorDlg::OnBnClickedStop(){ //TODO:在此添加控件通知處理程序代碼 m_motor_on=0;updateStatus(); ComSendData();}voidCmotorDlg::OnBnClickedOrientation(){ //TODO:在此添加控件通知處理程序代碼 m_clockwise=!m_clockwise;updateStatus(); ComSendData();}voidCmotorDlg::OnDeltaposSpin1(NMHDR*pNMHDR,LRESULT*pResult){ LPNMUPDOWNpNMUpDown=reinterpret_cast<LPNMUPDOWN>(pNMHDR); //TODO:在此添加控件通知處理程序代碼 m_loop-=pNMUpDown->iDelta; if(m_loop<=0) m_loop=0; CStringstr2;str2.Format(_T("%d"),m_loop); m_loop_edit=str2; updateStatus(); UpdateData(false); ComSendData(); *pResult=0;}BEGIN_EVENTSINK_MAP(CmotorDlg,CDialogEx) ON_EVENT(CmotorDlg,IDC_MSCOMM1,1,CmotorDlg::OnCommMscomm1,VTS_NONE)END_EVENTSINK_MAP()voidCmotorDlg::OnCommMscomm1(){ //TODO:在此處添加消息處理程序代碼 VARIANTm_input; char*str,*str1; intk,nEvent,i; CStringstr2; nEvent=m_mscomm.get_CommEvent(); switch(nEvent) { case2: k=m_mscomm.get_InBufferCount(); if(k<7) return;if(k>0) { str=(char*)(unsignedchar*)m_mscomm.get_Input().parray->pvData; } i=0; str1=str; while(i<k) { i++; str1++; } m_motor_on=str[0]-48; m_speed=str[2]-'0'; m_clockwise=str[4]-'0'; m_loop=str[6]-'0'; updateStatus(); *str1='\0'; str2=(constchar*)str; m_strReceive=str2; break; default: break; } UpdateData(false);}voidCmotorDlg::updateStatus()//更新電機狀態(tài){ m_motor_status=_T(""); CStringo_str,s_str,c_str,l_str; o_str.Format(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論