单片机原理及应用实验报告.docx
《单片机原理及应用实验报告.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
单片机原理及应用实验报告
单片机原理及应用
实验报告
实验一:
数组排序练习
实验目的:
练习使用用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依次循环显示。