单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(12页珍藏版)》请在冰豆网上搜索。
![单片机.docx](https://file1.bdocx.com/fileroot1/2022-10/27/b2bd332e-b359-4510-929e-d72489341926/b2bd332e-b359-4510-929e-d724893419261.gif)
单片机
一、主要内容:
1)输出实验:
假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。
2)输入:
从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。
实现方式:
通过peripherals实现端口数据观察。
3)假设P0口外接一个数码管(共阴),如图所示,请在数码管上轮流显示数字0~9。
(采用软件延时)。
数码管编码真值表(0~9):
❑DB0FCH,60H,0DAH,0F2H,66H
❑DB0B6H,0BEH,0E0H,0FEH,0F6H
二、流程图及程序
1)输出实验:
流程图:
说明:
本实验通过对P0~P3四个端口值的控制以及延时程序的插入实现LED灯的循环亮灭。
程序:
ORG0000H;定义程序起始地址
LJMPMAIN;跳转到MAIN
ORG030H;定义MAIN的入口地址
MAIN:
MOVP0,#00H
MOVP1,#00H
MOVP2,#00H
MOVP3,#00H;给四个端口P0~P3赋以初值0,使得四个端口连接的LED灯全亮
ACALLDEL;调用延时子程序DEL,跳到DEL执行延时
MOVP0,#0FFH
MOVP1,#0FFH
MOVP2,#0FFH
MOVP3,#0FFH;给四个端口P0~P3赋值0FFH,使得四个端口连接的LED灯全灭
MOVA,P0;将P0口的值传送到累加器A中
ACALLDEL;再次调用延时子程序DEL
AJMPMAIN;跳转回MAIN程序入口重新执行
ORG0200H定义;DEL子程序入口
DEL:
MOVR5,#04H;将R5赋值04H
F3:
MOVR6,#0FFH;给R6赋值FFH
F2:
MOVR7,#0FFH;给R7赋值FFH
F1:
DJNZR7,F1;R7←(R7)-1,若(R7)不等于0,则跳转F1
DJNZR6,F2;R6←(R6)-1,若(R6)不等于0,则跳转F2
DJNZR5,F3;R5←(R5)-1,若(R5)不等于0,则跳转F3
RET;调用结束,返回
END
说明:
延时程序的延时时间为:
4×256×256×1us.
2)在数码管(共阴)上轮流显示数字0~9:
流程图:
说明:
此实验主要通过对P0端口的赋值对共阴极管进行控制而实现数码管对数字的显示,通过赋值的不同和延时的插入使其循环不同的数字。
本例中只显示了0、1、2三个数字。
还可以通过加入类似的语句现实更多的数字。
程序:
ORG0000H;定义程序起始地址
LJMPMAIN;跳转到MAIN主程序
ORG030H;定义MAIN的入口地址
MAIN:
MOVP1,#0FCH;将0FCH放至端口P1中,实现数码管显示数字0
ACALLDEL;调用延时子程序,跳入DEL执行延迟
MOVP1,#060H;改变端口P1的值,使数码管显示数字1
ACALLDEL;延时
MOVP1,#0DAH;改变端口P1的值,使数码管显示数字2
ACALLDEL;延时
AJMPMAIN;跳转回MAIN函数重新开始执行
DEL:
MOVR5,#04H
DEL1:
MOVR6,#0FFH
DEL2:
MOVR7,#0FFH
DEL3:
DJNZR7,DEL3
DJNZR6,DEL2
DJNZR5,DEL1;此部分与1)程序中的延迟相同
RET;返回
END
程序补充:
若需要再现实3、4、5、6、7、8、9需加入以下程序段在显示2之后:
MOVP1,#0F2H;改变端口P1的值,使数码管显示数字3
ACALLDEL;延迟
MOVP1,#66H;改变端口P1的值,使数码管显示数字4
ACALLDEL
MOVP1,#0B6H;改变端口P1的值,使数码管显示数字5
ACALLDEL
MOVP1,#0BEH;改变端口P1的值,使数码管显示数字6
ACALLDEL
MOVP1,#0E0H;改变端口P1的值,使数码管显示数字7
ACALLDEL
MOVP1,#0FEH;改变端口P1的值,使数码管显示数字8
ACALLDEL
MOVP1,#0F6H;改变端口P1的值,使数码管显示数字9
ACALLDEL
【实验二】定时器/计数器及中断实验
一、实验内容
1)假设P0口外接一个数码管(共阴),如图所示,请在数码管上轮流显示数字0~9。
(采用定时器实现延时并显示数字)。
❑数码管编码真值表(0~9):
❑DB0FCH,60H,0DAH,0F2H,66H
❑DB0B6H,0BEH,0E0H,0FEH,0F6H
2)单片机晶振为12MHZ,要求利用T1,工作方式1产生周期为2ms的方波。
解:
利用方式1,16位计数器,当定时时间到,T1计数器溢出使TF1置“1”,由于不采用中断方式,TF1置“1”后,不会自动复“0”,故需要指令给TF1清“0”。
初值:
65536-1ms/1us=65536-1000=64536=FC18H
二、流程图及程序
1).数码管轮流显示(延时用定时器实现)
流程图:
程序:
ORG0000H
AJMPSTART;跳至START开始执行程序
ORG001BH
AJMPT00;跳转至中断服务程序T00
ORG0030H
START:
MOVSP,#7FH;设置堆栈地址
MOVB,#0F6H
PUSHB;先压入数字9对应的端口值
MOVB,#0FEH
PUSHB
MOVB,#0E0H
PUSHB
MOVB,0BEH
PUSHB
MOVB,#0B6H
PUSHB
MOVB,#66H
PUSHB
MOVB,0F2H
PUSHB
MOVB,#ODAH
PUSHB
MOVB,#60H
PUSHB
MOVB,#0FCH
PUSHB;将0~9的数值按倒着的顺序压入栈内
MOVR0,#00H;将R0的值初始为0
MOVTMOD,#10H;T1工作于方式1
MOVTH1,#0FCH
MOVTL1,#18H;给计数器T1赋初值
SETBET1;T1允许中断
SETBEA;CPU开中断
SETBTR1;启动T1
SJMP$;等待中断
T00:
MOVTH1,#0FCH
MOVTL1,#18H;重新给T1赋初值
INCR0;每中断一次,R0加1
PEND:
POPB;依次弹出堆栈的值
MOVP1,B;传送到端口P1,完成相应数字的显示
CJNER0,#0AH,HA;判定:
当R0=10时,则全部元素都弹出,需重新完成栈压入工作,
AJMPSTART
HA:
RETI
END
2).查询方式产生2ms方波
流程图
说明:
此实验利用T1工作与1方式进行计时,当计满1000次的时候,TF=1,产生溢出,计数重新开始,TF恢复至“0”,相应的输出波函数发生一次翻转,多次重复,不断翻转,从而产生2ms的方波。
程序:
ORG0000H;定义程序起始地址
AJMPSTART;跳转到START开始执行程序
ORG0030H;定义START的入口地址
START:
MOVTMOD,#10H;设置T1计数器为方式1
MOVTH1,#0FCH
MOVTL1,#18H;向TH1、TL1中分别放入初值的高低部分0FCH、18H
SETBTR1;将TR1置位,启动T1
LOOPER:
JBCTF1,PE;循环查询TF1是否置位;若置位,则跳至PE,且TF1←0
AJMPLOOPER
PE:
MOVTH1,#0FCH
MOVTL1,#18H;重新装TH1、TL1初值
CPLP1.0;是P1.0发生翻转,实现正确输出方波
AJMPLOOPER;调回LOOPER继续检测TF1
END
3)中断方式产生2ms方波
流程图
说明:
此程序在于当TF1置位,存在溢出的时候直接产生中断,从而使T1重新装填,并实现输出方波。
程序:
ORG0000H;定义程序的入口地址
AJMPSTART;跳转至START开始执行程序
ORG001BH;定义T1中断的入口
AJMPT00;跳至中断服务程序T00
ORG0030H;定义START的入口地址
START:
MOVTMOD,#10H;设置T1为方式1
MOVTH1,#0FCH
MOVTL1,#18H;给计数器T1装入初值
SETBET1;T1允许中断
SETBEA;CPU允许中断
SETBTR1;启动T1
SJMP$;暂停
T00:
MOVTH1,#0FCH;
MOVTL1,#18H;给计数器T1装入初值
CPLP1.0;输出方波
RETI;返回
END
【实验三】串口通信实验
一、实验内容
假定P1口连接8个外围开关,不断读取P1口输入的开关量信息,并将读取的结果通过串口发送出去。
其中P1口的输入信息通过Peripherals->P1口模拟,并通过serialwindow查看输出信息。
流程图及程序:
1)发送
流程图:
程序:
ORG0000H;定义程序的起始地址
AJMPSTART;跳转至START开始执行程序
ORG0130H;定义START入口地址
START:
MOVSCON,#80H;设置串行口为工作方式2
MOVPCON,#00H;波特率不加倍
MAIN:
MOVA,P1;读取P1信息
MOVSBUF,A;将信息存入发送数据缓冲SBUF,并发送
ACALLDEL;调用延迟程序DEL,产生延迟
WAIT:
JBCTI,MAIN;循环查询TI是否置位,即判断是否完成发送
SJMPWAIT
DEL:
MOVR5,#84H
DEL1:
MOVR6,#0FFH
DEL2:
MOVR7,#0FFH
DEL3:
DJNZR7,DEL3
DJNZR6,DEL2
DJNZR5,DEL1;延时程序
RET;返回
END
2)接收
流程图:
程序:
ORG0000H;定义程序的起始地址
AJMPSTART
ORG0023H
AJMPSERIN;跳转到子程序SERIN
ORG0030H;定义START程序入口
START:
MOVSCON,#90H;设置串行工作方式2,允许接收
MOVPCON,#00H;波特率不加倍
SETBES;允许串行口中断
SETBEA;允许CPU中断
SJMP$;暂停
SERIN:
CLRRI;必须要加,将RI清零
MOVA,SBUF;将SBUF中数据放入A中
MOVP0,A;将A中数据独到P0端口
RETI;返回