嵌入式实验报告电子表流水灯设计Word格式.docx

上传人:b****4 文档编号:18045567 上传时间:2022-12-13 格式:DOCX 页数:19 大小:83.85KB
下载 相关 举报
嵌入式实验报告电子表流水灯设计Word格式.docx_第1页
第1页 / 共19页
嵌入式实验报告电子表流水灯设计Word格式.docx_第2页
第2页 / 共19页
嵌入式实验报告电子表流水灯设计Word格式.docx_第3页
第3页 / 共19页
嵌入式实验报告电子表流水灯设计Word格式.docx_第4页
第4页 / 共19页
嵌入式实验报告电子表流水灯设计Word格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

嵌入式实验报告电子表流水灯设计Word格式.docx

《嵌入式实验报告电子表流水灯设计Word格式.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告电子表流水灯设计Word格式.docx(19页珍藏版)》请在冰豆网上搜索。

嵌入式实验报告电子表流水灯设计Word格式.docx

P4.3用来在进入更改时间中断和设置闹钟中断时进行分钟的十位设置。

P4.4用来在进入更改时间中断和设置闹钟中断时进行分钟的个位设置。

P4.5是一个流水灯和蜂鸣器中断。

2.结构图

3.实现的功能

1.实现了利用LCD动态的显示秒数的走动。

2.实现了利用按键中断实现的温度计,更改时间和设置闹钟。

3.实现了通过利用LED灯做成一个流水灯。

4.实现了中断还原,即在进入中断时电子表上的值清空,显示当前中断的内容,当中断结束时LCD还原为进入中断前的电子表时间。

3.电路原理

4.实验步骤

1.了解清楚LCD的工作原理。

2.编写电子表显示程序。

3.了解按键中断原理,并进行设置中断。

4.了解AD转换原理,编写测温度程序,形成温度计。

5.了解按键的过程,编写设置闹钟和更改时间程序。

6.了解LED灯工作原理,编写流水灯程序。

7.把所有的功能加入按键中断里,并了解每个中断的优先级(P3.0优先于P4)。

8.编译程序,编译成功后,连接单片机调试,观察单片机运作。

5.程序流程图

6.实验源代码

#pragmasfr

#pragmainterruptINTKRKEY_duan

#pragmainterruptINTP5yellow_keyRB1

#pragmaDI

#pragmaEI

#pragmaaccess

#defineKEY10xfe

#defineKEY20xfd

#defineKEY60xf9

unsignedintLCD_buff[10]={0x070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0701,0x070f,0x070b};

floattem_num[80][2]={60,1829.8,59,1891.4,58,1955.4,57,2022.0,56,2091.3,55,2163.4,54,2238.8,53,2317.4,52,2399.2,51,2484.5,50,2573.3,49,2665.2,48,2761.1,47,2861.0,46,2965.1,45,3073.8,44,3187.2,43,3305.6,42,3429.2,41,3558.2,40,3692.9,39,3833.2,38,3979.8,37,4132.9,36,4293.1,35,4460.5,34,4635.4,33,4818.4,32,5009.9,31,5210.3,30,5420.2,29,5639.4,28,5869.1,27,6109.8,26,6362.0,25,6626.4,24,6903.4,23,7193.9,22,7498.8,21,7818.8,20,8154.8,19,8506.9,18,8876.9,17,9265.6,16,9674.3,15,10104,14,10553,13,11025,1211521,11,12044,10,12594,9,13173,8,13782,7,14424,6,15102,5,15816,4,16565,3,17355,2,18189,1,19070,0,20000,-1,20980,-2,22025,-3,23109,-4,24267,-5,25492,-6,26777,-7,28137,-8,29577,-9,31103,-10,32720,-11,34434,-12,36252,-13,38181,-14,40229,-15,42404,-16,44696,-17,47131,-18,49719,-19,52472};

unsignedintAD[5];

unsignedinttem[5];

unsignedintdig_buff[2];

unsignedintaddr;

intClock[4]={0,0,0,0};

intChang_clock[4]={0,1,5,0};

voiddelay_long()

{

inti,j;

for(i=0;

i<

=200;

i++)

for(j=0;

j<

200;

j++);

}

