单片机原理及应用实验报告.docx

上传人:b****7 文档编号:10317423 上传时间:2023-02-10 格式:DOCX 页数:23 大小:227.75KB
下载 相关 举报
单片机原理及应用实验报告.docx_第1页
第1页 / 共23页
单片机原理及应用实验报告.docx_第2页
第2页 / 共23页
单片机原理及应用实验报告.docx_第3页
第3页 / 共23页
单片机原理及应用实验报告.docx_第4页
第4页 / 共23页
单片机原理及应用实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

单片机原理及应用实验报告.docx

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

单片机原理及应用实验报告.docx

单片机原理及应用实验报告

 

单片机原理及应用

实验报告

 

实验一:

数组排序练习

实验目的:

练习使用用wave6000的“软件模拟器”

实验内容:

编一个排序程序,用wave6000的“软件模拟器”方式仿真,调试、运行。

实验接线图:

由于使用软件模拟器,不需要接线图。

实验程序:

#include

ints[9]={2,4,1,3,5,9,7,8,6};

inti,t,j;

main()

{

for(i=0;i<8;i++)

{

for(j=i+1;j<9;j++)

{

if(s[j]>s[i])

{

t=s[i];

s[i]=s[j];

s[j]=t;

}

}

}

}

实验结果:

程序成功使用“软件模拟器”实现了数组的从大到小排序。

程序运行后数组为9,8,7,6,5,4,3,2,1.

 

实验二:

流水灯控制实验

实验目的:

1.验证性实验,P1口作输出口,接一个LED发光二极管,使其闪烁(0.5秒亮,0.5秒灭)。

2.设计性实验

实验内容:

模拟舞台灯光控制实验

具体要求为P0.0连接按键K1,P1口连接8路LED。

由按键控制LED进行流水灯、闪烁等,从而达到模拟舞台炫耀灯光控制目的

首先,8路LED从右至左流水点亮,具体循环顺序为:

LED1→LED2→……→LED8→LED1,如此重复循环。

按一次键后,8路LED从左至右流水点亮,具体循环顺序为:

LED8→LED7→……→LED1→LED8,如此重复循环;

按两次键后,8路LED交替闪烁,具体循环顺序为:

LED1→LED3→LED5→LED7→LED2→LED4→LED6→LED8→LED1,如此重复循环下去。

按三次键后,回到初始的“从右至左流水点亮”工作状态。

实验接线图:

图3-1流水灯控制

实验程序:

1.

#include

#defineuintunsignedint

voidDelayms(uintx);

main()

{

while

(1)//死循环

{

P1=0xfe;

Delayms(500);//延时0.5秒

}

}

voidDelayms(uintx)//延时函数

{unsignedintn;

for(;x>0;x--)

{for(n=0;n<123;n++)

{;}

}

}

2.#include

#defineucharunsignedchar

#defineuintunsignedint

sbitKey0=P0^0;//位定义

voidDelayms(uintx);

voidScanKey0(void);

ucharFun=0;

main()

{uchari;

Loop:

switch(Fun)

{case0:

for(i=0,P1=0xfe;i<8;i++)

{Delayms(100);P1=(P1<<1)+1;

}

break;

case1:

for(i=0,P1=0x7f;i<8;i++)

{Delayms(100);P1=(P1>>1)+0x80;

}

break;

case2:

for(i=0,P1=0xfe;i<8;i++)

{Delayms(100);P1=(P1<<2)+0x3;

if(i==4)P1=0xfd;

}

break;

}

gotoLoop;

}

voidDelayms(uintx)//延时函数

{uintn;

for(;x>0;x--)

{for(n=0;n<123;n++)

{;}

}

ScanKey0();

}

voidScanKey0(void)

{if(!

Key0)//前面已有延时,可省掉去抖动

Fun++;

if(Fun>2)Fun=0;

}

实验结果:

1.P1口接的LED灯闪烁。

2.初始时流水灯从右往左,按键一次后变为从左往右,再按一次后交替闪烁,按三次后又变回从右往左。

实验三:

中断法实验流水灯控制和数码管动态扫描显示

实验目的:

1.灯的程序中的延时改用定时器(中断方式)实现。

2.数码管动态扫描显示

实验内容:

1.程序中延时使用中断法,实现对流水灯的控制。

2.P0口接数码管的段,P1口接数码管的位,所有数码管的a~h段同名端连在一起,每一个数码管的公共极COM各自独立地受I/O线控制。

任一时刻只有一位显示,依次循环扫描,轮流显示。

实验接线图:

实验程序:

1、#include

#defineucharunsignedchar

sbitKey0=P0^0;

ucharT200ms=4,i=0,k=0;

voidScanKey0(void);

main()

