第一篇:電子科技大學微機實驗報告 實驗5
實驗五 基于ARM的模塊方式驅動程序實驗 【實驗目的】 1.掌握Linux 系統下設備驅動程序的作用與編寫技巧 2.掌握Linux 驅動程序模塊加載和卸載的方法 3.了解Linux 內核中的makefile和kconfig文件
【實驗內容】
1.基于s3c2440 開發板編寫led 驅動程序。2.將編寫好的led驅動加入linux內核中,修改makefile和kconfig文件,配置和編譯內核。3.編寫關于led 的測試程序,交叉編譯后運行,控制led 燈的亮滅。
【預備知識】
1.了解ARM9處理器結構和Linux 系統結構
2.熟練掌握C語言。
【實驗設備和工具】
? 硬件:ARM嵌入式開發平臺,PC機Pentium100 以上。
? 軟件:PC機Linux操作系統+MINICOM+AMRLINUX 開發環境
【實驗原理】
?
linux設備驅動程序 ? 驅動的模塊式加載和卸載
? 編譯模塊
? 裝載和卸載模塊
? led 驅動的原理
在本開發板上有八個led指示燈,從下往上分別為LED0-LED7。這八個led燈都是接的芯片上的gpio口(通用功能輸入輸出口)。在本實驗的開發板硬件設計中,當led 燈對應的gpio的電平為低時,led燈被點亮;當led燈對應的gpio的電平為高時,led燈滅。本驅動的作用就是通過設置對應gpio口的電平來控制led 的亮滅。
因為ARM 芯片內的GPIO口都是復用的,即它可以被配置為多種不同的功能,本實
驗是使用它的普通的I/O口的輸出功能,故需要對每個GPIO口進行配置。在內核中已經定義了對GPIO口進行配置的函數,我們只需要調用這些函數就可以完成對GPIO口的配置。
【實驗步驟】實驗程
序運行效果:
程序會提示:“pleaseenterthe led status”
輸入與希望顯示的led狀態對應的ledstatus值(輸入十進制值即可),觀察led 的顯示情況。例如:
? 輸入數字“3”,對應的二進制數字為00000011
故點亮LED2~LED7
? 輸入數字“4”,對應的二進制數字為00000100
故點亮LED0,LED1,LED3~LED7
【實驗結果和程序】
C語言程序:
#include
static intLedMajor=231;
staticintLedMinor=0;
static charledstatus=0xff;staticstructclass*s3c2440_class;staticstructcdev *s3c2440_led_cdev;
/*
******************************************************************************* ************************
** Function name:Update_led()**Descriptions **Input :NONE **Output :NONE :update the led status
******************************************************************************* ************************
*/ staticvoid Update_led(void)
{
if(ledstatus&0x01)
s3c2410_gpio_setpin(S3C2410_GPC7,1);//LED0滅
else
s3c2410_gpio_setpin(S3C2410_GPC7,0);//LED0亮
if(ledstatus&0x02)
s3c2410_gpio_setpin(S3C2410_GPC5,1);//LED1滅
else
s3c2410_gpio_setpin(S3C2410_GPC5,0);//LED1亮
if(ledstatus&0x04)
s3c2410_gpio_setpin(S3C2410_GPH9,1);//LED2滅
else
s3c2410_gpio_setpin(S3C2410_GPH9,0);//LED2亮
if(ledstatus&0x08)
s3c2410_gpio_setpin(S3C2410_GPB4,1);//LED3滅
else
s3c2410_gpio_setpin(S3C2410_GPB4,0);//LED3亮
if(ledstatus&0x10)
s3c2410_gpio_setpin(S3C2410_GPG5,1);//LED4滅
else
s3c2410_gpio_setpin(S3C2410_GPG5,0);//LED4亮
if(ledstatus&0x20)
s3c2410_gpio_setpin(S3C2410_GPG6,1);//LED5滅
else
s3c2410_gpio_setpin(S3C2410_GPG6,0);//LED5亮
if(ledstatus&0x40)
s3c2410_gpio_setpin(S3C2410_GPG7,1);//LED6滅elses3c2410_gpio_setpin(S3C2410_GPG7,0);//LED6亮
if(ledstatus&0x80)
s3c2410_gpio_setpin(S3C2410_GPG8,1);//LED7滅
else
s3c2410_gpio_setpin(S3C2410_GPG8,0);//LED7亮
}
staticssize_ts3c2440_Led_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){
copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
Update_led();
printk(“write: led=0x%x,count=%dn”,ledstatus,count);returnsizeof(ledstatus);} staticints3c2440_Led_open(structinode*inode,struct file *filp)
{
printk(“led device openn”);
return 0;
} staticints3c2440_Led_release(structinode*inode,struct file*filp)
{
printk(“led device releasen”);
return 0;} staticstructfile_operationss3c2440_fops={.owner=THIS_MODULE,.open=s3c2440_Led_open,.write=s3c2440_Led_write,.release=s3c2440_Led_release, };
staticintinits3c2440_Led_init(void)
{
dev_ts3c2440_leds_devno;
/*configure the gpiofor leds*/
s3c2410_gpio_cfgpin(S3C2410_GPG5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG8,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPH9,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPB4,S3C2410_GPIO_OUTPUT);
Update_led();/*registerthe devnumber*/ s3c2440_leds_devno=MKDEV(LedMajor,LedMinor);ret=register_chrdev_region(s3c2440_leds_devno, 1,DEVICE_NAME);
/*registerthe chardevice*/
s3c2440_led_cdev=cdev_alloc();if
(s3c2440_led_cdev!= NULL)
{ cdev_init(s3c2440_led_cdev, &s3c2440_fops);s3c2440_led_cdev->owner=THIS_MODULE;if(cdev_add(s3c2440_led_cdev, s3c2440_leds_devno, 1))
printk(KERN_NOTICE “Something wrong when addings3c2440_led_cdev!n”);
else
printk(“Success addings3c2440_led_cdev!n”);} /*create the device node in /dev*/ s3c2440_class =class_create(THIS_MODULE, “led_class”);class_device_create(s3c2440_class, NULL, s3c2440_leds_devno, NULL, DEVICE_NAME);
printk(DEVICE_NAME “ initializedn”);
return 0;
}
staticvoid exits3c2440_Led_exit(void)
cdev_del(s3c2440_led_cdev);class_device_destroy(s3c2440_class, MKDEV(LedMajor,LedMinor));class_destroy(s3c2440_class);printk(DEVICE_NAME “ removedn”);
}
module_init(s3c2440_Led_init);
module_exit(s3c2440_Led_exit);
【思考題】
1.設備驅動程序的功能是什么?答:設備驅動的功能就是將系統提供的調用映射到作用于實際硬件的和設備相關的操作上。
2.模塊化的最大優點是什么?答:可以在系統正在運行著的時候給內核增加模塊
提供的功能(也可以移除功能)。
3.如果在驅動模塊中刪除module_exit(s3c2440_Led_exit);后會有什么影響?
答:這個模塊將不能被移除。
4.驅動代碼中調用的宏MKDEV 的作用是什么?答:獲取設備在設備表中的位置。輸入主設備號,從設備號,返回位置號。
【實驗結論】
本實驗實現了linux環境下的led燈驅動的添加。
第二篇:電子科技大學微機實驗報告 實驗4
實驗四基于ARM的嵌入式Linux開發環境建立 【實驗目的】 1.掌握嵌入式Linux 開發環境的基本流程。2.熟悉Linux 操作系統 3.熟悉嵌入式開發平臺
【實驗內容】
在PC機虛擬機下的Linux系統中建立基于ARM 的嵌入式Linux 開發環境。
1.學會網口的配置 2.Minicom端口的使用
【預備知識】
1.了解ARM9處理器結構 2.了解Linux 系統結構
3.了解ARM開發板使用常識
【實驗設備和工具】
硬件:PC機Pentium100以上,ARM嵌入式開發平臺
軟件:PC機Linux 操作系統+MINICOM+AMRLINUX開發環境
【實驗原理】
1.交叉編譯器在一種計算機環境中運行的編譯程序,能編譯出在另外一種環境下運行的代碼,我們就稱這種編譯器支持交叉編譯,這個編譯過程就叫交叉編譯。簡單地說,就是在一個平臺上生成另一個平臺上的可執行代碼。這里需要注意的是所謂平臺,實際上包含兩個概念:體系結構
(Architecture)、操作系統(OperatingSystem)。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 Linux平臺實際上是Intelx86體系結構和Linuxforx86操作系統的統稱;而x86WinNT平臺 實際上是Intelx86體系結構和Windows NTforx86操作系統的簡稱。交叉編譯這個概念的出現和流行是和嵌入式系統的廣泛發展同步的。我們常用的計算機軟
件,都需要通過編譯的方式,把使用高級計算機語言編寫的代碼(比如C代碼)編譯(compile)成計算機可以識別和執行的二進制代碼。比如,我們在Windows平臺上,可使用Visual C++ 開發環境,編寫程序并編譯成可執行程序。這種方式下,我們使用PC平臺上的Windows工具開發針對Windows本身的可執行程序,這種編譯過程稱為nativecompilation,中文可理解
為本機編譯。然而,在進行嵌入式系統的開發時,運行程序的目標平臺通常具有有限的存儲空間和運算能力,比如常見的ARM平臺,其一般的靜態存儲空間大概是16到32MB,而CPU 的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilationtoolchain)需要很大的存儲空間,并需要很強 的CPU運算能力。為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、存儲空間足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執行程序。
要進行交叉編譯,我們需要在主機平臺上安裝對應的交叉編譯工具鏈(crosscompilation tool-chain),然后用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標平臺上運行的代碼。常見的交叉編譯例子如下:
1、在WindowsPC上,利用RVDS(ARM開發環境),使用armcc編譯器,則可編譯出針對ARMCPU的可執行代碼。
2、在LinuxPC上,利用arm-linux-gcc編譯器,可編譯出針對LinuxARM平臺的可執行代碼。
3、在Windows PC上,利用cygwin環境,運行arm-elf-gcc編譯器,可編譯出針對ARMCPU的可執行代碼。
2.NFS服務
NFS是Net FileSystem的簡寫,即網絡文件系統.網絡文件系統是FreeBSD支持的文件系統中的一種,也被稱為NFS.NFS允許一個系統在網絡上與它人共享目錄和文件。通過使用NFS,用戶和程序可以像訪問本地文件一樣訪問遠端系
統上的文件。
NFS至少有兩個主要部分:一臺服務器和一臺(或者更多)客戶機。客戶機遠程訪問存放在服務器上的數據。為了正常工作,一些進程需要被配置并運行。
在本實驗中就是將PC機作為服務器,而將ARM開發板作為客戶機,這樣ARM開發板就可以遠程
訪問存放在在PC機上的數據,這樣可以縮短研發周期,更方便的調試程序。
【實驗步驟】
1.雙擊桌面上VMWARE,打開Linux 虛擬機 2.點擊啟動虛擬機,啟動虛擬機 3.以root身份登陸虛擬機,密碼123456
4.其他步驟詳見實驗指導書
【實驗結果和程序】
基于ARM 的嵌入式Linux開發環境建立完畢。
【思考題】
1.如何驗證交叉編譯器已安裝成功? 答:在終端輸入命令:cd/arm/rootfs/home/driver(文件夾里已有test_led.c文件)arm-linux-gcc–o test_ledtest_led.c
若有可執行文件test_led生成則表示交叉編譯器已安裝成功
2.如果我們需要變更根文件系統的目錄,該如何設置使得ARM開發板可以成功掛載?答:修改/etc/exports 文件的內容,將/arm/rootfs*(rw,sync,no_root_squash)改為/XX/XXX
*(rw,sync,no_root_squash)(/XX/XXX為變更后點的文件目錄)
3.怎么在u-boot命令行下修改ARM 開發板的IP?
答:輸入setenvip=x.x.x.x:192.168.0.1:192.168.0.1:255.255.255.0:uestc:eth0:off
Saveenv
x,x,x,x為ARM開發板的新IP。
【實驗結論】
本實驗實現了基于ARM 的嵌入式Linux 開發環境建立
第三篇:電子科技大學實驗報告格式
九、實驗結論:
十、總結及心得體會:
十一、對本實驗過程及方法、手段的改進建議:
報告評分:
指導教師簽字: 電子科技大學
學生姓名:學
號:指導教師:日
期:實 驗 報 告
****年**月**日
一、實驗室名稱:
二、實驗項目名稱:
三、實驗原理:
四、實驗目的:
五、實驗內容:
六、實驗器材(設備、元器件):
七、實驗步驟:
八、實驗數據及結果分析:
第四篇:電子科技大學實驗報告格式
九、實驗結論:
十、總結及心得體會:
十一、對本實驗過程及方法、手段的改進建議:
報告評分:指導教師簽字:
電子科技大學
學生姓名:
學號:
指導教師:
日期:實 驗 報 告年月日
一、實驗室名稱:
二、實驗項目名稱:
三、實驗原理:
四、實驗目的:
五、實驗內容:
六、實驗器材(設備、元器件):
七、實驗步驟:
八、實驗數據及結果分析:
第五篇:北京科技大學微機原理實驗報告
微機原理及應用實驗報告
學院: 班級: 學號: 姓名:
微機實驗報告書(Ⅰ)學號:姓名:班級: 同組名單:實驗日期:
實驗題目:8253可編程定時器計數器
實驗目標:掌握8253的基本工作原理和編程方法 實驗步驟:
連接電路圖
如圖虛線連接電路,將計數器0設置為方式0,計數器初值為N(N<=0FH),用手動逐個輸入單脈沖,編程使計數值在屏幕上顯示,并同時用邏輯筆觀察OUT0電平變化(當輸入N+1個脈沖后OUT0變高電平)。程序框圖:
程序清單:
;*************************;;* 8253方式0計數器實驗 *;;*************************;IOPORT
EQU
0C800H-0280H
IO8253A EQU
IOPORT+283H
IO8253B EQU
IOPORT+280H
CODE SEGMENT
ASSUME
CS:CODE
START: MOV
AL,00010000B
;設置8253工作方式
MOV
DX,IO8253A
OUT
DX,AL
MOV
DX,IO8253B
;送計數初值為0FH
MOV
AL,0FH
OUT
DX,AL
LLL: IN
AL,DX
;讀計數初值
CALL
DISP
;調顯示子程序
PUSH
DX
MOV
AH,06H
MOV
DL,0FFH
INT
21H
POP
DX
JZ
LLL
;跳轉到LLL
MOV
AH,4CH
;退出
INT
21H
DISP PROC
NEAR
;顯示子程序
PUSH
DX
AND
AL,0FH
;首先取低四位
MOV
DL,AL
CMP
DL,9
;判斷是否<=9
JLE
NUM
;若是則為'0'-'9',ASCII碼加30H
ADD
DL,7
;否則為'A'-'F',ASCII碼加37H
NUM: ADD
DL,30H
MOV
AH,02H
;顯示
INT
21H
MOV
DL,0DH
;加回車符
INT
21H
MOV
DL,0AH
;加換行符
INT
21H
POP
DX
RET
;子程序返回
DISP ENDP
CODE ENDS
END
START 運行結果:
每輸入一個單脈沖,屏幕上的數值減1,從15減到0后(撥動16次后),檢測到OUT0輸出由低電平變為高電平。小結(體會與收獲):
通過預習和實驗,學會了 8253 芯片和微機接口原理和方法,掌握 8253 定時器/計數器的基本工作原理、工作方式和編程原理,熟悉了匯編代碼的編寫。實驗中,連接電路,利用代碼控制實驗電路,深對了課本理論的理解。
由于是第一次實驗,進程比較緩慢,所以僅進行了8253可編程定時器/計數器的一個實驗,下次實驗會熟練一些。
微機實驗報告書(Ⅱ)
學號:姓名:班級: 同組名單:實驗日期:
實驗題目:1.8253可編程定時器計數器
2.8255可編程并行接口(方式0)3.七段數碼管
實驗目標:1.掌握8253的基本工作原理和編程方法
2.掌握8255方式0的工作原理及使用方法 3.掌握數碼管顯示數字的原理
實驗步驟: 實驗一:
連接電路圖
按上圖連接電路,將計數器0、計數器1分別設置為方式3,計數初值設為1000,用邏輯筆觀察OUT1輸出電平的變化(頻率1HZ)。實驗二:
連接電路圖
1)實驗電路如圖,8255C口接邏輯電平開關K0~K7,A口接LED顯示電路L0~L7。
2)編程從8255C口輸入數據,再從A口輸出。實驗三:
連接電路圖
靜態顯示:按圖連接好電路,將8255的A口PA0~PA6分別與七段數碼管的段碼驅動輸入端a~g相連,位碼驅動輸入端S1接+5V(選中), S0、dp接地(關閉)。編程從鍵盤輸入一位十進制數字(0~9),在七段數碼管上顯示出來。程序框圖: 實驗一:
實驗二:
實驗三:
程序清單: 實驗一:
;*******************;* 8253分頻 *;******************* IOPORT EQU
0C800H-0280H
IO8253A EQU
IOPORT+283H
IO8253B EQU
IOPORT+280H
IO8253C EQU
IOPORT+281H
CODE SEGMENT
ASSUME
CS:CODE
START: MOV
DX,IO8253A;向8253寫控制字
MOV
AL,36H
;工作方式
OUT
DX,AL
MOV
AX,1000
;寫入循環計數初值1000
MOV
DX,IO8253B
OUT
DX,AL
;先寫入低字節
MOV
AL,AH
OUT
DX,AL
;后寫入高字節
MOV
DX,IO8253A
MOV
AL,76H
;設工作方式
OUT
DX,AL
MOV
AX,1000
;寫入循環計數初值1000
MOV
DX,IO8253C
OUT
DX,AL
;先寫低字節
MOV
AL,AH
OUT
DX,AL
;后寫高字節
MOV
AH,4CH
;程序退出
INT
21H
CODE ENDS
END
START
實驗二:
;*************************;;* 8255A的基本輸入輸出 *;;*************************;IOPORT EQU 0C800H‐280H IO8255A EQU IOPORT+288H IO8255B EQU IOPORT+ 28BH IO8255C EQU IOPORT+28AH CODE SEGMENT ASSUME CS:CODE START: MOV DX,IO8255B;對 8255 進行設定,A 輸出,C 輸入
MOV AL,10001001B
OUT DX,AL INPUT: MOV DX,IO8255C;從 C 輸入
IN AL,DX
MOV DX,IO8255A;從 A 輸出
OUT DX,AL
MOV DL,0FFH;判斷是否有按鍵
MOV AH,06H
INT 21H
JZ INPUT;若無,則繼續 C 輸入,A 輸出
MOV AH,4CH;否則,返回 DOS
INT 21H CODE ENDS END START 實驗三:
;************************************;;*鍵盤輸入數據(0-9)控制LED數碼管顯示*;;************************************;
DATA
SEGMENT
IOPORT
EQU
0C800H-280H IO8255A
EQU
IOPORT+288H IO8255B
EQU
IOPORT+28BH IO8255C
EQU
IOPORT+28AH
LED
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
MESG1
DB
0DH,0AH,'Input a num(0--9),other key is exit:',0DH,0AH,'$' DATA
ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:
MOV
AX,DATA
MOV
DS,AX
MOV
DX,IO8255B
;使 8255 的A口為輸出方式
MOV
AX,10000000B
OUT
DX,AL
SSS:
MOV
DX,OFFSET MESG1
;顯示提示信息
MOV
AH,09H
INT
21H
MOV
AH,01
;從鍵盤接收字符
INT
21H
CMP
AL,30H
;是否小于 0
JL
EXIT
;若是則退出
CMP
AL,39H
;是否大于9
JG
EXIT
;若是則退出
SUB
AL,30H
;將所得字符的 ASCII 碼減 30H
MOV
BX,OFFSET LED
;BX為數碼表的起始地址
XLAT
;求出相應的段碼
MOV
DX,IO8255A
;從 8255 的A口輸出
OUT
DX,AL
JMP
SSS
;轉 SSS EXIT:
MOV
AH,4CH
;返回
INT
21H CODE
ENDS
END
START;
運行結果: 實驗一:
8253通道0和通道1均工作在方式3,計數初值均為1000。通道0的時鐘輸入為1MHz標準脈沖,產生1000Hz的方波;通道1以通道0輸出的1000Hz方波脈沖為輸入,產生1Hz的方波。用邏輯筆發現,OUT1 輸出電平呈規律性高低變化(顯示燈閃爍),時間間隔為 1s,說明輸出頻率為 1Hz,實現計時器功能。實驗二:
當邏輯開關K0~K7中的一個或幾個打開時,對應的LED燈就會亮起來,即利用8255A實現了基本的輸入輸出控制。實驗三:
靜態顯示:當從鍵盤輸入0~9任一數字時,七段數碼管上便 會顯示相應的數字,按下其他按鍵則退出程序。小結(體會和收獲):
通過本次實驗,進一步了解了8253可編程定時器/計數器;鞏固了可編程并行接口8255的基本知識點,了解了該芯片的應用。通過編程實現,熟悉了8255方式控制字,了解了方式0和基本工作原理。通過這三次實驗的學習,對于可編程接口芯片有了更深的認識,掌握了基本的微機接口方法。
在實驗過程中要細心,當編譯、鏈接或者運行的時候遇到錯誤的時候,要仔細檢查程序的輸入是否正確,很容易輸錯字母數字。
微機實驗報告書(Ⅲ)
學號:姓名:班級: 同組名單:實驗日期: 實驗題目:步進電機控制實驗
實驗目標:1.了解步進電機控制的基本原理
2.掌握控制步進電機轉動的編程方法
實驗步驟:
連接電路圖
1)按圖14連接線路,利用8255輸出脈沖序列,開關K0~K6控制步進電機轉速,K7控制步進電機轉向。8255 CS接288H~28FH。PA0~PA3接BA~BD;PC0~PC7接K0~K7。
2)編程:當K0~K6中某一開關為“1”(向上撥)時步進電機啟動。K7向上撥電機正轉,向下撥電機反轉。程序框圖:
程序清單:
;*******************************;;*
步進電機
*;;*******************************;
DATA
SEGMENT
IOPORT
EQU
0E400H-280H
IO8255A
EQU
IOPORT+288H
;8255A 輸出端口
IO8255B
EQU
IOPORT+ 28BH
;8255B 控制端口
IO8255C
EQU
IOPORT+ 28AH
;8255C 輸入端口
BUF
DB
0
MES
DB
'K0-K6 ARE SPEED CONTROL',0AH,0DH
DB
'K6 IS THE LOWEST SPEED ',0AH,0DH
DB
'K0 IS THE HIGHEST SPEED',0AH,0DH
DB
'K7 IS THE DIRECTION CONTROL',0AH,0DH,'$'
DATA
ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,CS
MOV
DS,AX
MOV
AX,DATA
MOV
DS,AX
MOV
DX,OFFSET MES
MOV
AH,09
INT
21H
MOV
DX,IO8255B
MOV
AL, 10001001B
OUT
DX,AL
;8255 C輸入, A 輸出
MOV
BUF,33H
OUT1:
MOV
AL,BUF
MOV
DX,IO8255A
OUT
DX,AL
PUSH
DX
MOV
AH,06H
MOV
DL,0FFH
INT
21H
POP
DX
JE
IN1
MOV
AH,4CH
INT
21H
IN1:
MOV
DX,IO8255C
IN
AL,DX
;輸入開關狀態
TEST
AL,01H
JNZ
K0
TEST
AL,02H
JNZ
K1
TEST
AL,04H
JNZ
K2
TEST
AL,08H
JNZ
K3
TEST
AL,10H
JNZ
K4
TEST
AL,20H
JNZ
TEST
JNZ
STOP:
MOV
MOV
JMP
K0:
MOV
SAM:
TEST
JZ
JMP
K1:
MOV
JMP
SAM
K2:
MOV
JMP
K3:
MOV
JMP
K4:
MOV
JMP
K5:
MOV
JMP
K6:
MOV
JMP
SAM
ZX0:
CALL
MOV
ROR
MOV
JMP
NX0:
CALL
MOV
ROL
MOV
JMP
DELAY
PROC
DELAY1:
MOV
DELAY2:
LOOP
K5
AL,40H K6
DX,IO8255C AL,0FFH
OUT1
BL,40H
AL,80H ZX0 NX0
BL,50H
BL,70H
SAM
BL,80H SAM
BL,0A0H SAM
BL,0C0H SAM
BL,0FFH
DELAY
AL,BUF
AL,1
BUF,AL OUT1
DELAY
AL,BUF
AL,1
BUF,AL OUT1
NEAR
CX,0FFFFH
DELAY2
DEC
BL
JNZ
DELAY1
RET
DELAY
ENDP
CODE
ENDS
END
START 運行結果:
當K0~K6中任意一開關向上撥時步進電機啟動,且K1速度最快,K6速度最慢;當K7向上撥電機正轉,向下撥電機反轉。當鍵盤中有任意鍵輸入的時候則程序終止。小結(收獲與體會):
實驗和理論是相互檢驗,相互補充和相互促進的,在實際動手動腦運用理論知識的時候,能更深入地領會概念,熟練運用,在此基礎上方能進行創新和自由發揮。通過本次實驗,我了解了步進電機控制的基本原理,掌握了控制步進電機轉動的編程方法。更加深入地了解了微機原理這門課程。