单片机实验报告19371857文档格式.docx

上传人:b****4 文档编号:6644048 上传时间:2023-05-07 格式:DOCX 页数:21 大小:20.49KB
下载 相关 举报
单片机实验报告19371857文档格式.docx_第1页
第1页 / 共21页
单片机实验报告19371857文档格式.docx_第2页
第2页 / 共21页
单片机实验报告19371857文档格式.docx_第3页
第3页 / 共21页
单片机实验报告19371857文档格式.docx_第4页
第4页 / 共21页
单片机实验报告19371857文档格式.docx_第5页
第5页 / 共21页
单片机实验报告19371857文档格式.docx_第6页
第6页 / 共21页
单片机实验报告19371857文档格式.docx_第7页
第7页 / 共21页
单片机实验报告19371857文档格式.docx_第8页
第8页 / 共21页
单片机实验报告19371857文档格式.docx_第9页
第9页 / 共21页
单片机实验报告19371857文档格式.docx_第10页
第10页 / 共21页
单片机实验报告19371857文档格式.docx_第11页
第11页 / 共21页
单片机实验报告19371857文档格式.docx_第12页
第12页 / 共21页
单片机实验报告19371857文档格式.docx_第13页
第13页 / 共21页
单片机实验报告19371857文档格式.docx_第14页
第14页 / 共21页
单片机实验报告19371857文档格式.docx_第15页
第15页 / 共21页
单片机实验报告19371857文档格式.docx_第16页
第16页 / 共21页
单片机实验报告19371857文档格式.docx_第17页
第17页 / 共21页
单片机实验报告19371857文档格式.docx_第18页
第18页 / 共21页
单片机实验报告19371857文档格式.docx_第19页
第19页 / 共21页
单片机实验报告19371857文档格式.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机实验报告19371857文档格式.docx

《单片机实验报告19371857文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实验报告19371857文档格式.docx(21页珍藏版)》请在冰点文库上搜索。

单片机实验报告19371857文档格式.docx

系统设计主要以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写之前要先擦出扇区数据,进行相应修改后,工作正常。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2