{TMOD=0x01;//T0为方式1定时

EA=1;//允许CPU中断

ET0=1;//允许T0中断

TH0=-50000/256;//50ms初值→TH0:

TL0

TL0=-50000%256;

TR0=1;//启动T0工作

P1=0xfe;

while

(1)

{;//编写其他代码,如键扫描处理

}

}

voidTimer0()interrupt1

{TH0=-50000/256;//初值

TL0=-50000%256;

if(--T200ms==0)

{i++;T200ms=4;

if(k=0){

if(i==8)

{P1=0xfe;i=0;}

else

P1=(P1<<1)+1;

}

}

elseif(k==1){

if(i==8)

{P1=0x7f;i=0;}

else

P1=(P1>>1)+0x80;

}

elseif(k==2){

if(i==8)

{

P1=0xfe;i=0;}

else

P1=(P1<<2)+0x3;

}

}

voidScanKey0(void)

{if(!

Key0)//前面已有延时,可省掉去抖动

k++;

if(k>2)k=0;

}

2.#include

#defineucharunsignedchar

#defineuintunsignedint

voidDsplay();

voidDelayms(uintx);

ucharmDS[6];

ucharcodecDsCode[]=

{0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xf8,0x80,0x90};

voidmain()

{uchari;

for(i=0;i<6;i++)mDS[i]=i+1;

loop:

Dsplay();

gotoloop;

}

voidDsplay()//动态扫描显示

{uchari;

for(i=0,P1=0x01;i<6;i++)

{P0=cDsCode[mDS[i]];//输出段

Delayms

(2);

P1=P1<<1;//选通下一位

}

P1=0x00;//关闭位选通

}

voidDelayms(uintx)

{uintn;

for(;x>0;x--)

{for(n=0;n<123;n++)

{;}

}

}

 

实验四:

电子钟程序设计

实验目的:

设计一个能修改时间的电子钟。

实验内容:

利用动态扫描显示程序实时显示时,分,秒。

并且使用2个键,一个功能切换,一个+1键。

实验接线图:

实验程序:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodedispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xf8,0x80,0x90};

ucharseconde=0;

ucharminite=0;

ucharhour=12;

ucharmstcnt=0;

ucharflag=0;

sbitKey0=P3^0;

voiddelay(uchark);//延时子程序

voidtime_pro();//时间处理子程序

voiddisplay();//显示子程序

voidkeyscan();//键盘扫描子程序

voidScanKey0(void);

voiddelay(uchark)

{

ucharj;

while((k--)!

=0)

{

for(j=0;j<125;j++)

{;}

}

}

voidtime_pro(void)

{

if(seconde==60)//秒钟设为60进制

{seconde=0;

minite++;

if(minite==60)//分钟设为60进制

{minite=0;

hour++;

if(hour==24)//时钟设为24进制

{hour=0;}

}

}

}

voidkeyscan(void)

{

if(flag==0)//秒的调整

{

delay(90);

if(flag==0)

{

seconde++;

if(seconde==60)

{seconde=0;}

}

}

if(flag==1)//分的调整

{

delay(90);

if(flag==0)

{

minite++;

if(minite==60)

{minite=0;}

}

}

if(flag==2)//小时的调整

{

delay(90);

if(flag==0)

{

hour++;

if(hour==24)

{hour=0;}

}

}

}

voiddisplay(void)

{

P1=0xfe;

P2=dispcode[hour/10];//显示小时的十位

delay(4);

P1=0xfd;

P2=dispcode[(hour%10)];//显示小时的个位

delay(4);

P1=0xfb;

P2=dispcode[minite/10];//显示分的十位

delay(4);

P1=0xf7;

P2=dispcode[minite%10];//显示分的个位

delay(4);

P1=0xef;

P2=dispcode[seconde/10];//显示秒的十位

delay(4);

P1=0xdf;

P2=dispcode[seconde%10];//显示秒的个位

delay(4);

}

voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次

{

TH0=0x3c;

TMOD=0x11;

mstcnt++;

if(mstcnt==20)

{

seconde++;

mstcnt=0;

}

}

voidScanKey0(void)

{if(!

Key0)

flag++;

if(flag>2)flag=0;

}

voidmain(void)

{

TMOD=0x11;//time0为定时器,方式1

TH0=0x3c;//预置计数初值

TL0=0xb0;

EA=1;

ET0=1;

TR0=1;

while

(1)

{

ScanKey0();

keyscan();//按键扫描

time_pro();//时间处理

display();//显示时间

}

}

实验结果:

数码管可以显示时钟的时分秒,按下按键1,可以在时钟的时分秒为切换,按下按键2,可以在选择的任意位+1,从而实现时间的修改。

实验五:

存储器系统设计

实验目的:

掌握存储器工作原理及特点。

通过该实验让学生掌握单片机存储器系统的硬件设计,存储器在系统中的地址分配,地址总线、数据总线与控制总线的连接。

实验内容:

1.在实验板上将一片6264RAM芯片设计成8K的外部数据存储器,地址为0000H—1FFFH。

