单片机实验报告19371857.docx

上传人:b****4 文档编号:4878382 上传时间:2022-12-11 格式:DOCX 页数:19 大小:21.04KB
下载 相关 举报
单片机实验报告19371857.docx_第1页
第1页 / 共19页
单片机实验报告19371857.docx_第2页
第2页 / 共19页
单片机实验报告19371857.docx_第3页
第3页 / 共19页
单片机实验报告19371857.docx_第4页
第4页 / 共19页
单片机实验报告19371857.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机实验报告19371857.docx

《单片机实验报告19371857.docx》由会员分享,可在线阅读,更多相关《单片机实验报告19371857.docx(19页珍藏版)》请在冰豆网上搜索。

单片机实验报告19371857.docx

单片机实验报告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;//恢复

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1