单片机实验报告19371857.docx

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

单片机实验报告19371857.docx

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

单片机实验报告19371857.docx

单片机实验报告19371857

目录

实验一流水灯实验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;//恢复定时器0中断

TR1=1;//恢复定时0开关

}

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

当前位置:首页 > 工程科技 > 材料科学

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

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