单片机实验报告19371857Word格式.docx
《单片机实验报告19371857Word格式.docx》由会员分享,可在线阅读,更多相关《单片机实验报告19371857Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
二、实验实现的功能5
三、系统硬件设计5
四、系统软件设计5
五、实验过程中遇到的问题及解决方法5
实验一流水灯实验
1、实验目的
1)简单IO引脚的输出
2)掌握软件延时编程方法
3)简单按键输入捕获判断
二、实验实现的功能
1)开机是点亮12发光二极管,闪烁三下
2)按照顺时针循环依次点亮发光二极管
3)通过按键将发光二极管的显示改为顺逆时针方式
三、系统硬件设计
系统设计主要以51核心板为基础,使用资源主要有:
D1~D12三色LED显示灯,分别对应单片机P20~P27,P32~P35端口;
二排三列矩阵键盘,由单片机P36,P37,P05~P07端口控制。
四、系统软件设计
程序主要分为两大模块,按键扫描与LED显示,按键扫描部分放在key()函数内,返回键值。
LED显示放在主函数main()中。
通过for循环实现多次显示,延时函数来控制显示时间。
预期效果:
开机后所有LED闪烁,接着顺时针流动,结束后,按下1键LED逆时针流动,按下2键所有LED闪烁。
部分源代码:
voidDelayMS(uintxms)
{
uinti,j;
for(i=xms;
i>
0;
i--)
for(j=300;
j>
j--);
}
unsignedcharkey()
{unsignedchark=0;
P0|=0xe0;
P3&
=0x3f;
if((P0&
0xe0)!
=0xe0)
{DelayMS(100);
P0|=0xe0;
if((P0&
{P3|=0xc0;
P3&
=0x7f;
switch(P0&
0xe0)
{
case0xe0:
break;
case0x60:
k=6;
break;
case0xa0:
k=5;
case0xc0:
k=4;
}
P3|=0xc0;
=0xbf;
k=3;
k=2;
k=1;
}
while((P0&
{
P0&
=0xe0;
W1=0;
W2=!
W2;
}
returnk;
}
main()
P2=0Xfb;
uchari,k;
for(i=4;
{
P2=0X00;
LED9=0;
LED10=0;
LED11=0;
LED12=0;
DelayMS(300);
P2=0XFF;
LED9=1;
LED10=1;
LED11=1;
LED12=1;
}
P2=0XFE;
for(i=7;
{P2=_crol_(P2,1);
}
if(k==2)
{for(i=4;
{
P2=code7[0];
LED9=0;
LED10=1;
LED11=0;
LED12=1;
DelayMS(300);
P2=0XFF;
LED9=1;
LED11=1;
P2=code7[1];
LED10=0;
LED12=0;
}
5、实验过程中遇到的问题及解决方法
按键扫描返回值错误,经仔细调试,发现未加按键释放检测语句;
LED最初显示时间较短,亮度较暗,修改延时程序,增长延时时间得以解决。
调试过程中经常存在个别LED显示异常,仔细检查程序发现是程序控制语句错误。
经过修改,问题得以解决。
指导老师签字:
日期:
实验二定时器或实时时钟实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。
2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
上述二个功能至少完成一种功能。
系统设计主要以51核心板为基础,利用板上已有资源进行开发设计。
使用外部资源主要有:
4位8段共阴数码管,位选由单片机P00~P03端口控制,段选由P1端口控制。
使用的单片机内部资源主要有:
定时器模块;
中断模块;
程序主要有:
定时器配置与中断函数、数码管显示、按键扫描、LED显示四大模块。
定时器采用T1定时器,工作方式为模式1。
按键指令的执行才用switch结构,相应的键值执行相应的指令。
中断函数内更新时间值time,数码管显示指令放在main函数中。
开机后数码管显示00;
这时通过按键设置倒计时初值(最大值99),1键4键分别为+-10,2键5键分别为+—1;
设置好初值,按下确定键3,开始倒计时。
计时结束,LED灯闪烁,并等待下一次计时。
定时器初始化、开始函数
voidT1_init()
TMOD|=0x01;
定时器设置10msin12Mcrystal,工作在模式1,16位定时
TH0=0x0dc;
TL0=0x00;
EA=1;
开总中断
voidT1_star()
ET0=1;
开定时器0中断
TR0=1;
打开定时开关
主函数:
T1_init();
P0=0xff;
while
(1)
{
keyscan();
k=key();
switch(k)
caseKM:
无任何按键按下默认为0返回
Display1();
break;
case1:
time+=10;
1键设置十位加
time=time%99;
最大值99取余循环
实时显示
k=KM;
键值置位避免重复执行可否删去待验证
case4:
time-=10;
4键设置十位减
if(time<
=0)time=0;
case2:
time+=1;
2键设置个位加
case5:
time-=1;
5键设置个位减
if(time<
time=time%99;
case3:
3键确定开启定时器、中断
second=time;
T1_star();
Display1();
k=KM;
break;
default:
中断函数:
voidtim(void)interrupt1using1
ET0=0;
TR0=0;
关闭中断保证程序顺利运行
重新赋值
count++;
if(count==100)
count=0;
time--;
second秒减1
if(time==0)second
{这里添加定时到0的代码,可以是灯电路,继电器吸合等,或者执行一个程序
time=0;
second减到0是重新赋值99
light();
if(time!
=0)
{ET0=1;
TR0=1;
}定时时间未到需要恢复中断
五、实验过程中遇到的问题及解决方法
按键4和5的减功能不能实现,经调试发现,是按键扫描程序的问题,未加释放检测语句,修改后,问题解决。
数码管不能够显示,推测是延时较短所致,增加延时时间问题得以解决。
倒计时结束后,LED显示不正常,并且不能够复位,过程只能执行一次,仔细检查程序,发现是由于中断程序内没有屏蔽中断响应,造成程序跑飞所致,经过修改,为题解决。
实验三双机通信实验
UART串行通信接口技术应用
用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
串口收发模块;
串口中断模块;
程序主要有:
定时器初始化模块,串口收发初始化模块,数码管显示模块;
按键扫描模块;
定时器采用T1定时器,工作方式为模式2,自动重装初值。
针对不同的键值发送相应的数值,采用switch结构。
发送功能