单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
单片机实验报告
微控制器技术实验报告
专业班级:
自动化1004班
学号:
0909102721
姓名:
涂业彰
2013/4/25
一、实验目的和要求
a)熟练掌握KeilC51集成开发工具的操作及调试程序的方法,包括:
仿真调试与脱机运行间的切换方法;
b)熟练使用SST89C554RC单片机核心板及I/O扩展实验系统;
c)熟练掌握在KeilC51与Proteus仿真软件虚拟联机环境下,基于51单片机控制器数字接口电路的硬件、软件设计与功能调试;
d)完成MCS51单片机指令系统软件编程设计和硬件接口功能设计题;
二、软硬件环境
硬件环境介绍:
TD-51系统板是西安唐都科教仪器公司为TD系列微机接口教学平台配套推出的扩展件,使用该系统板配合接口教学实验平台可以完成单片机原理及应用的学习。
TD-51系统板的出现为广大师生用户提供了一套廉价、实用的单片机实验教学方案。
SST89E554RC简介:
TD-51系统板上提供了一片SST89E554RC,该器件是SST公司推出的8位微控制器
FlashFlex51家族中的一员,具有如下特征:
·与8051兼容,嵌入SuperFlash存储器
-软件完全兼容
-开发工具兼容
-引脚全兼容
·工作电压5V,工作时钟0~40MHz
·1Kbyte内部RAM
·两块SuperFlashEEPROM,主块32Kbyte,从块8Kbyte,扇区为128Byte
·有三个高电流驱动端口(每个16mA)
·三个16位的定时器/计数器
·全双工、增强型UART
-帧错误检测
-自动地址识别
·八个中断源,四级优先级
·可编程看门狗定时器(WDT)
·可编程计数阵列(PCA)
·双DPTR寄存器
·低EMI模式(可禁止ALE)
·SPI串行接口
·标准每周期12个时钟,器件提供选项可使速度倍增,达到每周期6个时钟
·低功耗模式
-掉电模式,可由外部中断唤醒
-空闲模式
实验一:
清零程序与拆字程序设计
1.将7000H~7FFFH的内容清零:
程序框图如下:
程序源码:
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
MOVR0,#00H
MOVDPTR,#7000H
LOOP:
MOV@DPTR,#00H
INCDPTR
INCR0
MOVA,R0
JNZLOOP
END
2.把7000H的内容拆开,高位送7001H低位,低位送7002H低位。
7001H,7002H高位清零,一般本程序用于把数据送显示缓冲区使用。
程序框图如下:
程序源码:
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
MOVA,7000H
ANLA,#0F0H
SWAPA
MOV7001H,A
MOVA,7000H
ANLA,#0FH
MOV7002H,A
END
实验二:
拼字程序与数据传送程序设计
3.拼字程序:
把7000H,7001H的低位相拼后送入7002H,一般本程序用于把显示缓冲区的数据取出拼装成一个字节。
程序框图如下
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
MOVA,7000H
ANLA,#0FH
SWAPA
MOVB,A
MOVA,7001H
ANLA,#0FH
ORLA,B
MOV7002H,A
END
4.散转与排序程序设计
数据传输子程序:
把(R2,R3)源RAM区首地址内的(R7,R7)个字节数据,传送到(R4,R5)目的RAM区。
程序框图如下:
程序源码:
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
NOP
LOOP1:
MOVA,@R2
MOVR4,A
INCR2
INCR4
DJNZR6,LOOP1
LOOP2:
MOVA,@R3
MOVR5,A
INCR3
INCR5
DJNZR7,LOOP2
END
实验三:
散转与排序程序设计
5.编写散转程序,根据8032片内的20H中的内容(00或01或02或03)进行散转。
程序框图如下:
程序源码:
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
MOVDPTR,#TAB
MOVA,20H
CLRC
RLCA
MOVCA,@DPTR
TAB:
SJMPLOOP0
SJMPLOOP1
SJMPLOOP2
SJMPLOOP3
…
6.编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单元字节无符号的正整数,按从小到大的顺序重新排列。
程序源码如下:
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
MOV40H,#8AH
MOV41H,#2BH
MOV42H,#0B9H
MOV43H,#47H
MOV44H,#29H
MOV45H,#0AFH
CALLSORT6
SJMP$
SORT6:
MOVR6,#05H
S1:
MOVR0,#40H
MOVB,R6
MOVR7,B
CLRPSW.5
S2:
MOVB,@R0
INCR0
MOVA,@R0
CJNEA,B,S3
S3:
JNCN_JH
MOV@R0,B
DECR0
MOV@R0,A
INCR0
SETBPSW.5
N_JH:
DJNZR7,S2
JNBPSW.5,S_END
DJNZR6,S1
S_END:
RET
END
实验四:
数字量输入输出实验
基本部分:
阅读、验证C语言基本程序功能。
使用汇编语言,完成实验指导书之“3.1数字量输入输出实验”基本实验项目(P36)。
程序如下:
#include”SST89x5x4.h”
voidmain()
{
unsignedcharinput;
while
(1)
{
input=P1|0xf0;
input=input>>4;
P1=P1|input;
}
}
提高部分:
(任选一题)
LED灯控制(使用8255接口芯片)
要求:
使用汇编语言、C语言编程,功能为:
通过KK1实现LED灯工作方式即时控制,完成LED开关控制显示和LED灯左循环、右循环、间隔闪烁功能。
程序如下:
#include”SST89x5x4.h”
#include
sbitkk1=P2^7;//0为关闭
usignedcharcount=0;
#defineleftloop0
#definerightloop1
#defineshining2
voidswitchscan();//扫瞄KK1开关关闭
voiddelayms(unsignedchar);
voidmain()
{
TH0=(65535-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x11;
ET0=1;
EA=1;
TR0=1;
P1=0xfe;
while
(1)
{
swithscan();
}
}
voidswitchscan()
{
while(kk1==0);//等待开启
delayms(10);
count++;
delayms(10);
while(kk1==1);//等待关闭
delayms(10);
if(count==3)count=0;
}
voiddelayms(unsignedchart)
{
inti,j;
for(i=0;i<120;i++)
for(j=0;j}
usignedchart_05s;
voidtimer0_led_isr()interrupt1
{
if(t_05s==10)
{
t_05s=0;
switch(count)
{
caseleftloop:
{
P1=_crol_(P1,1)
break;
}
caserightloop:
{
P1=_cror_(P1,1)
break;
}
caseshining:
{
P1=~P1;
break;
}
}
}
t_05s++;
}
实验五:
定时器/计数器实验
基本部分:
阅读、验证C语言程序功能。
使用汇编语言编程,完成实验指导书之“3.3定时/计数器实验”基本实验项目(P40)。
实验内容1
程序源码如下:
#include”SST89x5x4.h”
sbitwave1=P1^0;
sbitwave2=P1^1;
unsignedinti=0,j=0;
voidtimer_init();
voidmain()
{
timer_init();
while
(1);
}
voidtimer_init()
{
TMOD=0x11;
TH0=(65535-50000)/256;//50MS
TL0=(65535-50000)%256;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
ET0=1;ET1=1;
TR0=1;TR1=1;
EA=1;
}
voidtimer0()interrupt1
{
TH0=(65535-50000)/256;//50MS
TL0=(65535-50000)%256;
if(i==10)
{
i=0;
wave1=~wave1;
}
i++;
}
voidtimer1()interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(j==20)
{
j=0;
wave2=~wave2;
}
j++;
}
实验内容2
程序如下:
#include”SST89x5x4.h”
sbitCounter=P1^0;
voidmain()
{
TH1=(65536-10)/256;;
TL1=(65536-10)%256;
TMOD=0X50;
ET1=1;
TR1=1;
EA=1;
while
(1);
}
voidcounter_isr()intertupt3
{
TH1=(65536-10)/256;;
TL1=(65536-10)%256;
Counter=~Counter;
}
实验内容3
程序如下:
#include”SST89x5x4.h”
voidmain()
{
TH2=(65536-50000)/256;
TL2=(65536-50000)%256;
T2CON&=0xfe;
T2MOD|=0x01;
TR2=1;
while
(1)
}
提高部分:
定时器控制LED灯
#include”SST89x5x4.h”
voidmain()
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TMOD=0X11;
ET1=1;
TR1=1;
EA=1;
while
(1)
{
if(flag==1)
{
switch(mode)
{
case1:
{
P1=~0X05;
break;
}
case2:
{
P1=~0X0A;
break;
}
case3:
{
P1=~0X50;
break;
}
case0:
{
P1=~0XA0;
break;
}
}
flag=0;
}
}
unsignedintt,mode;
voidtimer()interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(t==20)
{
t=0;
mode++;
flag=1;
if(mode==4)mode=0;
}
}
实验六:
AD/DA转换实验
基本部分:
程序如下:
A/D部分:
#include”SST89x5x4.h”
#include”absacc.h”
#defineSTARTADXBTYE[0x7f00]
#defineADRESULTXBYTE[0x7f08]
sbitADBUSY=P3^3;
voiddelay()
{
unsignedcharI;
for(i=0;i<100;i++);
}
unsignedcharAD0809()
{
unsignedcharresult;
STARTAD=0;
while(ADBUSY==1);
delay();
result=ADRESULT;
returnresult;
}
voidmain()
{
unsignedcharADV
while
(1)
{
ADV=AD0809();
delay();
}
}
D/A部分:
#include”SST89x5x4.h”
#include”absacc.h”
#defineDAXBYTE[0x7fff]
voidmain()
{
unsignedinti;
while
(1)
{
for(i=0;i<255;i++)
DA=I;
}
}
实验七:
串行通讯实验
基本部分
程序如下:
#include”reg51.h”
#include”stdio.h”
voidInit_Serial()
{
SCON=0X50;
TMOD=(TMOD&0X0F)|0X20;
PCON=0X80;
TH1=0XFD;
TR1=1;
ES=0;
}
voiddelay()
{
unsignedintI;
for(i=0;i<35000;i++);
}
voidmain()
{
Init_Serial();
SBUF=0X00;
while
(1)
{
printf(“WKZQJS.\n”)
delay();
}
}