单片微机原理与应用Word格式.docx
- 文档编号:22516777
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:24
- 大小:1.50MB
单片微机原理与应用Word格式.docx
《单片微机原理与应用Word格式.docx》由会员分享,可在线阅读,更多相关《单片微机原理与应用Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
通常情况下,都称为定时器。
定时器的四种工作方式是由软件来控制的,如下表所示,定时器工作方式寄存器TMOD中的M0、M1两为决定了它的工作方式。
表4-1定时器的四种工作方式
M1M0
工作方式
说明
00
方式0
13位计数器
01
方式1
16位计数器
10
方式2
自动再装入8位计数器
11
方式3
定时器0:
分为两个8位计数器
定时器1:
对外部停止计数
4、使用单片机的定时器T0产生100ms的定时信号,使实验仪主板上的流水灯(8只红色发光二极管)依次发光,并循环。
设此时系统的时钟频率为6MHz,再根据它来决定定时器T0的初始值。
由于时钟频率为6MHZ,所以,机器周期为2µ
s。
初始值计算有以下公式的出,t=(216-T0初值)×
机器周期,就可以计算出初始值,公式是依据定时器的工作原理的出的,51单片机的定时器是加法计数的,即由有一个数开始,每一个机器周期加一,直至溢出。
5、实验主板上的8只红色发光二极管的亮/灭是由8位锁存器74HC573进行锁存。
电路如下图。
图4-6流水灯电路
由图可以看出,锁存器是挂在系统总线上的,有外部地址进行统一编址,是外部地址64K地址空间的一部分。
74HC573的锁存信号有译码电路产生,又因为573在控制端C引脚为高电平时,数据通道打开,从高变到低时,数据被锁存,所以,C端门控信号是由74HC138译码器的输出端(译码地址:
2000H)在加一个反相器得到的。
程序设计:
由系统总线扩展I/O口,实现流水灯的程序设计。
示例1:
用软件延时实现流水灯的延时。
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVDPTR,#2000H
MOV@R0,#0FEH
MOVA,@R0
MOVX@DPTR,A
ACALLDELAY;
延时
MOVR3,#07H;
设置左移7次
LOOP:
RLA;
左移一位
DJNZR3,LOOP;
R3是否为0,不为0转LOOP继续执行
AJMPMAIN;
返回主程循环执
DELAY:
MOVR7,#255;
延时子程序
D1:
MOVR6,#255
D2:
DJNZR6,D2
DJNZR7,D1
RET;
子程序返回
END;
程序结束
示例2:
给出定时器的中断服务程序,同学可以进行修改,形成由中断完成的流水灯程序设计。
ORG0000H
LJMPMAIN
ORG000BH
LJMPTIME
MOVTH0,#0D8H
MOVTL0,#0A0H
MOVTMOD,#01H;
定时器工作方式1
SETBET0;
开定时中断
SETBEA;
开总中断
SETBTR0;
定时器开始计时
中断服务程序:
TIME:
RETI
三实验步骤
1、首先用软件延时的方法,实现流水灯实验;
2、用定时器设计流水灯实验,让流水灯依次点亮或熄灭,并掌握外部扩展时地址的分配(扩展外部I/O,使用锁存器)。
实验二单片机集成开发环境应用
1.熟悉单片机集成开发软件(Keil);
2.掌握单片机实验板的使用;
3.掌握单片机P1口使用;
图1-1启动时的屏幕
1、建立第一个项目
1)建立第一个项目
点击Project菜单,选择弹出的下拉式菜单中的NewProject,如图1-2。
接着弹出一个标准Windows文件对话窗口,如图1-3,用法技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。
在“文件名”中输入您的第一个C程序项目名称,这里我们用“test”,这是笔者惯用的名称,大家不必照搬就是了,只要符合Windows文件规则的文件名都行。
“保存”后的文件扩展名为uv2,这是KEILuVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。
图1-2NewProject菜单
图1-3文件窗口
2)选择所要的单片机
选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。
此时屏幕如图1-4所示。
AT89C51有什么功能、特点呢?
请看图中右边有简单的介绍,是英文的。
稍后的章节会作较详细的介绍。
完成上面步骤后,我们就可以进行程序的编写了。
图1-4选取芯片
3)在项目中创建新的程序文件或加入已经存在的程序文件
首先我们要在项目中创建新的程序文件或加入已经存在的程序文件。
如果您没有现成的程序,那么就要新建一个程序文件。
在KEIL中有一些程序的Demo,在这里我们还是以一个C程序为例介绍如何新建一个C程序和如何加到您的第一个项目中吧。
点击图1-5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也可以通过菜单或快捷键CTRL+N来实现。
图1-5新建文件
4)如果没有已经存在的程序文件,新建、保存
点击图1-5中的3保存新建的程序,也可以用菜单或快捷键CTRL+S进行保存。
因是新文件所以保存时会弹出类似图1-3的文件操作窗口,我们把第一个程序命名为test1.c,保存在项目所在的目录中,这时您会发现程序单词有了不同的颜色,说明KEIL的C语法检查生效了。
如图1-6鼠标在屏幕左边的SourceGroup1文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。
我们选“AddGroup‘SourceGroup1’”弹出文件窗口,选择刚刚保存的文件,按ADD按钮,关闭文件窗,程序文件已加到项目中了。
这时在SourceGroup1文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。
图1-6把文件加入到项目文件组中
5)编译调试
C程序文件已被我们加到了项目中了,下面就剩下编译运行了。
这个项目我们只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用于芯片烧写的HEX文件。
要生成用于芯片烧写的HEX文件,应进行如下设置:
在CreatHEXFile前打选择。
图中1、2、3都是编译按钮,不同是1是用于编译单个文件。
2是编译当前项目,如果先前编译过一次之后文件没有做动编辑改动,这时再点击是不会再次重新编译的。
3是重新编译,每点击一次均会再次编译链接一次,不管程序是否有改动。
在3右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。
5是菜单中的它们,我个人就不习惯用它了。
嘿嘿,这个项目只有一个文件,您按1.2.3中的一个都可以编译。
在4中可以看到编译的错误信息和使用的系统资源情况等,以后我们就依靠它来进行查错。
6是有一个小放大镜的按钮,这就是开启\关闭调试模式的按钮,它也存在于菜单Debug-Start\StopDebugSession,快捷键为Ctrl+F5。
图1-7编译程序
6)调试、生成HEX文件
进入调试模式,软件窗口样式大致如图1-8所示。
图中1为运行,当程序处于停止状态时才有效,2为停止,程序处于运行状态时才有效。
3是复位,模拟芯片的复位,程序回到最开头处执行。
图1-8调试运行程序
2、下载到单片机的内部运行
1)用KEIL生成的HEX文件
步骤:
1点击Project菜单,选择弹出的下拉式菜单中的NewProject。
2选择所要的单片机,如选择常用的Ateml公司的AT89C51。
3在项目中创建新的程序文件或加入已经存在的程序文件。
4如果没有已经存在的程序文件,新建、保存。
5编译
6调试、生成HEX文件
2)下载
本实验板提供ISP方式的下载,将KEIL生成的HEX文件下载到单片机的内部flash。
连接计算机串口和单片机的串口下载。
注意:
单片机的P1.0P1.6P1.1不能被短接。
3)ISP下载方法
使用STC-ISP软件,操作方法见前面。
ISP下载步骤:
1选择器件
2装载HEX文件
3下载程序
4)运行
将KEIL生成的HEX文件下载到单片机的内部flash后,即可自动运行单片机的内部的程序。
依照实验内容开始进行实验,熟悉Keil软件的使用,自行建立工程,并新建一个文件(汇编文件为.ASM扩展名,C文件为.C扩展名),编写自己的程序,再把此文件添加到工程当中,最后进行编译,如果没有错误,则进行在线软件的仿真调试。
仿真调试分为两种:
软件仿真和硬件仿真,前者不使用仿真器,后者使用硬件仿真器。
本实验箱提供ISP方式的下载,将KEIL生成的HEX文件下载到单片机的内部flash,重复此部分内容,直到熟练掌握开发环境的使用。
四实验程序
1、汇编程序:
ORG 0000H
SJMP START
ORG 0030H;
(*)
START:
MOV P1,#00000010B;
将P1.0及P1.1分别置低电平、高电平
NOP;
空指令,不执行任何操作
NOP
LJMP START;
跳转到STA
END;
2、C程序:
附:
关于此程序的C51实现
#include<
reg51.h>
stdio.h>
voidmain()
{
while
(1)
P1=0x02;
//置位P1.1,清零P1.0
}
实验三键盘输入实验
一、键盘电路
二、键盘译码地址
MCS-51单片机键盘部分,外接1片74LS273芯片作为扫描的输出接口,地址为:
0C000H,输入接口在74HC244对应的引脚上,地址为:
0C000H。
键盘代码
#include<
reg52.h>
absacc.h>
intrins.h>
#defineucharunsignedchar
unsignedcharcodeDIG_CODE[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xc7,0x8c,};
voidDelay10ms(unsignedintc);
unsignedcharKeyValue;
intd,e,f=1,g=-1,j,h,i,k=1,n,m;
//检测键盘按键
voidKeyDown(void)
XBYTE[0xC000]=0X07;
m=XBYTE[0xC000];
m=m&
0x0f;
if(m!
=0x0f)
{
if(m==0X0e)KeyValue=1;
if(m==0X0d)KeyValue=5;
if(m==0X0b)KeyValue=9;
if(m==0X07)KeyValue=12;
}
XBYTE[0xC000]=0X0b;
=0x0f)
if(m==0X0e)KeyValue=2;
if(m==0X0d)KeyValue=6;
if(m==0X0b)KeyValue=0;
if(m==0X07)KeyValue=13;
XBYTE[0xC000]=0X0d;
if(m==0X0e)KeyValue=3;
if(m==0X0d)KeyValue=7;
if(m==0X0b)KeyValue=10;
if(m==0X07)KeyValue=14;
XBYTE[0xC000]=0X0e;
if(m==0X0e)KeyValue=4;
if(m==0X0d)KeyValue=8;
if(m==0X0b)KeyValue=11;
if(m==0X07)KeyValue=15;
while((n<
50)&
&
(XBYTE[0xC000]!
=0xf0))
Delay10ms
(1);
n++;
//延时
voidDelay10ms(unsignedintc)
{
unsignedchara,b;
for(;
c>
0;
c--)
for(b=38;
b>
b--)
for(a=130;
a>
a--);
//主函数
main()
XBYTE[0xB000]=DIG_CODE[16];
XBYTE[0xa000]=DIG_CODE[14];
XBYTE[0x9000]=DIG_CODE[17];
XBYTE[0x8000]=DIG_CODE[17];
while
(1)
KeyDown();
//一按A显示A666
if(KeyValue==10)
intw=0,x=0,y=0,z=0;
XBYTE[0xB000]=DIG_CODE[10];
XBYTE[0xa000]=DIG_CODE[6];
XBYTE[0x9000]=DIG_CODE[6];
XBYTE[0x8000]=DIG_CODE[6];
Delay10ms(5);
while(f>
0)
if(KeyValue>
=11)
f=-1;
if(KeyValue<
=9)
w=x;
x=y;
y=z;
z=KeyValue;
XBYTE[0xB000]=DIG_CODE[w];
XBYTE[0xa000]=DIG_CODE[x];
XBYTE[0x9000]=DIG_CODE[y];
XBYTE[0x8000]=DIG_CODE[z];
}
KeyValue=10;
f++;
Delay10ms(20);
9)
XBYTE[0xB000]=DIG_CODE[18];
XBYTE[0xa000]=DIG_CODE[14];
XBYTE[0x9000]=DIG_CODE[17];
XBYTE[0x8000]=DIG_CODE[17];
//二按11显示P232
if(KeyValue==11)
XBYTE[0xa000]=DIG_CODE[2];
XBYTE[0x9000]=DIG_CODE[3];
XBYTE[0x8000]=DIG_CODE[2];
Delay10ms(100);
XBYTE[0xB000]=0xbf;
XBYTE[0xa000]=0xbf;
XBYTE[0x9000]=0xbf;
XBYTE[0x8000]=0xbf;
//KeyValue=10;
while(g<
g=6;
XBYTE[0xa000]=DIG_CODE[x];
XBYTE[0x9000]=DIG_CODE[y];
XBYTE[0x8000]=DIG_CODE[z];
g--;
XBYTE[0xB000]=DIG_CODE[16];
//三按12显示232C
if(KeyValue==12)
XBYTE[0xB000]=DIG_CODE[2];
XBYTE[0xa000]=DIG_CODE[3];
XBYTE[0x9000]=DIG_CODE[2];
XBYTE[0x8000]=DIG_CODE[12];
//1111~FFFF循环功能
if(KeyValue==2)
for(e=0;
e<
=15;
e++)
XBYTE[0xB000]=DIG_CODE[e];
XBYTE[0xa000]=DIG_CODE[e];
XBYTE[0x9000]=DIG_CODE[e];
XBYTE[0x8000]=DIG_CODE[e];
Delay10ms(50);
if(e==15)
e=-1;
if(KeyValue==15)
e=10000;
学生实验心得
通过这次单片机实习,我对单片机的认识加深了许多不只是让我对单片机的了解停留在书本上。
培养了我的动手能力和创新能力,教会我把实际和书本结合起来,让我知道我可以克服很多困难去获得成功。
实践是检验真理唯一的途径,这次试验让我更好的知道了这个道理。
学生(签名):
2017年6月30日
指导
教师
评语
成绩评定:
指导教师(签名):
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片 微机 原理 应用