voiddelay(){

10;

voidbuz()

intBuzi;

for(Buzi=5;

Buzi>

0;

Buzi--)

CKS=0XE0;

delay();

BZOE=0;

CKS=0x80;

CKS=0xA0;

CKS=0XC0;

voidled(){

inti;

P3.4=1;

for(i=0;

=5;

i++){

P15.1=1;

P15.3=1;

delay_long();

P15.1=0;

P15.3=0;

P13=0x05;

delay_long();

P13.3=1;

P14.1=1;

P13.3=0;

P14.1=0;

P14.2=1;

P15.0=1;

P14.2=0;

P15.0=0;

=3;

P13.0=0x01;

P13=0x00;

P13.1=0x01;

P13.2=0x01;

P13.3=0x01;

P13=0x0;

P14.0=0x01;

P14=0x0;

P14.1=0x01;

P14.2=0x01;

P14.3=0x01;

P14=0x0;

P15.0=0x01;

P15=0x0;

P15.1=0x01;

P15.2=0x01;

P15=0x0;

P15.3=0x01;

//温度计:

在按键中断中,当按键按下,LCD上显示温度度数,出中断后,LCD恢复中断前电

子表运行到的值,接着运行。

voidA_D(){

inti,m,k;

intbuffer[6];

intj=0;

intn=0;

floatai,AD_RI;

ADCE=1;

PM2.5=1;

ADPC0=0x00;

ADM=0x08;

ADCS=1;

addr=0xFA44;

for(k=0;

k<

6;

k++){

buffer[k]=peekw(addr);

addr=addr+2;

for(addr=0xFA44;

addr<

0xFA50;

addr++){

pokew(addr,0x0000);

addr++;

for(m=0;

m<

5;

m++){

ADS=0x05;

AD[m]=ADCR;

ai=(AD[m]/64-0.5)*5/1024;

AD_RI=4*(5.0/ai-1);

while(AD_RI>

tem_num[80][1]&

&

n<

80){n++;

if(n==0||n==80)tem[m]=0xFFFF;

//tem[m]=(int)tem_num[n][0];

tem[m]=AD[m];

for(i=3;

tem[m]!

=0;

i--){

dig_buff[i]=tem[m]%10;

tem[m]=tem[m]/10;

}

pokeb(0xFA52,0x08);

addr=0xFA4A;

while(j<

5){

pokew(addr,LCD_buff[dig_buff[j]]);

j++;

ADCS=0;

ADCE=0;

pokew(addr,buffer[k]);

pokeb(0xFA52,0x00);

voidred()

PM3.3=0;

P3.3=0;

P13.0=1;

delay_long();

BZOE=0;

P13.0=0;

voidyellow()

P13.1=1;

P14.0=1;

P14.3=1;

P15.2=1;

P13.1=0;

P14.0=0;

P14.3=0;

P15.2=0;

voidgreen()

PM3.3=0;

P13.2=1;

P14.1=1;

P15.0=1;

P15.3=1;

CKS=0xC0;

P13.2=0;

voidmiddle()

PM3.4=0;

P3.4=0;

voida()

P3=0x00;

voidb()

P13=0x00;

P14=0x00;

P15=0x00;

voidc()

P14.3=1;

voidd()

voidall()

//用来设置改变时间的值,中断1键进入设置,分别按3,4,5键各几下LCD上显示相应的值,把这个值保存到相应的数组中。

voidChangTime()

inth1,h2,m1,m2;

intaddr;

h1=0;

h2=0;

m1=0;

m2=0;

addr=0xFA44;

while(P4.1!

=0){

if(P4.2==0)

{

P13.0=1;

h1=h1+1;

delay();

if(h1>

=24){h1=0;

else{h2=h1%10;

h1=h1/10;

Chang_clock[0]=h1;

Chang_clock[1]=h2;

pokew(0xFA44,LCD_buff[h1]);

pokew(0xFA46,LCD_buff[h2]);

if(P4.3==0)

P13.1=1;

m1=m1+1;

if(m1>

=6){m1=0;

Chang_clock[2]=m1;

pokew(0xFA48,LCD_buff[m1]);

if(P4.4==0)

P13.2=1;

if(m2>

=10){m2=0;

Chang_clock[3]=m2;

pokew(0xFA4A,LCD_buff[m2]);

}

//设置闹钟,用2键按键中断进入,用3,4,5,键设置时分,分别按3,4,5键各几下LCD上显示相应的值,把这个值保存到相应的数组中。

voidSet_bell()

intk=0;

while(P4.0!

Clock[0]=h1;

Clock[1]=h2;

Clock[2]=m1;

Clock[3]=m2;

}

//中断函数

voidKEY_duan()

DI();

switch(P4)

caseKEY1:

{P1.4=1;

ChangTime();

P1.4=0;

};

break;

//更改时间的按键中断

caseKEY2:

{P1.7=1;

Set_bell();

P1.7=0;

}break;

//闹钟的按键中断

caseKEY6:

{led();

buz();

a();

b();

c();

d();

all();

//流水灯及蜂鸣器的中断

default:

;

//P3.0按键的中断函数

voidyellow_key()

DI();

P1.4=1;

A_D();

P1.4=0;

//电子表的程序,包括实时设置闹钟和更改时间

voidElec_watch()

intg,h,m,n,j,i;

inthour=0;

while

(1){

if(hour>

=24)hour=0;

if(Chang_clock[0]!

g=Chang_clock[0];

Chang_clock[0]=0;

elseg=hour/10;

while(g<

=2){

pokew(0xFA44,LCD_buff[g]);

if(Chang_clock[1]!

h=Chang_clock[1];

Chang_clock[1]=0;

elseh=hour%10;

while(h<

=9){

pokew(0xFA46,LCD_buff[h]);

if(Chang_clock[2]!

m=Chang_clock[2];

Chang_clock[2]=0;

elsem=0;

//yellow();

while(m<

6){

pokew(0xFA48,LCD_buff[m]);

if(Chang_clock[3]!

n=Chang_clock[3];

Chang_clock[3]=0;

elsen=0;

while(n<

pokew(0xFA4A,LCD_buff[n]);

j=0;

if(g==Clock[0]&

h==Clock[1]&

m==Clock[2]&

n==Clock[3]){

while(P4.3!

red();

if(P4.3==0)break;

middle();

pokew(0xFA4C,LCD_buff[j]);

if(Chang_clock[0]!

=0||Chang_clock[1]!

=0||Chang_clock[2]!

=0||Chang_clock[3]!

=0)break;

pokew(0xFA4E,LCD_buff[i]);

pokeb(0xFA53,0x01);

pokeb(0xFA53,0x00);

}if(Chang_clock[0]!

n++;

if(Chang_clock[0]!

m++;

hour++;

voidmain()

//初始化中断端口

PM3.0=1;

PU3.0=1;

EGP.5=1;

PMK5=0;

PM1.4=0;

PM1.7=0;

//初始化

PM13=0x00;

PM14=0x00;

PM15=0x00;

//初始化按键端口

PM4=0xff;

KRM=0x03;

PU4=0xff;

KRMK=0;

//初始化LCD

PF2=0x00;

PFALL=0x0f;

LCDC0=0x34;

LCDMD=0x30;

LCDM=0xc0;

EI();

Elec_watch();

//调用电子表函数

7.实验结果及分析

电子表显示时:

分秒,秒每秒加一到60时分加一,秒变为0,按黄色键LCD上显示XX度,按KEY1进入更改时间中断,分别按P4.2,P4.3,P4.4各几下LCD上显示相应的数字,再按KEY1退出中断,同时电子表显示刚才更改为的时间。

按KEY2进入设置闹钟中断,分别按P4.2,P4.3,P4.4各几下LCD上显示相应的数字,再按KEY2退出中断,同时电子表继续接着中断前的时间运行,当到达闹钟所设时间,会有声音和灯的提醒,按P4.3退出提醒,电子表继续,最好按KEY6进入流水灯中断,单片机上的LED灯流动闪烁,流水灯完成后自动返回电子表。

8.实验中遇到的问题及解决方法

1.由于在AD转换连接的电路不同导致公式算出的电阻偏高,在温度-电阻表中无对应的值,导致显示的温度不准确。

解决方法:

通过试验,自己总结出一套计算电阻的公式代入,得到准确的电阻值,在温度-电阻表中找到相对应的值,显示出较准确的温度。

2.在做更改时间和设置闹钟时,在获取设置值时,出现按得次数与得到的值不符。

通过单步调

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

当前位置:首页 > PPT模板 > 国外设计风格

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

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