第一篇:嵌入式系統(tǒng)實(shí)驗(yàn)
南京信息工程大學(xué) 實(shí)驗(yàn)(實(shí)習(xí))報告
實(shí)驗(yàn)(實(shí)習(xí))名稱
電機(jī)轉(zhuǎn)動控制及中斷實(shí)驗(yàn) 實(shí)驗(yàn)(實(shí)習(xí))日期
2016.5 得分
指導(dǎo)教師 謝勝東
學(xué)院 計(jì)算機(jī)與軟件 專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 年級
2013 班次 3 姓名
葉正舟 學(xué)號
20131308072 實(shí)驗(yàn)名稱
電機(jī)轉(zhuǎn)動控制及中斷實(shí)驗(yàn) 實(shí)驗(yàn)?zāi)康?/p>
(1)熟悉ARM本身自帶的六路即三對PWM,掌握相應(yīng)寄存器的配置
(2)編程實(shí)現(xiàn) ARM系統(tǒng)的PWM 輸出和I/O 輸出,前者用于控制直流電機(jī),后者用于控制步進(jìn)電機(jī)。
(3)了解直流電機(jī)和步進(jìn)電機(jī)的工作原理,學(xué)會用軟件的方法實(shí)現(xiàn)步進(jìn)電機(jī)的脈沖分配,即用軟件的方法代替硬件的脈沖分配器。
(4)掌握帶有PWM 和I/O 的CPU 編程實(shí)現(xiàn)其相應(yīng)功能的主要方法。實(shí)驗(yàn)環(huán)境
(1)ADS1.2開發(fā)環(huán)境(2)PC(3)串口線 實(shí)驗(yàn)內(nèi)容及要求
學(xué)習(xí)步進(jìn)電機(jī)和直流電機(jī)的工作原理,了解實(shí)現(xiàn)兩個電機(jī)轉(zhuǎn)動對于系統(tǒng)的軟件和硬件要求。學(xué)習(xí)ARM知識,掌握PWM 的生成方法,同時也要掌握I/O 的控制方法。
(1)編程實(shí)現(xiàn)ARM芯片的一對PWM 輸出用于控制直流電機(jī)的轉(zhuǎn)動,通過A/D 旋鈕控制其正反轉(zhuǎn)及轉(zhuǎn)速
(2)編程實(shí)現(xiàn)ARM的四路I/O 通道實(shí)現(xiàn)環(huán)形脈沖分配用于控制步進(jìn)電機(jī)的轉(zhuǎn)動,通過A/D 旋鈕轉(zhuǎn)角控制步進(jìn)電機(jī)的轉(zhuǎn)角。
(3)通過超級終端來控制直流電機(jī)與步進(jìn)電機(jī)的切換。實(shí)驗(yàn)設(shè)計(jì)與實(shí)驗(yàn)步驟
(1)新建工程,將“電機(jī)轉(zhuǎn)動控制實(shí)驗(yàn)”中的文件添加到工程(2)編寫直流電機(jī)初始化數(shù)(MotorCtrl.c)(3)控制直流電機(jī)與步進(jìn)電機(jī) 實(shí)驗(yàn)過程與分析
(1)通過把從串口中得到控制信息的代碼修改成從zlg7289芯片中讀取小鍵盤信息,從而利用試驗(yàn)臺的小鍵盤來控制步進(jìn)電機(jī)和直流電機(jī)的切換
(2)A/D轉(zhuǎn)換可以把電信號轉(zhuǎn)換成數(shù)字信號來控制電機(jī)的轉(zhuǎn)速。for(;;)
{ loop:
//if((rUTRSTAT0 & 0x1))//有輸入,則返回
if(rPDATG&ZLG7289_KEY)//17鍵小鍵盤控制電機(jī)
{
*Revdata=RdURXH0();
goto begin;
}
Delay(10);ADData=GetADresult(0);
if(abs(lastADData-ADData)<20)
goto loop;Delay(10);count=-(ADData-lastADData)*3;
//(ADData-lastADData)*270/1024為ad旋鈕轉(zhuǎn)過的角度,360/512為步距角,//由于接了1/8減速器,兩者之商再乘以8為步進(jìn)電機(jī)相應(yīng)轉(zhuǎn)過的角度
if(count>=0)
{//轉(zhuǎn)角大于零
for(j=0;j { for(i=0;i<=7;i++) { SETEXIOBITMASK(stepdata[i], 0xf0); Delay(200); } } } lastADData=ADData; } } 實(shí)驗(yàn)結(jié)果總結(jié) 利用A/D轉(zhuǎn)換器實(shí)現(xiàn)了對直流電機(jī)和步進(jìn)電機(jī)的控制,利用實(shí)驗(yàn)設(shè)備上自帶的小鍵盤實(shí)現(xiàn)了A/D轉(zhuǎn)換器對兩個電機(jī)控制的切換。心得體會 通過本次實(shí)驗(yàn),熟悉了ARM自帶的六路(三對)PWM,并對直流電機(jī)和步進(jìn)電機(jī)的工作原理有了進(jìn)一步的了解。 嵌入式系統(tǒng)原理實(shí)驗(yàn)總結(jié)報告 車輛座椅控制系統(tǒng)實(shí)驗(yàn) 2014/5/23 嵌入式系統(tǒng)原理實(shí)驗(yàn)總結(jié)報告 一、技術(shù)性總結(jié)報告 (一)題目:車輛座椅控制系統(tǒng)實(shí)驗(yàn) (二)項(xiàng)目概述: 1.為了實(shí)現(xiàn)車輛座椅控制的自動化與智能化。 2.方便用戶通過智能手機(jī)與車載傳感器之間的聯(lián)動。3.使車輛作為當(dāng)今物聯(lián)網(wǎng)中重要的一個節(jié)點(diǎn)發(fā)揮作用。 4.通過車輛座椅控制系統(tǒng)實(shí)驗(yàn)實(shí)現(xiàn)對嵌入式系統(tǒng)原理課程的熟練掌握與對嵌入式系統(tǒng)原理知識的深化記憶。 5.加強(qiáng)本組學(xué)生對嵌入式系統(tǒng)原理的更深層次的理解與運(yùn)用。 (三)技術(shù)方案及原理 本次試驗(yàn)分為軟件、硬件兩個部分。1.軟件部分。 A.智能手機(jī)部分,包括通過智能手機(jī)對座椅的控制部分、手機(jī)所攜帶的身份信息部分。 本部分軟件使用Java編寫,其程序部分為: 主程序: package com.example.seat; import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.os.Build; import java.io.BufferedReader;import java.io.IOException; import java.io.InputStreamReader;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.InetAddress;import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle; import android.view.KeyEvent;import android.view.View;import android.widget.Button; public class MainActivity extends ActionBarActivity { private Button Up = null;private Button Left = null;private Button Dowm = null;private Button Right = null;private Socket socket = null; private static final String HOST = “192.168.1.142”; private static final int PORT = 10007; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initControl(); } private void initControl(){ Up =(Button)findViewById(R.id.button1); Up.setOnClickListener(new ReceiverListener()); } class ReceiverListener implements OnClickListener { protected String line; @Override public void onClick(View v){ // TODO Auto-generated method stub new Thread(){ @Override public void run(){ try { Socket socket = new Socket(HOST, PORT); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); line = br.readLine(); br.close(); } catch(UnknownHostException e){ // TODO Auto-generated catch block e.printStackTrace(); } catch(IOException e){ // TODO Auto-generated catch block e.printStackTrace(); } handler.sendEmptyMessage(0); } }.start(); } } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ super.handleMessage(msg); } }; @Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ // Handle action bar item clicks here.The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId(); if(id == R.id.action_settings){ return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view.*/ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment(){ } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } } } 界面代碼: package=“com.example.seat” android:versionCode=“1” android:versionName=“1.0” > android:name=“android.permission.ACCESS_NETWORK_STATE”/> android:minSdkVersion=“8” android:targetSdkVersion=“19” /> android:allowBackup=“true” android:icon=“@drawable/ic_launcher” android:label=“@string/app_name” android:theme=“@style/AppTheme” > android:name=“com.example.seat.MainActivity” android:label=“@string/app_name” > host = '' port = 10007 pwm = PWM(0x6F, debug=True) servoMin = 125 # Min pulse length out of 4096 , 0.5 servoMax = 575 # Max pulse length out of 4096 , 2.3 def setServoPulse(channel, pulse): pulseLength = 1000000 # 1,000,000 us per second pulseLength /= 60 # 60 Hz print “%d us per period” % pulseLength pulseLength /= 4096 # 12 bits of resolution print “%d us per bit” % pulseLength pulse *= 1000 pulse /= pulseLength if(pulse>servoMax): pulse = servoMax if(pulse pwm.setPWM(channel, 0, int(pulse)) pwm.setPWMFreq(60) # Set frequency to 60 Hz pwm.setPWM(0, 0, servoMax) if __name__ == '__main__': s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) s.listen(3) print 'Server is running on port %d, press Ctrl-C to terminate it.' % port pulse_ud = 1.9 pulse_lr = 1.9 setServoPulse(0,pulse_ud) setServoPulse(1,pulse_lr) while True: clientsock, clientaddr = s.accept() clientfile = clientsock.makefile('rw', 0) ctrlinfo = clientfile.readline().strip() print 'Control info is %s.n' % ctrlinfo if ctrlinfo == “up”: pulse_ud += 0.1 elif ctrlinfo == “down”: pulse_ud-= 0.1 elif ctrlinfo == “l(fā)eft”: pulse_lr += 0.1 elif ctrlinfo == “right”: pulse_lr-= 0.1 else: print “ERRORn” setServoPulse(0,pulse_ud) setServoPulse(1,pulse_lr) clientfile.close() clientsock.close() 2.硬件部分。 對車載座椅控制部分發(fā)出的信息的接受、識別、執(zhí)行部分。本次試驗(yàn)使用的硬件設(shè)備包括:智能手機(jī)一部、“樹莓派”一臺、小舵機(jī)兩臺、舵機(jī)驅(qū)動板一個、無線網(wǎng)卡一個、杜邦線若干、5V電源一個、無線路由器一個 智能手機(jī) 樹莓派(外) 樹莓派(內(nèi)) 小舵機(jī) 舵機(jī)驅(qū)動板 無線網(wǎng)卡 杜邦線 5V電源 無線路由器 (四)實(shí)驗(yàn)流程及結(jié)果 1.打開智能手機(jī)上的控制軟件。 2.向車載座椅控制臺發(fā)送信息。(發(fā)送信息分別為上、下、左、右)3.車載座椅控制臺接受、識別并執(zhí)行信息。4.通過小舵機(jī)的動作驗(yàn)證該實(shí)驗(yàn)是否成功。(詳細(xì)見視頻) 二、工作進(jìn)度自評表 本次試驗(yàn)完成。 本次試驗(yàn)計(jì)劃分為三個階段。 第一階段:智能手機(jī)部分、車載座椅控制部分和硬件部分的分別完成。本階段完成。 第二階段:智能手機(jī)部分、車載座椅控制部分和硬件部分的整合階段。本階段完成。 第三階段:車輛座椅控制系統(tǒng)實(shí)驗(yàn)的驗(yàn)收調(diào)試階段。本階段完成。 三、組內(nèi)人員自評 本次試驗(yàn)打到預(yù)期的實(shí)驗(yàn)?zāi)康摹km然在實(shí)驗(yàn)進(jìn)行過程中遇到了不少的麻煩,但是通過我們成員自身的努力學(xué)習(xí)掌握了實(shí)驗(yàn)所要求的知識。最后實(shí)驗(yàn)的成功與組員之間的互相幫助與緊密配合是分不開的。 四、個人學(xué)習(xí)心得 本人通過此次實(shí)驗(yàn),對于嵌入式系統(tǒng)原理有了更加深層次的了解。對于設(shè)計(jì)嵌入式系統(tǒng)原理的實(shí)驗(yàn)也有了較為高程度的提高。為了以后更進(jìn)一步的學(xué)習(xí)并掌握嵌入式系統(tǒng)打下了堅(jiān)實(shí)的一步。對于了解車輛座椅控制的自動化與智能化;了解用戶通過智能手機(jī)與車載傳感器之間的聯(lián)動;了解車輛作為當(dāng)今物聯(lián)網(wǎng)中重要的一個節(jié)點(diǎn)都發(fā)揮了重要作用。通過車輛座椅控制系統(tǒng)實(shí)驗(yàn)實(shí)現(xiàn)對嵌入式系統(tǒng)原理課程的熟練掌握與對嵌入式系統(tǒng)原理知識的深化記憶。加強(qiáng)本組學(xué)生對嵌入式系統(tǒng)原理的更深層次的理解與運(yùn)用。 如今,嵌入式系統(tǒng)已經(jīng)在眾多電氣電子產(chǎn)品上應(yīng)用,有人預(yù)測今后5年發(fā)展形勢看好。嵌入式是典型的交叉學(xué)科,電信、電子、電氣、計(jì)算機(jī)、通信等等都有涉及。 嵌入式理論、實(shí)踐要求多、門檻高,只有理論、實(shí)踐同步才能在積累中更好的漸次掌握,這學(xué)期我們針對嵌入式入門做了一些實(shí)驗(yàn),通過自己動手和實(shí)驗(yàn)箱、實(shí)驗(yàn)軟件打交道,對嵌入式編程形成初步了解,為今后進(jìn)一步發(fā)展打基礎(chǔ)。 實(shí)驗(yàn)環(huán)境: 武漢創(chuàng)維特公司JXARM9-2410開發(fā)板、PC; Linux、windows操作平臺; DNW、VMwareWorkstation應(yīng)用軟件; 《ARM9嵌入式技術(shù)及Linux高級實(shí)踐教程》、實(shí)驗(yàn)參考資料等; 實(shí)驗(yàn)內(nèi)容及目標(biāo): 閱讀樣例程序,進(jìn)行: 1.熟悉JXARM9-2410開發(fā)板、相關(guān)應(yīng)用軟件的使用,能成功運(yùn)行示例實(shí)驗(yàn)程序(demo-led); 2.使用VMware,修改demo-led源程序,使開發(fā)板上數(shù)碼管按照demo-led顯示方式顯示; 3.使用VMware、DNW,修改相關(guān)源程序,實(shí)現(xiàn)開發(fā)板鍵盤輸入的字符在DNW中顯示; 4.使用VMware、DNW,修改相關(guān)源程序,實(shí)現(xiàn)對直流電機(jī)轉(zhuǎn)動狀態(tài)的控制; 觀看教學(xué)視頻,進(jìn)行交叉編譯: 1.加載linux內(nèi)核; 2.配置、編譯linux內(nèi)核; 3.Windows、linux跨平臺文件共享; 4.編譯、運(yùn)行l(wèi)inux程序(helloworld) 5.Linux下編譯數(shù)碼管顯示驅(qū)動程序; 6.Linux下編譯攝像頭、GPRS驅(qū)動程序; 學(xué)習(xí)嵌入式是一個漫長的過程,學(xué)好它還是需要一番的功夫。通過嵌入式實(shí)驗(yàn)由淺入深的動手實(shí)踐,我漸漸對嵌入式有了具體概念,也逐漸對其產(chǎn)生了興致和好奇心。 對于初學(xué)者,還有一點(diǎn)小建議,不要好高騖遠(yuǎn),要腳踏實(shí)地. 1.實(shí)驗(yàn)二:利用中斷實(shí)現(xiàn) OLED 動態(tài)顯示實(shí)驗(yàn) 1.1 實(shí)驗(yàn)名稱 1.2 實(shí)驗(yàn)?zāi)康?/p> (1)深入學(xué)習(xí)、理解、掌握 OLED 字符顯示方法 (2)深入學(xué)習(xí)、理解、掌握 OLED 圖形顯示方法(3)學(xué)習(xí)、理解、掌握中斷使用方法 1.3 實(shí)驗(yàn)過程與分析 1.3.1 回答實(shí)驗(yàn)報告中的實(shí)驗(yàn)問題 (1)ISR是什么?簡述一下中斷的作用和使用方法 答:ISR是中斷服務(wù)程序。作用是通過處理器執(zhí)行事先編好的某個特定的程序。使用方法就是在main中寫一個中斷程序,然后在startup.s中進(jìn)行注冊。 (2)嵌入式系統(tǒng)中有哪些應(yīng)用有定時性循環(huán)處理的要求?舉幾個例子 答:在各種網(wǎng)絡(luò)的應(yīng)用中,設(shè)計(jì)的一些部件,如計(jì)數(shù)器,時鐘等。 (3)定時時間間隔如何修改? (4)選作內(nèi)容5-8的編程思路是什么?若做的話應(yīng)該怎樣實(shí)現(xiàn)? 答:編程思路:先畫直線和豎線,組成一個正方形,將各個參數(shù)填寫到函數(shù)答:通過改變SysTickPeriodSet(SysCtlClockGet()/100)后面的100這個參數(shù)。 RIT128x96x4ImageDraw(buf,,); 第6個選作:判斷畫的原點(diǎn)x,原點(diǎn)y,和畫原點(diǎn)x+的長,畫原點(diǎn)y+畫寬的值要在0-128和0-96。 第7個選作:把RIT128x96x4StringDraw(“hello”,,);就是把畫的灰度定義為一個變量x。最后就會出現(xiàn)由不同的亮度而形成的波浪。 第8個就是利用隨機(jī)函數(shù)產(chǎn)生畫的原點(diǎn),隨機(jī)的在屏幕上進(jìn)行顯示。 (5)拖影現(xiàn)象如何解決?計(jì)數(shù)值顯示為什么沒有拖影? 答:在程序結(jié)束后執(zhí)行清屏語句:計(jì)數(shù)顯示是每次重新賦值,所以不會出現(xiàn)拖影。 1.3.2 實(shí)驗(yàn)中遇到的問題及解決方法 (1)字符和下方橫線,從左至右移動,無法同時到達(dá) 通過最大寬度128除以閥值,調(diào)整了字符和橫線的速度,解決(2)附加字符循環(huán)移動,移動到一半,不見了 查看函數(shù)排錯,得以解決 (3)基本問題做完時,字符顯示完整,添加附加任務(wù)后,字符顯示不全 未解決...1.4實(shí)驗(yàn)結(jié)果總結(jié) 實(shí)驗(yàn)結(jié)果(附照片) 總結(jié)(自己的收獲)1.5心得體會 #include 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf2[] = { 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 };unsigned char buf3[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf4[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf5[] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf6[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf7[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf8[] = { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff }; unsigned char r1[] = { 0xff,0xff };unsigned char r2[] = { 0xf0,0x0f };unsigned char r3[] = { 0xf0,0x0f };unsigned char r4[] = { 0xff,0xff }; unsigned char c1[] = { 0x0f,0xf0 };unsigned char c2[] = { 0xf0,0x0f };unsigned char c3[] = { 0xf0,0x0f };unsigned char c4[] = { 0x0f,0xf0 };void SysTick_Handler(void){ Event = 1;} void printX(){ } int main(){ int count = 0,i,Light=0,x=0,z=0,y=0,zz=0,yy=0,c=0,cc=0,a=0,aa=0;unsigned char buf[5]; //存(數(shù)字)字符串 unsigned char name[20] = “";unsigned char number[20] = ”“;SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ);RIT128x96x4Init(1000000);RIT128x96x4Clear(); 串 SysTickPeriodSet(SysCtlClockGet()/ 10); //調(diào)頻率 SysTickEnable();SysTickIntEnable();while(1){ if(Event){ RIT128x96x4Clear(); Event = 0; sprintf(buf,”%3i“,count); //通過sprintf將數(shù)字轉(zhuǎn)換為字符 | if(Light >= 15) { Light=0; } else { Light++;} RIT128x96x4StringDraw(name, 50, 55, 15-Light);RIT128x96x4StringDraw(number, 50, 65, Light);sprintf(buf,”%d",count);;RIT128x96x4StringDraw(buf, 50, 75, 12); count++;if(count>=200){ count=0;} RIT128x96x4ImageDraw(buf2,(int)(x*0.50), 5, 20, 1);RIT128x96x4ImageDraw(buf3,(int)(x*0.50), 7, 20, 1);RIT128x96x4ImageDraw(buf4,(int)(x*0.50), 9, 20, 1);RIT128x96x4ImageDraw(buf5,(int)(x*0.50), 11,20, 1);RIT128x96x4ImageDraw(buf6,(int)(x*0.50), 13, 20, 1);RIT128x96x4ImageDraw(buf7,(int)(x*0.50), 15, 20, 1);RIT128x96x4ImageDraw(buf8,(int)(x*0.50), 17, 20, 1);RIT128x96x4ImageDraw(buf1, 0, 20,(int)(x*0.60), 1);RIT128x96x4ImageDraw(c1,(int)(60+c*1.20),(int)(5+a*0.85), 4, 1);RIT128x96x4ImageDraw(c2,(int)(60+c*1.20),(int)(7+a*0.85), 4, 1);RIT128x96x4ImageDraw(c3,(int)(60+c*1.20),(int)(9+a*0.85), 4, 1);RIT128x96x4ImageDraw(c4,(int)(60+c*1.20),(int)(11+a*0.85), 4, 1);RIT128x96x4ImageDraw(r1,(int)(z*0.30),(int)(50+y*0.20), 4, 1);RIT128x96x4ImageDraw(r2,(int)(z*0.30),(int)(52+y*0.20), 4, 1);RIT128x96x4ImageDraw(r3,(int)(z*0.30),(int)(54+y*0.20), 4, 1);RIT128x96x4ImageDraw(r4,(int)(z*0.30),(int)(56+y*0.20), 4, 1);if(x<=200&&x>=0) //直線 { x++;} if(x>=200){ x=0;} if(c<=50&&c>=-50) //圓形循環(huán) { if(cc==0)c++; if(cc==1)c--;} if(c>=50){ cc=1;} if(c<=-50){ cc=0;} if(a<=100&&a>=0){ if(aa==0)a++; if(aa==1)a--;} if(a>=100){ aa=1;} if(x<=0){ aa=0;} if(y<=200&&y>=0){ if(yy==0)y++; if(yy==1)y--;} if(y>=200){ yy=1;} if(y<=-200){ yy=0;} if(z<=400&&z>=0){ if(zz==0)z++; if(zz==1)z--;} if(z>=400){ zz=1;} if(z<=0){ //矩形反彈 } zz=0; } } } return 0; 南昌航空大學(xué)實(shí)驗(yàn)報告 二0一一 年 10月 16日 課程名稱: 嵌入式系統(tǒng) 實(shí)驗(yàn)名稱: 串行端口程序設(shè)計(jì) 班 級: 080611 學(xué)生姓名: 曹啟斌 學(xué)號: 08061107 指導(dǎo)教師評定: 簽名: 一、實(shí)驗(yàn)?zāi)康?了解在linux環(huán)境下串行程序設(shè)計(jì)的基本方法。掌握終端的主要屬性及設(shè)置方法,熟悉終端IO函數(shù)的使用。3 學(xué)習(xí)使用多線程來完成串口的收發(fā)處理。 二、實(shí)驗(yàn)內(nèi)容 讀懂程序源代碼,學(xué)習(xí)終端IO函數(shù)tcgetattr(), tcsetattr(),tcflush()的使用方法,學(xué)習(xí)將多線程編程應(yīng)用到串口的接收和發(fā)送程序設(shè)計(jì)中。 三、預(yù)備知識 1、有C語言基礎(chǔ)。 2、掌握在LINUX下常用編輯器的使用。 3、掌握Makefile 的編寫和使用。 4、掌握Linux下的程序編譯與交叉編譯過程 四、實(shí)驗(yàn)設(shè)備及工具 硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)儀,PC機(jī)pentumn500以上, 硬盤40G以上,內(nèi)存大于128M。 軟件:PC機(jī)操作系統(tǒng)REDHAT LINUX 9.0 +MINICOM + AMRLINUX開發(fā)環(huán)境 五、實(shí)驗(yàn)原理 Linux 操作系統(tǒng)從一開始就對串行口提供了很好的支持,為進(jìn)行串行通訊提供了大量的函數(shù),我們的實(shí)驗(yàn)主要是為掌握在LINUX中進(jìn)行串行通訊編程的基本方法。 1.程序流程圖 程序流程圖如圖2-3所示: 圖2-3 程序流程圖 2串口操作需要的頭文件 #include /*線程庫定義*/ 3打開串口 在 Linux 下串口文件是位于 /dev 下,串口一為/dev/ttyS0,串口二為 /dev/ttyS1,打開串口是通過使用標(biāo)準(zhǔn)的文件打開函數(shù)操作: int fd;/*以讀寫方式打開串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示錯誤!”);} 4設(shè)置串口 最基本的設(shè)置串口包括波特率設(shè)置,效驗(yàn)位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置 struct termios 結(jié)構(gòu)體的各成員值。 struct termio { unsigned short c_iflag;/* 輸入模式標(biāo)志 */ unsigned short c_oflag;/* 輸出模式標(biāo)志 */ unsigned short c_cflag;/* 控制模式標(biāo)志 */ unsigned short c_lflag;/* local mode flags */ unsigned char c_line;/* line discipline */ unsigned char c_cc[NCC];/* control characters */ };設(shè)置這個結(jié)構(gòu)體很復(fù)雜,可以參考man手冊或者由趙克佳、沈志宇編寫的《UNIX程序編寫教程》,我這里就只考慮常見的一些設(shè)置: 波特率設(shè)置: 下面是修改波特率的代碼: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*設(shè)置為19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校驗(yàn)位和停止位的設(shè)置: 無效驗(yàn) 8位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效驗(yàn)(Odd)7位 Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效驗(yàn)(Even)7位 Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效驗(yàn) 7位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;設(shè)置停止位: 1位: options.c_cflag &= ~CSTOPB;2位: options.c_cflag |= CSTOPB;需要注意的是,如果不是開發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來處理,那么使用原始模式(Raw Mode)方式來通訊,設(shè)置方式如下: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/ options.c_oflag &= ~OPOST;/*Output*/ 5讀寫串口 設(shè)置好串口之后,讀寫串口就很容易了,把串口當(dāng)作文件讀寫就可以了。發(fā)送數(shù)據(jù): char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)讀取串口數(shù)據(jù): 使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。 可以使用操作文件的函數(shù)來實(shí)現(xiàn)異步讀取,如fcntl,或者select等來操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6關(guān)閉串口 關(guān)閉串口就是關(guān)閉文件。close(fd);7空MODEM通訊連接電纜 一般進(jìn)行串口調(diào)試使用空MODEM連接電纜,其接線方式如下圖2-4所示: 圖2-4 實(shí)用RS-232C通訊連線 六、實(shí)驗(yàn)步驟 1.2.3.4.進(jìn)入expbasic
主站蜘蛛池模板:
精品无码免费专区毛片|
久久综合88熟人妻|
日本看片一二三区高清|
国产国产久热这里只有精品|
水蜜桃av无码|
国产麻豆剧果冻传媒一区|
国产色视频自在线观看|
色视频综合无码一区二区三区|
狠狠噜天天噜日日噜视频麻豆|
国产人妻人伦精品1国产丝袜|
国产亚洲精品无码专区|
夜夜天天噜狠狠爱2019|
男女一边摸一边做爽爽的免费阅读|
国产成人高清亚洲明星一区|
亚洲精品乱码8久久久久久日本|
韩国主播av福利一区二区|
国产mv在线天堂mv免费观看|
中文字幕有码无码人妻av蜜桃|
国产精品欧美福利久久|
一品道高清一区二区|
无码超乳爆乳中文字幕久久|
国产亚洲精品久久久久蜜臀|
婷婷五月六月激情综合色中文字幕|
欧美日韩精品久久久免费观看|
狠狠躁天天躁无码中文字幕图|
国产熟妇的荡欲午夜视频|
久久av老司机精品网站导航|
日韩好片一区二区在线看|
国产又大又黑又粗免费视频|
色欲色香天天天综合vvv|
日韩人妻无码一本二本三本|
熟女丰满老熟女熟妇|
国产性生大片免费观看性|
亚洲色成人中文字幕网站|
欧美精品|
99热这里有精品|
色翁荡息又大又硬又粗又视频软件|
久久国产avjust麻豆|
亚洲精品区午夜亚洲精品区|
在线视频 一区 色|
精品超清无码视频在线观看|
第二篇:嵌入式系統(tǒng)原理實(shí)驗(yàn)總結(jié)報告
第三篇:嵌入式實(shí)驗(yàn)總結(jié)
第四篇:嵌入式實(shí)驗(yàn)二
第五篇:嵌入式實(shí)驗(yàn)2