嵌入式实验报告电子表流水灯设计文档格式.docx
- 文档编号:16742160
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:19
- 大小:83.84KB
嵌入式实验报告电子表流水灯设计文档格式.docx
《嵌入式实验报告电子表流水灯设计文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告电子表流水灯设计文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告 电子表 流水 设计