河南理工基于51最小系统单片机实验.docx
《河南理工基于51最小系统单片机实验.docx》由会员分享,可在线阅读,更多相关《河南理工基于51最小系统单片机实验.docx(18页珍藏版)》请在冰豆网上搜索。
河南理工基于51最小系统单片机实验
微机原理与单片机接口技术
实验报告
专 业 班 级:
姓 名:
学 号:
指 导 教 师:
实验一流水灯实验
一、实验目的
(1)简单I/O引脚的输出
(2)掌握软件延时编程方法
(3)简单按键输入捕获判断
二、实验实现的功能
(1)开机是点亮12发光二极管,闪烁三下
(2)按照顺时针循环依次点亮发光二极管
(3)通过按键将发光二极管的显示改为顺逆时针方式
三、系统硬件设计
四、系统软件设计
#include"at89x51.h"
#defineuintunsignedint
#defineucharunsignedchar
tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfb,0xf7,0xef,0xdf};
tab0[]={0xdf,0xef,0xf7,0xfb,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
tab2[]={0x00,0xff,0x00,0xff,0x00,0xff};
voidshunshi();
uinti;
voiddelay()
{uinti,j;
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{;}
}
voidnishi()
{while
(1)
{uinti;
for(i=0;i<12;i++)
{if(i<4)
{P3=tab0[i];P2=0xff;delay();if(P3_6==0)shunshi();}
else
{P2=tab0[i];P3=0xff;delay();if(P3_6==0)shunshi();}
}
}
}
voidshunshi()
{while
(1)
{P0=0x00;
for(i=0;i<12;i++)
{if(i<8)
{P2=tab[i];P3=0xff;delay();if(P3_6==0)nishi();}
else
{P3=tab[i];P2=0xff;delay();if(P3_6==0)nishi();}}
}
}
voidmain(void)
{uinti;
for(i=0;i<6;i++)
{P2=tab2[i];P3=tab2[i];delay();}
shunshi();
}
五、实验过程中遇到的问题及解决方法
遇到的问题:
1.对于不同端口的12支发光二极管,如何赋值依次点亮它们?
2.如何通过按键去改变流水灯的流向?
解决的方法:
1.通过建立数组,借助if判断语句,分别给各个二极管端口赋值。
2.借助if语句与子函数,通过软件键盘扫描,改变流水灯方向。
指导老师签字:
日期:
实验二定时器或实时时钟实验
1、实验目的
1)掌握定时器T0、T1的方式选择和编程方法
2)了解中断服务程序的设计方法
3)学会实时程序的调试技巧
二完成功能要求
1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能
2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)
三电路图设计
四系统软件设计
#include"AT89X51.h"
#defineuintunsignedint
#defineucharunsignedchar
ucharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharacode[]={0xf7,0xfb,0xfd,0xfe};
tab2[]={0x00,0xff,0x00,0xff,0x00,0xff};
intk1,k2,k3,k4,m1,m2,m3,m4,a;
k1=0;k2=0;k3=0;k4=0;
m1=0;m2=0,m3=0;m4=0;
voiddelay(n)
{uinti,j;
for(i=0;ifor(j=0;j<256;j++)
{;}
}
voidDisshow()
{P0=acode[0];P1=num[m4];delay(10);
P0=acode[1];P1=num[m3];delay(10);
P0=acode[2];P1=num[m2];delay(10);
P0=acode[3];P1=num[m1];delay(10);
}
voidSet_time()
{staticintk1,k2,k3,k4;
if(a==1){k1=k1+1;m1=k1%10;}
if(a==2){k2=k2+1;m2=k2%10;}
if(a==3){k3=k3+1;m3=k3%10;}
if(a==4){k4=k4+1;m4=k4%10;}
if(a==5){EA=1;TMOD=0x10;TH1=0xd8;TL1=0xf0;ET1=1;TR1=1;while
(1){Disshow();};}
}
voidJishi()interrupt3
{staticinti=1;
i++;
TH1=0xd8;TL1=0xf0;
if(i%100==0)
{if(m4>0){m4=m4-1;Disshow();}
elseif(m3>0){m3=m3-1;m4=9;Disshow();}
elseif(m2>0){m2=m2-1;m3=9;m4=9;Disshow();}
elseif(m1>0){m1=m1-1;m2=9;m3=9;m4=9;Disshow();}
else{{P2=0;for(i=0;i<6;i++)
{P2=tab2[i];P3=tab2[i];delay(256);}}while
(1){m1=m2=m3=m4=0;Disshow();}}
}
}
voidmain()
{while
(1)
{Disshow();
P3_6=0;P3_7=1;
if(P0_5==0){delay(256);a=1;Set_time();}
if(P0_6==0){delay(256);a=2;Set_time();}
if(P0_7==0){delay(256);a=3;Set_time();}
P3_6=1;P3_7=0;
if(P0_5==0){delay(256);a=4;Set_time();}
if(P0_6==0){delay(256);a=5;Set_time();}
}
}
5、实验过程中遇到的问题及解决方法
遇到的问题:
按键消抖控制不好,数码管显示不太亮
解决的方法:
适当调控延时时间,加上消抖程序;打开单片机相关寄存器,使P1口为强推挽输出,使数码管高亮。
指导老师签字:
日期:
实验三双机通信实验
1、实验目的
UART串行通信接口技术应用
2、完成功能要求
用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
3实验原理实验图
4、系统软件设计
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitH1=P3^6;
sbitH2=P3^7;
sbitL1=P0^5;
sbitL2=P0^6;
sbitL3=P0^7;
sbitW1=P0^0;
tab1e[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharnum,a,b,c,n;
voidsend();
voiddelay(ucharx)
{
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
voidmain()
{
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TH1=0xf4;
TL1=0xf4;
TR1=1;
W1=0;
while
(1)
{
send();
}
}
voidsend()
{
H1=0;
H2=1;
L1=1;
L2=1;
L3=1;
if(!
L1)
{
delay(5);
if(!
L1)
num=1;
while(!
L1);
}
if(!
L2)
{
delay(5);
if(!
L2)
num=2;
while(!
L2);
}
if(!
L3)
{
delay(5);
if(!
L3)
num=3;
while(!
L3);
}
H1=1;
H2=0;
L1=1;
L2=1;
L3=1;
if(!
L1)
{
delay(5);
if(!
L1)
num=4;
while(!
L1);
}
if(!
L2)
{
delay(5);
if(!
L2)
num=5;
while(!
L2);
}
if(!
L3)
{
delay(5);
if(!
L3)
num=6;
while(!
L3);
}
if(num!
=n)
{
SBUF=num;
while(!
TI);
TI=0;
}
if(RI)
{
c=SBUF;
RI=0;
}
P1=tab1e[c];
}
五、实验过程中遇到的问题及解决方法
遇到的问题:
如何将按键信息互发到对方数码管显示,怎么实现双机通信?
解决的方法:
通过网络上的查询,对有关实验编写好的的程序进行调用,与同学讨论,对程序进行调试后,完成实验,达到实验预期效果。
指导老师签名:
日期:
实验四交通灯实验
一、实验目的
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
二、完成功能要求
1)对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。
2)设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。
3)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
三、电路原理实验图
四、系统软件设计
#include"at89x51.h"
#defineuintunsignedint
#defineucharunsignedchar
uchartable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharzhuhuangdeng[5]={0x5d,0xdf,0x5d,0xdf,0x5d};
ucharcihuangdeng1[5]={0xeb,0xfb,0xeb,0xfb,0xeb};
ucharcihuangdeng2[5]={0x2b,0x3b,0x2b,0x3b,0x2b};
uintnum=0,n,number,k;
ucharsign=0;
voiddelay(uintn)
{
uchari,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
voidshow(uintnumber)
{
uintge;
ge=number%10;
P0_0=1;
P0_1=1;
P0_2=1;
P0_3=0;
P1=table[ge];
delay(10);
}
voiddingshi()
{
TH0=0xd8;
TL0=0xf0;
TMOD=0X01;
TR0=1;
ET0=1;
EA=1;
}
voidled()
{
if(sign)
{
P2=0xdb;
P3=0x1b;
}
else
{uinti;
if(num<=7)
{if(num<=5){P2=0x9e;P3=0x1f;show(7-num);}
else{
for(i=0;i<5;i++){P3=0x1f;P2=zhuhuangdeng[i];delay(100000);delay(100000);}
show(7-num);}}
elseif(num>7&&num<=15)
{if(num<=12){P2=0xf3;P3=0x32;show(15-num);}else{
for(i=0;i<5;i++){P2=cihuangdeng1[i];delay(100000);delay(100000);P3=cihuangdeng2[i];
delay(100000);delay(100000);}
show(15-num);}}
}
}
voidT0_timer()interrupt1
{
TH0=0xd8;
TL0=0xf0;
if(!
P0_5)
delay
(1);
if(!
P0_5)
{
delay
(1);
while(!
P0_5);
sign=~sign;
}
if(num>=15)
num=0;
if(k<=100)
{
k++;
}
else
{
k=0;
num++;
}
}
voidmain()
{
dingshi();
while
(1)
{
led();
}
}
5、实验过程中遇到的问题及解决方法
遇到的问题:
1.如何设计主、次干道二极管的亮灭,并使计数在数码管显示?
2.如何通过按键功能,当按下该键时,所有路口变成红灯,再按下时,解除此状态?
解决的方法:
1.通过对不同发光二极管端口赋值,使其对应路口亮灭,借助子函数,使数码管的倒计时数字按定时器依次显示。
2.借助按键扫描,通过判断状态标志sign,改变四个路口的二极管亮灭情况。
指导老师签字:
日期: