单片机.docx

上传人:b****2 文档编号:2200172 上传时间:2022-10-27 格式:DOCX 页数:12 大小:89.94KB
下载 相关 举报
单片机.docx_第1页
第1页 / 共12页
单片机.docx_第2页
第2页 / 共12页
单片机.docx_第3页
第3页 / 共12页
单片机.docx_第4页
第4页 / 共12页
单片机.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单片机.docx

《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(12页珍藏版)》请在冰豆网上搜索。

单片机.docx

单片机

一、主要内容:

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;返回

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1