51单片机实验合集

实验一 多字节十进制加法程序设计

一.实验目的:

1.熟悉仿真器的软件使用环境及单片机汇编语言编程;

2.掌握多字节十进制加法的程序设计及实现方法。

二.实验内容:

编写多字节十进制加法程序,实现下式运算 :

         4574+6728=11302

要求:被加数在片内RAM区20H、21H单元;分别为学号(7),学号+1(8);

      加数在片内RAM区30H、31H单元;分别为学号+2(9),学号+3(10);

         结果在片内RAM区20H(最高位进位)、21H(高位)、22H(低位)单元。

三.实验步骤:

1.开机启动Keil C51软件进入μVision2 集成开发环境,确认89C51处于软件仿真状态。

2.完成程序的设计、编辑、编译、连接。

3.进入DEBUG方式,打开存储器Memory 1窗口,在窗口Address栏键入D:20H;点击鼠标右键,选择最后一项Modify Memory ,输入被加数;在窗口Address栏键入D:30H;点击鼠标右键,选择最后一项Modify Memory ,输入加数。

4.调试和运行程序并记录存储器Memory 1窗口实验结果。

四.实验参考程序:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN: MOV A,20H

ADD A,30H

DA A

MOV 22H,A

MOV A,21H

ADDC A,31H

DA A

MOV 21H,A

CLR A

MOV R3,00H

ADDC A,R3

MOV 20H,A

SJMP $

END

五.实验截图:

 

 

 

实验总结:学会了多字节十进制加法程序设计,对keilc51有了更为熟练地掌握,也对程序有了更为深入的了解,课堂所学的理论以及一些不清楚的地方在实验中得到了答案。

 

 

 

实验三 P1口输出实验

 

一.实验目的:

 

1.掌握P1口输出端口的使用原理及编程方法;

 

2.加深I/O端口对外部电路驱动原理的理解。

 

二.实验内容:

 

P1口做输出,驱动8只发光二极管,编写程序,以1s的时间间隔使得一个发光二极管从左到右循环点亮。

 

三.实验步骤:

 

1.理解P1口内部结构,掌握P1口输出高低电平的原理。

 

2.看懂实验电路,完成接口连线(注意,接线时需要关闭实验箱电源)。

 

 

 

3.编写控制程序,注意延时循环的时间控制在1s

 

4.进入DEBUG方式,打开I/O口查看工具,监视P1口的输出变化。调试程序并观察发光二极管点亮情况。

 

 

四.实验参考程序:

 

ORG 0000H

 

SJMP MAIN

 

ORG 0030H

 

MAIN: MOV P2,#0FEH

 

LOOP: ACALL DELAY

 

MOV A,P2

 

RL A

 

MOV P2,A

 

AJMP LOOP

 

 

 

DELAY:

 

MOV R3,#100

 

DELAY2: MOV R4,#100

 

DELAY3: MOV R5,#100

 

DELAY1: DJNZ R5,$

 

DJNZ R4,DELAY3

 

DJNZ R3,DELAY2

 

RET

 

END

 

;说明:P1口接发光二极管

 

实验结果:输入代码调试好,通过烧写器可以看见单片机上的二极管呈周期性点亮,改动数据能改变它点亮的时间间隔。实验结果如下图所示:

 

 

 

实验总结:这次实验中花了很多时间去看电路图以及去理解代码,调整代码,对keil uVision软件的使用并不是很熟练,初次使用烧写器没找到要烧入的文件忘记调芯片类型以及波特率,通过这次试验掌握了P1口输出端口的原理,也熟悉了代码程序的编写。

 

 

 

实验四 P口输入实验

 

一.实验目的:

 

1.掌握P3口输入端口的使用原理及编程方法;

 

2.加深I/O端口对外部电路驱动原理的理解。

 

二.实验内容:

 

通过手动按键K1-K3,循环读取P3.0-P3.3,并将结果显示在P2.0-P2.3LED上,按键观察读入的值变化。

 

三.实验步骤:

 

1.理解I/O口读取外部电平原理.

 

2.进入DEBUG方式,打开I/O口查看工具,监视P3口的输出变化。

 

4.生成HEX文件,烧入实验板,按键并观察发光二极管闪烁情况。

 

 

 

 

四.实验参考程序:

 

            ORG   0000H

 

   SJMP  0030H

 

   ORG   0030H

 

START:

 

LOOP:       MOV   C,P3.1

 

            MOV   P2.0,C            ;读按键K1显示在D1

 

   MOV   C,P3.0

 

   MOV   P2.1,C            ;读按键K2显示在D2

 

   MOV   C,P3.2

 

   MOV   P2.2,C            ;读按键K3显示在D3

 

 

 

   MOV   C,P3.3

 

   MOV   P2.3,C            ;读按键K4显示在D4

 

   

 

   SJMP  LOOP

 

   

 

   END

 

 

 

