单片机实验报告.docx

上传人:b****3 文档编号:27284400 上传时间:2023-06-28 格式:DOCX 页数:20 大小:33.19KB
下载 相关 举报
单片机实验报告.docx_第1页
第1页 / 共20页
单片机实验报告.docx_第2页
第2页 / 共20页
单片机实验报告.docx_第3页
第3页 / 共20页
单片机实验报告.docx_第4页
第4页 / 共20页
单片机实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机实验报告.docx

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

单片机实验报告.docx

单片机实验报告

微控制器技术实验报告

专业班级:

自动化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();

}

}

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

当前位置:首页 > 高中教育 > 理化生

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

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