单片机实验教案.docx
- 文档编号:10539613
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:58
- 大小:795.43KB
单片机实验教案.docx
《单片机实验教案.docx》由会员分享,可在线阅读,更多相关《单片机实验教案.docx(58页珍藏版)》请在冰豆网上搜索。
单片机实验教案
实验一KeilC51的使用
一、实验目的
1、使用C51创建工程项目文件,为工程项目选择目标器件,为工程项目设置软硬件环境。
2、创建源程序文件并输入源程序代码,保存创建源程序项目文件,并对所编写的程序进行调试、运行。
二、实验内容
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVR4,#08
MOVA,#0FEH
MOVDPTR,#1000H
ROUNDLED:
MOVX@DPTR,A
RLA
INCDPTR
MOVR5,#50
LCALLDELAY
DJNZR4,ROUNDLED
LJMPMAIN
DELAY:
MOVR6,#50
TT2:
MOVR7,#100
DJNZR7,$
DJNZR6,TT2
DJNZR5,DELAY
RET
END
三、实验步骤及图像截屏结果
1、在“我的文档”里面新建一个文件夹,命名为:
LEI。
2、进入KeilC51系统的操作环境。
3、建立一个新的工程。
单击菜单命令:
Project→NewProject,如图1-1:
图1-1选中新工程
然后选择要保存的路径,输入工程文件的名字:
lei,如图1-2
图1-2给新工程取名
点击“保存”按钮,会弹出一对话框,选择单片机型号为Atmel的89C51,如图1-3:
图1-3选择单片机型号
此时工程文件已经建立。
4、单击菜单命令:
File→New,将实验程序编入后保存,单击菜单命令:
File→Saveas,注意一定要加扩展名.asm,然后单击“保存”,如图1-4:
图1-4编辑程序并保存
5、回到编辑界面后,单击工程窗口中“Target1”,点击“+”号展开,右键单击“Sourcegroup1”选择AddFiletoGroup‘sourceGroup1’如图1-5:
图1-5选中添加文件界面
此时弹出窗口,注意选择文件类型Sam源文件,如图所示,点击Add,如图1-6:
图1-6选中要添加的文件名
5、对文件进行编译、链接。
依次点击按钮
、
、
,在编译时如发现程序有错误则会有错误报告出现,双击该行,可以定位出错位置,反复修改无错后出现0error(s),0warring(s)如图1-7:
图1-7编译链接时错误显示窗口
6、使用按钮
进行程序调试,在工程窗口可以看到运行程序后各寄存器或内存单元的结果,点击按钮
可对各个单元情况进行观察,还可在窗口中双击某行对其进行设置断点操作,再次双击则取消断点。
如图1-8:
图1-8查看各寄存器或内存单元情况
若要观察I/O口的变化则可用命令Peripherals→I/O-Ports,如图1-9:
图1-9查看I/O口变化情况
实验中还可采用全速进行按钮
代替三个单步运行按钮
,这样可以节省很多时间。
四、实验结果
五、思考题:
修改程序如何把每次循环中A的值分别放到片外RAM的地址1000H~
实验二Proteus的使用
一、实验目的
掌握Proteus仿真软件的使用方法和技巧。
二、实验仪器与设备
1.微机一台
2.Proteus仿真软件
三、实验内容
1.用数码管设计一数码管显示电路。
利用P1和P2口分别控制两个共阳极数码管,可循环显示0~99,每个数字显示时间自行设计。
2编写程序在其中一个数码管上画“8”字形,即按照a-f-g-c-d-e-g-b依次点亮各线段然后全部熄灭,重复以上操作。
另外一个数码管做单管流水,即按a-f-g-c-d-e-g-b-a依次单管循环点亮。
四、实验原理
LED数码显示器内部有7个条形放光二极管和一个小圆点发光二极管组成,每个发光二极管称为一个字段,其控制原理和发光二极管的控制原理相同。
五、实验步骤
1.参考教材设计一双数码管控制显示电路,熟悉Proteus的使用方法。
2.编程循环显示0~f.
3.编程在数码管画“8”。
六、实验结果
程序见附表
1、实验电路图
七、思考作答
用12MHz晶振,如何P1口做画“8”字依次点亮数码管?
数码管每隔大约500ms画一笔,重复此过程。
#include
voidDelay_ms(int);
charcodetab[8]={0xfe,0xdf,0xbf,0xfb,0xf7,0xef,0xfd,0xff};
voidmain()
{
intm=0,n=0;
while
(1)
{
P1=tab[m];
Delay_ms(500);//500ms
m++;
n++;
if(m==8)
{
m=0;
}
}
}
voidDelay_ms(t)
{
inti;
for(;t>0;t--)
for(i=0;i<124;i++);
}
2、附:
实验程序
#include
Unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x01};
unsignedchardispcount=0;
voiddelay02s(void)
{
unsignedchari,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
voidmain(void)
{
while
(1)
{
if(table[dispcount]!
=0x01)
{
P0=table[dispcount];
delay02s();
dispcount++;
}
elsedispcount=0;
}
}
实验三 数据存储实验
一、实验目的:
掌握C语言和汇编语言的调试方法,熟悉键盘操作和数据存储器的扩展。
重点:
常用汇编符号指令格式或C语言的基本语句和编译方法,数据存储器的扩展。
二、实验要求:
参看上述电路图对单片机进行数据存储器扩展,并在PROTEUS中画出原理图,分别对片内外的一段地址(1000H~10FFH)的内容写数据,并在KEIL中调试,编译生成HEX文件,在PROTEUS中仿真。
(原理参看教材8.1存储器的扩展,并在实验前预习)
三、实验步骤:
1、在PROTEUS中画出原理图。
2、根据原理图确定片外数据存储器的地址。
3、根据要求画出程序流程图。
4、用C语言编写程序并在并在KEIL中调试,编译生成HEX文件。
5、在PROTEUS中仿真查看实验结果。
6、修改完成思考
7、完成实验报告
四、画出实验程序流程图:
开始
R0=00
00送2000H
DPTR+1R0+1
R0=FF?
结束
五、写出程序清单和注释:
文件名:
SW01.ASM
ORG0000H
LJMPSE01
ORG0640H
SE01:
MOVR0,#00H
MOVDPTR,#2000H
MOVR1,#30H
LOO1:
CLRA
MOVX@DPTR,A
INCDPTR
MOVA,#66H
INCR0
MOVX@DPTR,A
MOVA,#55H
MOVX@R1,A
INCDPTR
INCR1
CJNER0,#00H,LOO1
LOOP:
SJMPLOOP
END
C程序
#include
unsignedintxdata*p;
unsignedcharidata*p1;
voidmain(void)
{
unsignedinti;
p=0x12000;
for(i=0;i<=0XFF;i++)
//XBYTE[i]=0x55;
{
*p=0x66;
p=p+1;
}
p1=0x30;
for(i=0;i<=0XFF;i++)
//DBYTE[i]=0x11;
{
*p1=0x55;
p1=p1+1;
}
while
(1);
}
六、思考:
假使把地址中的内容改成FFH,如何修改程序?
*p=0xFF;
七、实验结果及说明:
实验四 拆字程序和拼字程序
一、实验目的:
掌握C语言的调试方法,熟悉键盘操作和数据存储器的扩展。
重点:
常用汇编符号指令格式或C语言的基本语句和编译方法,数据存储器的扩展。
二、实验内容:
⑴拆字:
把8000H的内容拆开,高位送8001H低位,低位送8002H低位,8001H、8002H高位清零,一般本程序用于把数据送显示缓冲区时用。
⑵拼字:
把8000H.8001H的低位分别送入8002H高低位,一般本程序用于把显示缓冲区的数据取出拼装成一字节。
三、画出实验程序流程图:
⑴⑵
四、实验步骤:
⑴拆字:
用连续或单步方式运行程序,检查8000H~8002H中内容变化情况。
⑵拼字:
单步或用断点方式运行程序,检查2002H内容变化情况。
五、写出程序清单和注释:
⑴拆字文件名:
SW02.ASM
ORG0000H
LJMPSE02
ORG0660H
SE02:
MOVDPTR,#8000H
MOVXA,@DPTR
MOVB,A
SWAPA
ANLA,#0FH
INCDPTR
MOVX@DPTR,A
INCDPTR
MOVA,B
ANLA,#0FH
MOVX@DPTR,A
LOOP:
SJMPLOOP
END
1、拆字(c)
unsignedcharxdata*p;
unsignedchari,j,k;
voidmain(void)
{
p=0x8000;
j=*p&0x0f;
k=*p&0xf0;
for(i=0;i<=3;i++)
{
k=k>>1;
}
p++;
*p=j;
p++;
*p=k;
while
(1);
}
⑵拼字文件名:
SW03.ASM
ORG0000H
LJMPSTART
ORG0680H
START:
MOVDPTR,#8000H
MOVXA,@DPTR
ANLA,#0FH
SWAPA
MOVB,A
INCDPTR
MOVXA,@DPTR
ANLA,#0FH
ORLA,B
INCDPTR
MOVX@DPTR,A
END
拼字(c)
unsignedcharxdata*p;
unsignedchari,j,k;
voidmain(void)
{
p=0x8000;
j=*p&0x0f;
for(i=0;i<=3;i++)
{
j=j<<1;
}
p++;
k=*p&0x0f;
p++;
*p=k+j;
while
(1);
}
六、思考:
如何用断点方式调试拆字程序?
用菜单中的小手设置,采用断点运行就可以了
七、实验结果及说明:
执行拆字程序以后的结果
执行拼字程序以后的结果
实验五 数据排序实验
一、实验目的:
熟悉51指令系统,掌握程序设计方法。
重点:
汇编符号指令格式或C语言和编译方法,程序设计流程
二、实验内容:
编写并调试一个排序子程序,其功能为用冒泡法将内存RAM中几个单字节无符号的正整数,按从小到大的次序重新排列。
三、画出实验程序流程图:
四、实验步骤:
将RAM片内某一段地址中放入不等的数据,用断点方法运行本实验程序后检查50H~5AH中的内容是否按从小到大的次序排列。
五、写出程序清单和注释:
文件名:
SW05.ASM
ORG0000H
LJMPQUE
ORG09B0H
QUE:
MOVR3,#50H
QUE1:
MOVA,R3
MOVR0,A
MOVR7,#0AH
CLR00H
MOVA,@R0
QL2:
INCR0
MOVR2,A
CLRC
MOV22H,@R0
CJNEA,22H,QL3
SETBC
QL3:
MOVA,R2
JCQL1
SETB00H
XCHA,@R0
DECR0
XCHA,@R0
INCR0
QL1:
MOVA,@R0
DJNZR7,QL2
JB00H,QUE1
LOOP:
SJMPLOOP
END
排序(c)
unsignedcharidata*p;
unsignedchari,j,k,;
voidmain(void)
{for(k=0;k<=0x0f;k++)
{
p=0x50;
for(i=k+1;i<=0x0f;i++)
{
p++;
if(*(p-1)<*p)
{j=*p;*p=*(p-1);*(p-1)=j;}
}
}
while
(1);
}
六、思考:
修改程序把50H~5AH中内容从大到小排列。
只需把JCQL1改成JNCQL1就可以完成大到小排列
七、实验结果及说明:
实验六 数据查找实验
一、实验目的:
熟悉51指令系统或者C语句,掌握程序设计方法。
重点:
汇编符号指令格式或C语言和编译方法,程序设计流程
二、实验内容:
编写并调试一个排序子程序,其功能对某一段地址中的数查找出某一常数,并记录常数的个数。
三、画出实验程序流程图:
四、实验步骤:
1、新建工程;2、新建**.c文件;3、加载**.c文件到工程,4、编辑、编译及连接;5、调试查看结果。
五、实验程序:
#include
unsignedchari,j;
unsignedchar*p;
voidmain(void)
{
p=0x50;
for(i=0;i<=0x0f;i++)
{
if(*p==0x35)
j++;
p++;
}
while
(1);
}
六、思考:
修改程序把从片内外各找一段地址找出某一常数,并记录为该常数的地址。
#include
unsignedchari,j,k,m,n;
unsignedcharshuzud[],shuzux[];
unsignedchardata*p;
unsignedcharxdata*q;
voidmain(void)
{
p=0x50;
q=0x1000;
for(i=0;i<=0x0f;i++)
{
if(*p==0x35)
{j++;shuzud[m]=p;m++;}
p++;
if(*q==0x35)
{k++;shuzud[n]=q;n++;}
q++;
}
while
(1);
}
七、实验结果及说明:
实验七 P1口亮灯实验
一、实验目的:
(l)学习P1口的使用方法;
(2)学习延时子程序的编写;
(3)定时器定时程序的编写。
二、实验顶备知识:
(l)Pl口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。
(2)本实验中延时子程序采用指令循环来实现,机器周期(12/6MHz)*指令所需机器周期数*循环次数,在系统时间允许的情况下可以采用此方法。
(3)通过定时器中断怎么实现延时1秒钟。
三、实验内容:
P1口输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
(比如交通灯或者广告灯)。
四、画出实验程序流程图:
五、实验原理图
六、实验步骤:
1、根据原理图在PROTEUS中画出仿真原理图。
2、根据要求画出程序流程图。
3、在KEIL51环境中编写程序并调试生成HEX文件。
4、把HEX文件装载在单片机中并仿真。
七、写出程序清单和注释:
1、软件延时实现
#include
unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01};//定义广告灯的变化样式
unsignedchari;
/******定义延时子程序**********/
voiddelay(void)
{
unsignedcharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
voidmain(void)
{
while
(1)
{
if(table[i]!
=0x01)
{
P1=table[i];
i++;
delay();
}
elsei=0;
}
}
2、定时器定时
#include
unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01};//定义广告灯的变化样式
unsignedchari;
voidtimer0isr(void)interrupt1using1
{
TH0=0x3C;
TL0=0xB0;//重置计数初值
icount++;//溢出次数加1
if(icount==20)
{
icount=0;
if(table[i]!
=0x01)
{
P1=table[i];
i++;
}
else
{i=0;//累计够1秒时溢出次数加清0并控制灯闪烁
P1=table[i];}
}
}
voidmain(void)
{
icount=0;//记录溢出次数
TMOD=0x01;//设定T/C0工作在定时器方式1
LIGHT_ON=1;
TH0=0x3C;
TL0=0xB0;//装载计数初值
EA=1;//开总中断
ET0=1;//开T/C0中断
TR0=1;//启动T/C0
while
(1);
}
八、思考:
1、改变延时常数,使发光二极管闪亮时间改变。
修改程序,使8个发光二极管以一种新方式闪亮。
2、通过定时器中断怎么控制发光二极管闪亮的时间?
实验八 数码管显示实验
一、实验目的
1.学习数码管的工作原理和共阴、共阳的链接方法。
2.学习静态和动态数码管的工作原理及应用程序的设计。
二、实验设备:
STC89C52单片机实验板、串口下载线、USB连接线、电脑
三、实验要求
数码管是最常用的显示设备。
本例要求用定时器实现定时1秒钟,并能够实现时钟功能,在6段数码管上动态显示时、分、秒。
通过外部中断控制时间的调整。
主要用中断实现。
具体的原理图如下图所示:
实现的原理:
用定时器定时1秒钟,根据时钟的规律,实现时分秒的计算,通过外部中断控制时间的调整,并在动态数码管上显示时分秒。
四、实验步骤
1.根据实验原理和要求画出实验原理图。
2.画出流程图。
3.根据流程图编写实验程序,并完成调试。
五、实验流程图
六、实验程序
#include
unsignedcharxianshi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharduanxuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
sbitk1=P1^5;
sbitk2=P1^6;
sbitk3=P1^7;
voiddelay(void)
{
inti,j;
for(i=0;i<10;i++)
for(j=0;j<50;j++);
}
voidmain(void)
{
intk,e,d;
ints=0,m=0,t=0;
intsg,ss,mg,ms,tg,ts;
while
(1)
{
for(s=0;s<60;s++)
{
if(k1==0)
s++;
if(k2==0)
m++;
if(k3==0)
t++;
sg=s%10;
ss=s/10;
mg=m%10;
ms=m/10;
tg=t%10;
ts=t/10;
for(d=0;d<35;d++)
for(k=0;k<6;k++)
{
P2=0xff;
P2=duanxuan[k];
switch(k)
{
case0:
e=ts;break;
case1:
e=tg;break;
case2:
e=ms;break;
case3:
e=mg;break;
case4:
e=ss;break;
case5:
e=sg;break;
default:
break;
}
P0=xianshi[e];
delay();
}
}
m++;
if(m>=60)
{
m=0;
t++;
}
if(t>=24)
t=0;
}
}
八、实验结果
实验九 外部中断实验
一、实验目的
(1)掌握中断程序的编程方法。
(2)了解蜂鸣器的控制方法。
二、实验原理
本实验主要为了使读者理解中断原理和掌握中断的编程方法。
关于中断原理可参考第3章的有关内容。
本实验通过外部中断1所接的轻触开关打开或关断蜂鸣器,循环点亮跑马灯。
三、实验内容
(1)接通J18(控制蜂鸣器跳线)和J17(控制8位跑马灯跳线)。
(2)在Keil编译环境下,根据流程图(图7-6)编写程序,生成*.HEX文件。
(3)在ISP环境下将生成的*.HEX文件下载到AT89S52中。
(4)离线运行,观察运行结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 教案