;说明:P2口接发光二极管

 

 

 

 

 

 

 

 

 

实验总结:最开始照搬老师的代码发现并无法实现按K1实现D1灯亮,按K2实现D2灯亮,自己仔细分析了一遍找到了两处需要更改的地方,经过更改最后顺利实现了通过手动按键实现相应的LED灯亮起,这次实验也加深了我对I/O口作用的理解。

 

 

 

实验五 外部中断实验

 

一.实验目的:

 

1.掌握51单片机中断原理及编程方法;

 

2.了解中断触发方式及中断优先级的概念。

 

二.实验内容:

 

通过手动按键产生负脉冲信号,K3控制输出的负脉冲信号加于INT0,K4控制输出的负脉冲加于INT1.主程序以1秒为间隔循环点亮响铃的两个LED程序,设置INT0为低优先级,当按K3键并释放按键后,发出中断信号,使得8个LED1秒为间隔“全亮-全灭”方式闪动10秒。

 

 

 

 

 

完成上述试验后,设置INT1的触发方式为边沿触发,优先级为高优先级,安东开关K4,产生负脉冲,INT1中断服务为高优先级,按动开关K4,长生负脉冲,INT1响应,以1秒为间隔循环点亮8LED。

 

三.实验步骤:

 

1.理解TCON寄存器中IT0 IT1的设置,IE和EA的正旗设置。

 

2.理解外部中断的触发原理.

 

2.进入DEBUG方式,打开I/O口查看工具,监视P3口的输出变化。

 

4.生成HEX文件,烧入实验板,按键并观察发光二极管闪烁情况。

 

 

四.实验参考程序:

 

ORG 0000H

 

LJMP MAIN

 

ORG 0003H

 

LJMP INT_0

 

ORG 0013H

 

LJMP INT_1

 

ORG 0030H

 

MAIN:

 

MOV SP,#07H

 

MOV A,#0FCH

 

SETB EA

 

SETB EX0

 

SETB EX1

 

SETB IT1

 

SETB PX1

 

 

 

 

 

LOOP:

 

MOV     P2,A

 

MOV     R2,#30

 

LCALL DLY

 

RL A

 

SJMP LOOP

 

 

 

INT_0:

 

PUSH ACC

 

PUSH PSW

 

SETB RS0

 

CLR     RS1

 

MOV     A,#00H

 

MOV     R3,#10

 

LOOP1:

 

MOV     P2,A

 

MOV     R2,#49

 

LCALL DLY

 

CPL     A

 

DJNZ R3,LOOP1

 

POP     PSW

 

POP     ACC

 

RETI

 

INT_1:

 

PUSH ACC

 

PUSH PSW

 

SETB RS1

 

SETB RS0

 

MOV     A,#07FH

 

MOV     R3,#8

 

LOOP2:

 

MOV     P2,A

 

MOV     R2,#49

 

LCALL DLY

 

RL     A

 

DJNZ R3,LOOP2

 

POP     PSW

 

POP     ACC

 

RETI

 

DLY: MOV     R0,#100

 

DLY1: MOV     R1,#100

 

 

 

DJNZ R1,$

 

DJNZ R0,DLY1

 

DJNZ R2,DLY

 

RET

 

END

 

 

 

;说明:P2口接发光二极管

 

五、实验过程

 

