单片机实验报告19371857Word格式文档下载.docx
- 文档编号:4156784
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:21
- 大小:20.49KB
单片机实验报告19371857Word格式文档下载.docx
《单片机实验报告19371857Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机实验报告19371857Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
系统设计主要以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结构。
发送功能由sendchar函数完成,接收功能由串口中断实现。
数码管显示与按键扫描函数放在main函数中。
将单片机的串口发送端口、串口接受端口相连(即开发板上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;
同上
使能总中断
ES=1;
使能串口中断
串口发送函数:
voidsendchar(uchardat)
ES=0;
禁止串口中断
SBUF=dat;
一次只能发送一个字节
while(!
TI);
TI=0;
软件清零
ES=1;
voidmain()
a=0;
init();
Display1();
kk=key();
switch(kk)
sendchar(0x01);
sendchar(0x02);
sendchar(0x03);
sendchar(0x04);
sendchar(0x05);
case6:
sendchar(0x06);
Display1();
串口接收中断函数:
voidser()interrupt4
RI=0;
软件清零
a=SBUF;
串口模块不工作,不能够发送接收数据,仔细检查程序发现,是程序初始化配置错误,未开启串口中断所致。
数码管显示与发送数据不一致,使用串口调试助手调试发现,是发送数据格式不对,应该为字符格式,修改后,工作正常。
实验四交通灯实验
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
1)对每个路口(主干道、次干道)的绿灯时间,及黄灯时间的设定。
2)设定参数掉电后不丢失(如果不使用EEPROM,此功能可以不实现)。
3)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
,二排三列矩阵键盘,由单片机P36,P37,P05~P07端口控制。
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.()
time_green=IapReadByte(ADDRESS_green);
time_yellow=IapReadByte(ADDRESS_yellow);
time_zong=time_green;
time_+time_yellow;
T0_init();
T1_init();
EA=1;
switch(k)
case0:
zong_green();
();
;
time_zong=time_yellow;
time_zong=time_green+time_yellow;
time_;
time_();
if(key==6)
key=0;
key值置位
ET0=0;
关闭定时器中断0各路灯停止倒计时
TR0=0;
zong_red();
();
display_STOP();
数码管显示STOP
switch(key)
case6:
key=0;
gotoloop1;
default:
loop1:
ET0=1;
TR0=1;
恢复定时器中断0
if(key==3)3键设置
while
(1)
keyscan();
display_seg(time_green,time_yellow);
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--;
case2:
time_yellow++;
cache=IapReadByte(ADDRESS_green);
IapProgramByte(ADDRESS_yellow,time_yellow);
IapProgramByte(ADDRESS_green,cache);
case5:
time_yellow--;
case3:
gotoloop2;
zong_red();
heng_red();
key=0;
loop2:
ET1=1;
恢复定时器0中断
TR1=1;
恢复定时0开关
数码管显示较暗,怀疑是延时过短所致,修改程序增加延时,显示较为正常。
时间不能够更新,经调试发现,是配置定时器0时与定时器1混叠,导致整体工作不正常,查阅单片机数据手册,逐一检查重新修改,最终定时器1与定时器0工作正常。
EEPROM不能进行写操作,检查程序,对比数据手册上EEPROM操作规范发现,EEPROM写之前要先擦出扇区数据,进行相应修改后,工作正常。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告 19371857