单片机实验报告19371857.docx
- 文档编号:4878382
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:19
- 大小:21.04KB
单片机实验报告19371857.docx
《单片机实验报告19371857.docx》由会员分享,可在线阅读,更多相关《单片机实验报告19371857.docx(19页珍藏版)》请在冰豆网上搜索。
单片机实验报告19371857
(此文档为word格式,下载后您可任意编辑修改!
)
目录
实验一流水灯实验1
一、实验目的1
二、实验实现的功能1
三、系统硬件设计1
四、系统软件设计2
五、实验过程中遇到的问题及解决方法2
实验二定时器或实时时钟实验3
一、实验目的3
二、实验实现的功能3
三、系统硬件设计3
四、系统软件设计3
五、实验过程中遇到的问题及解决方法3
实验三双机通信实验4
一、实验目的4
二、实验实现的功能4
三、系统硬件设计4
四、系统软件设计4
五、实验过程中遇到的问题及解决方法4
实验四交通灯实验5
一、实验目的5
二、实验实现的功能5
三、系统硬件设计5
四、系统软件设计5
五、实验过程中遇到的问题及解决方法5
实验一流水灯实验
1、实验目的
1)简单I/O引脚的输出
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>0;j--);
}
unsignedcharkey()
{unsignedchark=0;
P0|=0xe0;
P3&=0x3f;
if((P0&0xe0)!
=0xe0)
{DelayMS(100);
P0|=0xe0;
if((P0&0xe0)!
=0xe0)
{P3|=0xc0;
P3&=0x7f;
switch(P0&0xe0)
{
case0xe0:
break;
case0x60:
k=6;break;
case0xa0:
k=5;break;
case0xc0:
k=4;break;
}
P3|=0xc0;
P3&=0xbf;
switch(P0&0xe0)
{
case0xe0:
break;
case0x60:
k=3;break;
case0xa0:
k=2;break;
case0xc0:
k=1;break;
}
}
while((P0&0xe0)!
=0xe0)
{
P0&=0xe0;
W1=0;
W2=!
W2;
}
}
returnk;
}
main()
{
//P2=0Xfb;
uchari,k;
for(i=4;i>0;i--)
{
P2=0X00;
LED9=0;
LED10=0;
LED11=0;
LED12=0;
DelayMS(300);
P2=0XFF;
LED9=1;
LED10=1;
LED11=1;
LED12=1;
DelayMS(300);
}
P2=0XFE;
DelayMS(300);
for(i=7;i>0;i--)
{P2=_crol_(P2,1);
DelayMS(300);
}
if(k==2)
{for(i=4;i>0;i--)
{
P2=code7[0];
LED9=0;
LED10=1;
LED11=0;
LED12=1;
DelayMS(300);
P2=0XFF;
LED9=1;
LED10=1;
LED11=1;
LED12=1;
DelayMS(300);
P2=code7[1];
LED9=1;
LED10=0;
LED11=1;
LED12=0;
DelayMS(300);
P2=0XFF;
LED9=1;
LED10=1;
LED11=1;
LED12=1;
DelayMS(300);
}
}
}
}
5、实验过程中遇到的问题及解决方法
按键扫描返回值错误,经仔细调试,发现未加按键释放检测语句;
LED最初显示时间较短,亮度较暗,修改延时程序,增长延时时间得以解决。
调试过程中经常存在个别LED显示异常,仔细检查程序发现是程序控制语句错误。
经过修改,问题得以解决。
指导老师签字:
日期:
实验二定时器或实时时钟实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
二、实验实现的功能
1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。
2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
上述二个功能至少完成一种功能。
三、系统硬件设计
系统设计主要以51核心板为基础,利用板上已有资源进行开发设计。
使用外部资源主要有:
D1~D12三色LED显示灯,分别对应单片机P20~P27,P32~P35端口;二排三列矩阵键盘,由单片机P36,P37,P05~P07端口控制。
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;//打开定时开关
}
主函数:
main()
{
T1_init();
//P0=0xff;
while
(1)
{
keyscan();
//k=key();
switch(k)
{
caseKM:
//无任何按键按下默认为0返回
{
Display1();
break;
}
case1:
{
time+=10;//1键设置十位加
time=time%99;//最大值99取余循环
Display1();//实时显示
k=KM;//键值置位避免重复执行可否删去待验证
break;
}
case4:
{
time-=10;//4键设置十位减
if(time<=0)time=0;
time=time%99;
Display1();
k=KM;
break;
}
case2:
{
time+=1;//2键设置个位加
time=time%99;
Display1();
k=KM;
break;
}
case5:
{
time-=1;//5键设置个位减
if(time<=0)time=0;
time=time%99;
Display1();
k=KM;
break;
}
case3:
//3键确定开启定时器、中断
{
//second=time;
T1_star();
Display1();
k=KM;
break;
}
default:
break;
}
}
}
中断函数:
voidtim(void)interrupt1using1
{
ET0=0;
TR0=0;//关闭中断保证程序顺利运行
TH0=0x0dc;//重新赋值
TL0=0x00;
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串行通信接口技术应用
二、实验实现的功能
用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
三、系统硬件设计
系统设计主要以51核心板为基础,利用板上已有资源进行开发设计。
使用外部资源主要有:
二排三列矩阵键盘,由单片机P36,P37,P05~P07端口控制。
4位8段共阴数码管,位选由单片机P00~P03端口控制,段选由P1端口控制。
使用的单片机内部资源主要有:
定时器模块;串口收发模块;串口中断模块;
四、系统软件设计
程序主要有:
定时器初始化模块,串口收发初始化模块,数码管显示模块;按键扫描模块;
定时器采用T1定时器,工作方式为模式2,自动重装初值。
针对不同的键值发送相应的数值,采用switch结构。
发送功能由sendchar函数完成,接收功能由串口中断实现。
数码管显示与按键扫描函数放在main函数中。
预期效果:
开机后数码管显示00;将单片机的串口发送端口、串口接受端口相连(即开发板上T与R口)。
按下按键1~6任意一个,则数码管显示相应数字。
(备注:
刚开机按下1键可能显示不对,按几个别的按键后,工作正常,之后都不会出现问题)
定时器串口初始化函数:
voidinit()
{
TMOD=0x20;//设定T1定时器工作方式2
TH1=0xfd;//T1定时器装初值
TL1=0xfd;//
TR1=1;//启动T1定时器
REN=1;//允许串口接收
SM0=0;//设定串口工作方式1
SM1=1;//同上
EA=1;//使能总中断
ES=1;//使能串口中断
}
串口发送函数:
voidsendchar(uchardat)
{
ES=0;//禁止串口中断
SBUF=dat;//一次只能发送一个字节
while(!
TI);
TI=0;//软件清零
ES=1;
}
主函数:
voidmain()
{
a=0;
init();
while
(1)
{
Display1();
kk=key();
switch(kk)
{
case1:
sendchar(0x01);break;
case2:
sendchar(0x02);break;
case3:
sendchar(0x03);break;
case4:
sendchar(0x04);break;
case5:
sendchar(0x05);break;
case6:
sendchar(0x06);break;
default:
Display1();break;
}
}
}
串口接收中断函数:
voidser()interrupt4
{
RI=0;//软件清零
a=SBUF;
}
五、实验过程中遇到的问题及解决方法
串口模块不工作,不能够发送接收数据,仔细检查程序发现,是程序初始化配置错误,未开启串口中断所致。
数码管显示与发送数据不一致,使用串口调试助手调试发现,是发送数据格式不对,应该为字符格式,修改后,工作正常。
指导老师签字:
日期:
实验四交通灯实验
一、实验目的
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
二、实验实现的功能
1)对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。
2)设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。
3)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
三、系统硬件设计
系统设计主要以51核心板为基础,利用板上已有资源进行开发设计。
使用外部资源主要有:
D1~D12三色LED显示灯,分别对应单片机P20~P27,P32~P35端口;,二排三列矩阵键盘,由单片机P36,P37,P05~P07端口控制。
4位8段共阴数码管,位选由单片机P00~P03端口控制,段选由P1端口控制。
使用的单片机内部资源主要有:
定时器模块;中断模块;EEPROM;
预期效果:
开启电源后,系统开始工作,数码管左边2位显示纵向剩余时间,数码管右两位显示横向剩余时间。
默认绿灯时间5s,黄灯时间3s;
按下设置键3,数码管显示绿灯、黄灯时间,这时可通过键1(+)键4(-)设置绿灯时间,键2(+)键5(-)设置黄灯时间,设置好后,再次按下设置键键3,红绿灯时间修改完成。
关闭电源,从新打开设置过的红绿灯时间不会丢失。
按下紧急键键6,所有路口变为红灯。
四、系统软件设计
将相应模块封装放在相应的H头文件、C文件中,主要有jiaotongdeng.c、seg.c、led.c、timer.c、keyscan.c、EEPROM.c几部分。
定时器中断0更新时间,定时器中断1用来定时扫描按键。
EEPROM操作采用官网例程,将相应函数封装在EEPROM.c中,EEPROM.h进行相关声明,主函数中操作时直接调用相应函数即可。
主函数:
voidmain()
{
time_green=IapReadByte(ADDRESS_green);
time_yellow=IapReadByte(ADDRESS_yellow);
time_zong=time_green;
time_heng=time_green+time_yellow;
T0_init();
T1_init();
EA=1;
while
(1)
{
switch(k)
{
case0:
zong_green();heng_red();break;
case1:
zong_yellow();break;
case2:
zong_red();heng_green();break;
case3:
heng_yellow();break;
default:
break;
}
display_seg(time_zong,time_heng);
}
}
定时器0中断函数:
voidint0(void)interrupt1//using2
{
ET0=0;//关闭中断保证程序顺利运行
TR0=0;
TH0=0x0dc;//重新赋值
TL0=0x00;
count++;
if(count==100)
{
count=0;
time_zong--;
time_heng--;
if(time_zong==0||time_heng==0)
{
k++;
if(k>3)k=0;
switch(k)
{
case0:
time_zong=time_green;time_heng=time_green+time_yellow;break;
case1:
time_zong=time_yellow;break;
case2:
time_zong=time_green+time_yellow;time_heng=time_green;break;
case3:
time_heng=time_yellow;break;
}
}
}
ET0=1;//开启中断
TR0=1;
}
定时器1中断函数:
voidint1(void)interrupt3//using1
{
ET1=0;//关定时器1中断
TR1=0;//关定时1开关
TH1=0x0dc;
TL1=0x00;
keyscan();
if(key==6)
{
key=0;//key值置位
ET0=0;//关闭定时器中断0各路灯停止倒计时
TR0=0;
zong_red();heng_red();
while
(1)
{
keyscan();
display_STOP();//数码管显示STOP
switch(key)
{
case6:
key=0;gotoloop1;break;
default:
break;
}
}
loop1:
ET0=1;TR0=1;//恢复定时器中断0
}
if(key==3)//3键设置
{
key=0;//key值置位
ET0=0;//关闭定时器中断0各路灯停止倒计时
TR0=0;
while
(1)
{
keyscan();
display_seg(time_green,time_yellow);
switch(key)
{
case1:
{
time_green++;
cache=IapReadByte(ADDRESS_yellow);//IAP_ADDRESS+1存放time_yellow
//IAP_ADDRESS存放time_green
IapEraseSector(IAP_ADDRESS);
IapProgramByte(ADDRESS_green,time_green);
IapProgramByte(ADDRESS_yellow,cache);
//while
(1){display_seg(IapReadByte(ADDRESS_green),IapReadByte(ADDRESS_yellow));}
key=0;
break;
}
case4:
{
time_green--;
cache=IapReadByte(ADDRESS_yellow);
IapEraseSector(IAP_ADDRESS);
IapProgramByte(ADDRESS_green,time_green);
IapProgramByte(ADDRESS_yellow,cache);
key=0;break;
}
case2:
{
time_yellow++;
cache=IapReadByte(ADDRESS_green);
IapEraseSector(IAP_ADDRESS);
IapProgramByte(ADDRESS_yellow,time_yellow);
IapProgramByte(ADDRESS_green,cache);
key=0;break;
}
case5:
{
time_yellow--;
cache=IapReadByte(ADDRESS_green);
IapEraseSector(IAP_ADDRESS);
IapProgramByte(ADDRESS_yellow,time_yellow);
IapProgramByte(ADDRESS_green,cache);
key=0;break;
}
case3:
key=0;gotoloop2;break;//zong_red();heng_red();key=0;
default:
break;
}
}
loop2:
ET0=1;TR0=1;//恢复定时器中断0
}
ET1=1;//恢复
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告 19371857