打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,先编写三个循环程序,一个是主程序以1秒为间隔循环点亮响铃的两个LED程序,一个是8个LED1秒为间隔“全亮-全灭”方式闪动10秒,一个是1秒为间隔循环点亮8LED,再设置好INT_0和INT_1调好他们触发方式以及优先级,让INT_1优先级高于INT_0,从而实现按K3实施INT_0中断服务,K4实施INT_1中断服务(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,按键并观察发光二极管闪烁情况。

 

六、实验结果

 

 

 

 

 

 

 

七、实验总结

 

在老师的指导下通过这次实验我了解了中断原理以及相应的编程,也了解了如何设置中断程序优先级和循环的问题,同时也对汇编语言的操作便有了更多的认识。

 

 

 

实验六 计数器实验

一.实验目的:

1.熟悉MCS-51单片机定时/计数器的外部计数原理;

2.进一步掌握定时/计数器的计数功能的初始化和编程方法。

二.实验内容:

模拟产品包装线上对物品件数的计数,假设每个包装箱10件物品,每个物品经过传送带时,光电传感器将发出一个脉冲信号,利用T0定时计数器对该脉冲进行计数,每计满19个物件,将箱数计数器加1,同时将箱数计数器的值以二进制的形式显示在8个LED发光二级管中。

光电传感器脉冲由实验仪器上的K3按键来模仿。

三.实验步骤:

1.理解TCON寄存器中IF0 IF1的设置,IE的EA和ET0的正确设置。

2.理解定时计数器的外部计数的触发原理.

2.编写汇编程序,并生成HEX文件,烧入实验板。

4.按键并保持100毫秒以上,模拟光电传感器的脉冲,记录按键次数,并观察发光二极管组的显示,验证其代表的计数(二进制形式)正确情况情况。

 

四.实验参考程序:

 ORG   0000H

 LJMP  MAIN

 ORG   0030H

MAIN:    MOV   TMOD,#0110B ;T0方式2,计数器方式

 MOV   TH0,#00F6H ;计数次数为10

 MOV   TL0,#00F6H

 MOV   R1,#0H

 SETB  TR0 ;启动计时器

;---------------------------------

;控制灯亮

LOOP:  MOV   A,R1

     CPL   A ;A取反

 MOV   P2,A ;控制灯亮

 MOV   C,P3.2

 CPL   C

 MOV   P3.4,C ;传递给P3.4

 JBC   TF0,NEXT ;查询溢出位,10个溢出一次

 LJMP  LOOP

;---------------------------------

;控制R1数值并在LOOP中令A取反控制灯亮

NEXT:    

 INC   R1

 LJMP  LOOP

 END

 

;说明:P2口接发光二极管

五、实验过程

打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,计数器方式采用T0方式2,根据计数次数为10计算出2^8-10=246即00F6H,根据要求写好主程序与循环程序(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,持续按动按键K3并观察发光二极管闪烁情况。

六、实验结果:

 

七、实验总结

通过实验熟悉了单片机定时的外部计数原理以及编程方法,此次实验发现我对定时器中断方式的掌握有所欠缺不足,更倾向于使用查询方式,对单片机定时方式还应该多花时间看看。

 

 

 

实验七 定时器实验

一.实验目的:

1.熟悉MCS-51单片机定时/计数器的定时工作原理及使用方法;

2.进一步掌握定时/计数器的初始化和编程方法。

3.进一步掌握中断程序的调试方法。

二.实验内容:

初始化设置内部定时器T0工作在方式1,即作为16位定时器使用。定时时间为10ms,每10ms T0溢出中断一次,将P1.0~1.7分别接发光二极管L1~L8。编写程序模拟一时序控制装置。开机后第一秒L1,L3亮,第二名L2,L4,亮,第三秒L5,L7亮,第4秒L6,L8亮以后重头开始,一直循环。

三.实验步骤:

1.理解TCON寄存器中TF0 TF1的作用,IE的EA和ET0的正确设置。

2.理解定时/计数器的定时功能的触发原理.

3.编写汇编程序,并生成HEX文件,烧入实验板。

 

四.实验参考程序:

LJMP INT_T0

ORG 0030H

MAIN:

MOV TMOD,#01H;T0选用定时器方式1

MOV TH0,#0D8H ;设置T0每10ms中断一次

MOV TL0,#0F0H

MOV R0,#00H ;控制R0处内容

MOV R1,#100 ;控制中断次数为100

SETB EA ;总中断

SETB ET0 ;启动定时器中断

SETB TR0     ;启动定时器

SJMP $

;-----------------------------中断程序

INT_T0:

CLR TR0 ;关闭中断

MOV TH0,#0D8H  

MOV TL0,#0F0H

SETB TR0

DJNZ R1,EXIT ;中断次数少于100返回main继续执行 MOV R1,#100

MOV DPTR,#T_DATA

MOV A,R0

MOVC A,@A+DPTR

MOV P2,A ;控制灯亮

INC R0

ANL 00,#03H

EXIT:

RETI ;返回

T_DATA: DB 0FAH,0F5H,0AFH,05FH

END

 

;说明:P2口接发光二极管

五、实验过程

打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,计数器方式采用T0方式1,根据定时时间为10ms计算出2^16-10000=5536即D8F0H,按照要求计算出各个灯亮对应的编码 0FAH,0F5H,0AFH,05FH,根据要求写好主程序与循环程序(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,观察发光二极管闪烁情况。

六、实验结果

 

 

七、实验总结

   这次的单片机的定时实验并不是很难,通过实验我了解51单片机定时/计数器的定时工作原理及使用方法,也进一步掌握了中断程序的调试方法,对程序的每一部分都有了更为清楚的掌握。                  

 

 

 

实验八 数码管实验

一.实验目的:

1.掌握51单片机前后台程序结构及编程方法;

2.了解数码管段码和位码的控制。

二.实验内容:

通过手动按键K3,使得数码管0位从“0”-“f”显示

通过手动按键K4,使得数码管1位从“0”-“f”显示

 

三.实验步骤:

1.理解共阴极数码管工作原理。

2.理解3-8译码器工作原理.

2.查询按键小兜并使得内存单元加1。

4.依次显示数码管0,1位上变化的数据。

四.实验参考程序:

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP INT_K3

ORG 0013H

LJMP INT_K4

ORG 0030H

MAIN:

SETB EA           

SETB IE0          

SETB IE1          

CLR IT0          

CLR IT1          

SETB EX0         

SETB EX1           

MOV DPTR,#TAB     

MOV R5,#0

MOV R6,#0

L1:

ACALL LOOP     

SJMP L1           

;--------------------------------------

INT_K3:

ACALL LOOP         

JNB P3.2,INT_K3     

INC R5             

CJNE R5,#16,EIXT      

MOV R5,#0             

RETI                    

;--------------------------------------

INT_K4:

ACALL LOOP

JNB P3.3,INT_K4

INC R6

CJNE R6,#16,EIXT

MOV R6,#0

RETI

;--------------------------------------

LOOP:

MOV A,#11111111B

MOV P2,A                

MOV A,R5                 

MOVC A,@A+DPTR

MOV P0,A

ACALL DELAY

MOV A,#11111011B

MOV P2,A

MOV A,R6

MOVC A,@A+DPTR

MOV P0,A

ACALL DELAY

RET

;--------------------------------------

EIXT:

RETI

;--------------------------------------

DELAY:

MOV R1,#10

DELY1: MOV R2,#10

DJNZ R2,$              

DJNZ R1,DELY1          

RET

;--------------------------------------

TAB:

DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

 

END

;说明:P0口接数码管端码,3-8译码器选择数码管位码。

五、实验过程

打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,按键k3,k4分别控制数码管0位和1位从0显示到F,据要求编写好代码(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,按动按键观察数码管显示情况。

六、实验结果

 

七、实验总结

通过实验了解了共阴极数码管工作原理,也发现了自己前面一些知识的掌握有所不足,还需要多多学习。

 

 

实验九 串口实验

一.实验目的:

1.掌握51单片机串口原理及编程方法;

2.了解中断服务的概念。

二.实验内容:

通过编程,实现单片机开机发送“Welcome”,并等待接收串口的数字信息,显示在数码管的第0位。实现波特率115200bps的通信。

三.实验步骤:

1.理解SCON寄存器中SM0,SM1,REN的设置。

2.学习根据fosc计算波特率,并设置定时器的工作方式和参数.

2.按中断接收服务程序的模式,调试运行,打开串口助手,接收和发送单片机的内容。

4.生成HEX文件,烧入实验板,打开并观察数码管显示情况。

四.实验参考程序:

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#20H   ;定时器1 定时方式 方式2
MOV TH1,#0FDH ;3us
MOV TL1,#0FDH
SETB TR1 ;开启T1定时器
MOV SCON,#52H
MOV DPTR,#T_TAB
;-------------------------------------发送
SEND: CLR A
MOVC A,@A+DPTR
INC DPTR
JZ RECEIVE ;
JNB TI,$ ;TI判断输出一个字符是否完成
CLR TI
MOV SBUF,A ;
SJMP SEND
;-------------------------------------接收
RECEIVE:JNB RI,$ ;RI判断输入一个字符是否完成
CLR RI
MOV A,SBUF ;
MOV B,#48 
DIV     AB
MOV A,B ;
ACALL DISPLAY
SJMP RECEIVE
;-------------------------------------显示
DISPLAY:MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV  P0,A
RET
;-------------------------------------发送字段
T_TAB: DB 'WELCOME'
DB 0DH,0
;-------------------------------------接收译码字段
TAB:
DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END

;说明:串口采用8位异步通信方式2

五、实验过程

打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,采用定时器1方式2,根据波特率9600计算出9600=11059200/(32*12*(256-N))即N=253,即)0FDH,共阴极0-9对应的编码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,根据要求写好各个模块内容(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板。

六、实验结果

 

七、实验总结

通过学习了解了根据fosc计算波特率的算法,也再次巩固了定时器的工作方式,同时也初步了解了单片机串口原理以及编程方法。

 

 

(实验结果是图复制不过来,就这样)

 

posted @ 2022-03-14 22:33  安良  阅读(2668)  评论(0编辑  收藏  举报