2.设计一个全“0”检查程序,即先将外部数据存储器0000H—1FFFH单元全部置“0”,然后将此8K单元的内容逐一读出,若全为“0”,则芯片测试通过;否则遇到第一个非“0”单元,则通过P1.0点亮LED8。

实验接线图:

实验程序:

#include

#define uchar unsigned char

uchar xdata *p,x,i;

void main()

{

for(i=0;i<8192;i++)

{

*p=0x00;

x=*p;

if(x!

=0x00)

{

P1=0xfe;

break;

}

else P1=0xfd;

*p++;}

}

实验结果:

观察数据窗口,当8K单元内数据全为0时,LED灯亮。

 

实验六:

MCS-51I/O接口设计与应用

实验目的:

通过该实验让学生掌握单片机I/O接口的功能与特点;熟悉8255的使用方法及其接口扩展设计的原理和方法。

实验内容:

.扩展一片8255,地址自定

.用8255的两个口分别作为LED显示器的段选择与位控制,连好硬件电路。

.将实验板上的按键K8挂在P1.0上

.编程实现:

.每按一次K8键使“8”从显示器DS1~DS6依次循环显示。

.利用定时器中断,每隔1秒使“5”从DS6~DS1依次循环显示。

实验接线图:

实验程序:

1.#include

#defineuintunsignedint

#include

#definePAXBYTE[0x0000]//定义PA为外部RAM地址为0x0000的单元

#definePBXBYTE[0x0001]//定义B口

#definePCXBYTE[0x0002]//定义C口

#defineCONXBYTE[0x0003]//定义控制口

sbitkey8=P1^0;

voidDsplay();

voidDelayms(uintx);

main()

{

CON=0x80;

loop:

Dsplay();

gotoloop;

}

voidDsplay()//动态扫描显示

{PA=0x20;

if((key8&0x07)==0)

Delayms(10);

{PB=0x80;

PA=PA<<1;//选通下一位

}

PA=0x00;//关闭位选通

}

voidDelayms(uintx)

{uintn;

for(;x>0;x--)

{for(n=0;n<123;n++)

{;}

}

}

2.#include

#include

#definePAXBYTE[0x0000]//定义PA为外部RAM地址为0x0000的单元

#definePBXBYTE[0x0001]//定义B口

#definePCXBYTE[0x0002]//定义C口

#defineCONXBYTE[0x0003]//定义控制口

#defineucharunsignedchar

#defineuintunsignedint

ucharm=20;

Main()

{

CON=0x80;//A口出,B口出

TMOD=0x10;

EA=1;

ET1=1;

TH1=-50000/256;

TL1=-50000%256;

TR1=1;

while

(1){;}

}

voidtimer1()interrupt3

{

TH1=-50000/256;

TL1=-50000%256;

if(--m==0)

{

PB=0x01;

PA=0x92;//输出段

PB=PB<<1;//选通下一位

PB=0x00;//关闭位选通

m=20;

}

TF1=0;

}

实验结果:

在实验1中,每按一次按键8,“8”从显示器DS1~DS6依次循环显示。

在实验2中,每隔1秒

实验七:

A/D接口(ADC0809芯片)设计。

实验目的:

ADC0809采样通道7输入的模拟量,转换后的结果显示在数码管上。

实验内容:

按实验指导书中实验板的电路图接好电路,编辑程序,是ADC0809采样通道7输入的模拟量,转换后的结果显示在数码管上。

实验接线图:

实验程序:

#include

#defineucharunsignedchar

#defineuintunsignedint

uchartime[3];

ucharxdata*pa,xdata*pb,xdata*pcon;

voidDelayms(uintx);

voidDsplay();

ucharcodecDsCode[]=

{0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xf8,0x80,0x90};

main()

{ucharx1,xdata*p;

p=0x7ff0;//对应:

A15=0,A2:

A0=000

*p=0x00;//接通IN0,并启动转换

Delayms

(1);//调用延时函数,延时1ms

x1=*p;//转换值送x1

time[0]=x1/100;

time[1]=(x1%100)/10;

time[2]=x1%10;

Dsplay();

while

(1);

}

voidDsplay()//动态扫描显示

{uchari;

pcon=0x0003;*pcon=0x80;pa=0x0000;pb=0x0001;

for(i=0,*pa=0x01;i<3;i++)

{*pb=cDsCode[time[i]];//输出段

Delayms

(2);

*pa=*pa<<1;//选通下一位

}

*pa=0x00;//关闭位选

}

voidDelayms(uintx)//延时函数

{uintn;

for(;x>0;x--)

{for(n=0;n<123;n++)

{;}

}

}

实验结果:

IN7口的模拟电压转换的数据在数码管上显示出来。

“5”从DS6~DS1依次循环显示。

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

当前位置:首页 > 外语学习 > 日语学习

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

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