1、嵌入式实验报告电子表流水灯设计 山 西 大 学计算机组装与维护论文题 目 电子表设计 学 院 计算机与信息技术学院 专 业 软件工程 指导教师 李月香 学生姓名 曹艳艳 学 号 2008242001 日 期 2010-12-10 电子表设计 内容提要: LCD 电视是 Liquid Crystal Display 的简称,是液晶显示屏的全称:它包括了TFT,UFB,TFD,STN等类型的液晶显示屏。 LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。 1888年奥地利植物学家发现了一种白浊
2、有粘性的液体,后来,德国物理学家发现了这种白浊物质具有多种弯曲性质,认为这种物质是流动性结晶的一种,由此而取名为Liquid Crystal即液晶LCD显示器是智能仪器仪表中最常用的显示器件。近年来一些单片机内部也集成了LCD控制级驱动电路,更方便了单片机在嵌入式系统中的应用,特别是微功耗智能化仪器仪表上的应用。关键词: LCD 工作原理 应用 发展参考文献: 1嵌入式系统应用基础。 2. XX百科。一、实验目的 1.熟练掌握单片机控制系统硬件电路的设计、测试;单片机监控程序的编写、调试及运行。 2.学习使用单片机设计出简单的应用系统。二、实验设备 1 PC计算机;2 NEC全系列微控制器(单
3、片机)开发工具EM/EZ-1系统;3 实验系统。3、实验内容及要求1.设计方案 本次使用主要使用了LCD,做了一个电子表。 主函数显示电子表。 P3.0按键中断用来测温度并在LCD上显示。 P4.0按键中断用来进入更改时间的中断。 P4.1按键中断用来进入设置闹钟的中断。 P4.2用来在进入更改时间中断和设置闹钟中断时进行小时的设置。 P4.3用来在进入更改时间中断和设置闹钟中断时进行分钟的十位设置。 P4.4用来在进入更改时间中断和设置闹钟中断时进行分钟的个位设置。 P4.5是一个流水灯和蜂鸣器中断。2.结构图 3.实现的功能1.实现了利用LCD动态的显示秒数的走动。2.实现了利用按键中断实
4、现的温度计,更改时间和设置闹钟。3.实现了通过利用LED灯做成一个流水灯。4.实现了中断还原,即在进入中断时电子表上的值清空,显示当前中断的内容,当中断结束时LCD还原为进入中断前的电子表时间。3.电路原理 4.实验步骤1 了解清楚LCD的工作原理。2 编写电子表显示程序。3 了解按键中断原理,并进行设置中断。4 了解AD转换原理,编写测温度程序,形成温度计。5 了解按键的过程,编写设置闹钟和更改时间程序。6 了解LED灯工作原理,编写流水灯程序。7 把所有的功能加入按键中断里,并了解每个中断的优先级(P3.0优先于P4)。8 编译程序,编译成功后,连接单片机调试,观察单片机运作。5.程序流程
5、图 6.实验源代码#pragma sfr #pragma interrupt INTKR KEY_duan#pragma interrupt INTP5 yellow_key RB1 #pragma DI#pragma EI#pragma access#define KEY1 0xfe #define KEY2 0xfd#define KEY6 0xf9unsigned int LCD_buff10=0x070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0701,0x070f,0x070b;float tem_num802=60,1829.8,5
6、9,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,2
7、9,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,-
8、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;unsigned int AD5;unsigned int tem5;unsigned int dig_buff2;unsigned int addr;int Clock4=0,0,0,0;int Chang_clock4=0,1,5,0;void delay_long() int i,j;
9、for(i=0;i=200;i+) for(j=0;j200;j+);void delay() int i,j; for(i=0;i=200;i+) for(j=0;j0;Buzi-) CKS=0XE0; delay();BZOE=0;CKS=0x80; delay();BZOE=0; CKS=0xA0; delay();BZOE=0;CKS=0x80; delay();BZOE=0; CKS=0XC0; delay();BZOE=0;CKS=0xA0; delay();BZOE=0;CKS=0XE0; delay();BZOE=0;CKS=0XC0; delay();BZOE=0;void
10、led()int i;P3.4=1; for(i=0;i=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;delay_long();P13.3=0;P14.1=0;P14.2=1; P15.0=1;delay_long();P14.2=0;P15.0=0;for(i=0;i=3;i+) P13.0 = 0x01; delay_long();P13 = 0x00; P13.1 = 0x01; delay_long();P13 = 0x00; P13.2 =
11、0x01; delay_long();P13 = 0x00; P13.3 = 0x01; delay_long(); P13 = 0x0; P14.0 = 0x01; delay_long();P14 = 0x0; P14.1 = 0x01; delay_long();P14 = 0x0; P14.2 = 0x01; delay_long();P14 = 0x0; P14.3 = 0x01; delay_long(); P14 = 0x0; P15.0 = 0x01; delay_long();P15 = 0x0; P15.1 = 0x01; delay_long();P15 = 0x0; P
12、15.2 = 0x01;delay_long(); P15 = 0x0;P15.3 = 0x01;delay_long();P15 = 0x0;/温度计:在按键中断中,当按键按下,LCD上显示温度度数 ,出中断后,LCD恢复中断前电子表运行到的值,接着运行。void A_D()int i,m,k;int buffer6;int j=0;int n=0;float ai,AD_RI;ADCE=1;PM2.5=1;ADPC0=0x00;ADM=0x08;ADCS=1;addr=0xFA44;for(k=0;k6;k+) bufferk=peekw(addr); addr=addr+2;for(ad
13、dr=0xFA44;addr0xFA50;addr+) pokew(addr,0x0000); addr+;for(m=0;mtem_num801&n80)n+; if(n=0|n=80)temm=0xFFFF; /temm=(int)tem_numn0; temm=ADm; for(i=3;temm!=0;i-) dig_buffi=temm%10; temm=temm/10; pokeb(0xFA52,0x08); addr=0xFA4A; while(j5) pokew(addr,LCD_buffdig_buffj); addr=addr+2; j+; delay_long();dela
14、y_long();ADCS=0;ADCE=0; addr=0xFA44;for(k=0;k6;k+) pokew(addr,bufferk); addr=addr+2; pokeb(0xFA52,0x00); void red() PM3.3=0;P3.3=0;P13.0=1;P13.3=1;P14.2=1;P15.1=1;CKS=0x80; delay_long(); BZOE=0;P13.0=0;P13.3=0;P14.2=0;P15.1=0;void yellow() PM3.3=0;P3.3=0;P13.1=1;P14.0=1; P14.3=1;P15.2=1;CKS=0xA0;del
15、ay_long(); BZOE=0;P13.1=0;P14.0=0;P14.3=0;P15.2=0;void green()PM3.3=0;P3.3=0;P13.2=1;P14.1=1;P15.0=1;P15.3=1;CKS=0xC0;delay_long();BZOE=0;P13.2=0;P14.1=0;P15.0=0;P15.3=0;void middle()PM3.3=0;PM3.4=0;P3.3=0;P3.4=0;P3.4=1;CKS=0XE0;delay_long();BZOE=0;P3.4=0;void a()P3=0x00;P13.0=1;P13.2=1;P13.1=1;dela
16、y_long();void b()P13=0x00;P14=0x00;P15=0x00;P13.3=1;P14.0=1;P14.1=1;delay_long();void c()P13=0x00;P14=0x00;P15=0x00;P14.2=1;P14.3=1;P15.0=1;delay_long();void d()P13=0x00;P14=0x00;P15=0x00;P15.3=1;P15.2=1;P15.1=1;delay_long();void all()P13=0x00;P14=0x00;P15=0x00;P13.0=1;P13.2=1;P13.1=1;delay_long();P
17、13.3=1;P14.0=1;P14.1=1;delay_long();P14.2=1;P14.3=1;P15.0=1;delay_long();P15.3=1;P15.2=1;P15.1=1;delay_long();P3.4=1;delay_long();/用来设置改变时间的值,中断1键进入设置,分别按3,4,5键各几下LCD上显示相应的值,把这个值保存到相应的数组中。void ChangTime() int h1,h2,m1,m2;int addr; h1=0;h2=0;m1=0;m2=0; addr=0xFA44;for(addr=0xFA44;addr=24)h1=0;h2=0; e
18、lse h2=h1%10; h1=h1/10; Chang_clock0=h1; Chang_clock1=h2; pokew(0xFA44,LCD_buffh1); pokew(0xFA46,LCD_buffh2); if(P4.3=0) P13.1=1; m1=m1+1;delay();P13.1=0; if(m1=6)m1=0; Chang_clock2=m1; pokew(0xFA48,LCD_buffm1); if(P4.4=0) P13.2=1; m1=m1+1;delay();P13.2=0; if(m2=10)m2=0; Chang_clock3=m2; pokew(0xFA4
19、A,LCD_buffm2); /设置闹钟,用2键按键中断进入,用3,4,5,键设置时分,分别按3,4,5键各几下LCD上显示相应的值,把这个值保存到相应的数组中。void Set_bell() int h1,h2,m1,m2;int buffer6;int k=0;int addr; h1=0;h2=0;m1=0;m2=0;addr=0xFA44;for(k=0;k6;k+) bufferk=peekw(addr); addr=addr+2;for(addr=0xFA44;addr=24)h1=0;h2=0; else h2=h1%10; h1=h1/10; Clock0=h1; Clock1
20、=h2; pokew(0xFA44,LCD_buffh1); pokew(0xFA46,LCD_buffh2); if(P4.3=0) P13.1=1; m1=m1+1;delay();P13.1=0; if(m1=6)m1=0; Clock2=m1; pokew(0xFA48,LCD_buffm1); if(P4.4=0) P13.2=1; m1=m1+1;delay();P13.2=0; if(m2=10)m2=0; Clock3=m2; pokew(0xFA4A,LCD_buffm2); addr=0xFA44;for(k=0;k=24)hour=0;if(Chang_clock0!=0
21、) g=Chang_clock0; Chang_clock0=0;else g=hour/10;while(g=2) pokew(0xFA44,LCD_buffg); if(Chang_clock1!=0) h=Chang_clock1; Chang_clock1=0; else h=hour%10; while(h=9) pokew(0xFA46,LCD_buffh); if(Chang_clock2!=0) m=Chang_clock2; Chang_clock2=0; else m=0;/yellow(); while(m6) pokew(0xFA48,LCD_buffm); if(Ch
22、ang_clock3!=0) n=Chang_clock3; Chang_clock3=0; else n=0; while(n=9) pokew(0xFA4A,LCD_buffn); j=0; if(g=Clock0&h=Clock1&m=Clock2&n=Clock3) while(P4.3!=0) red(); if(P4.3=0)break; middle(); while(j6) pokew(0xFA4C,LCD_buffj); for(i=0;i10;i+) if(Chang_clock0!=0|Chang_clock1!=0|Chang_clock2!=0|Chang_clock
23、3!=0)break; pokew(0xFA4E,LCD_buffi); pokeb(0xFA53,0x01); delay_long(); pokeb(0xFA53,0x00); delay_long(); if(Chang_clock0!=0|Chang_clock1!=0|Chang_clock2!=0|Chang_clock3!=0)break; j+; if(Chang_clock0!=0|Chang_clock1!=0|Chang_clock2!=0|Chang_clock3!=0)break; n+; if(Chang_clock0!=0|Chang_clock1!=0|Chan
24、g_clock2!=0|Chang_clock3!=0)break; m+; if(Chang_clock0!=0|Chang_clock1!=0|Chang_clock2!=0|Chang_clock3!=0)break; hour+; if(Chang_clock0!=0|Chang_clock1!=0|Chang_clock2!=0|Chang_clock3!=0)break; void main()/初始化中断端口PM3.0=1;PU3.0=1;EGP.5=1;PMK5=0;PM1.4=0;P1.4=0;PM1.7=0;P1.7=0;/初始化PM13=0x00;PM14=0x00;PM
25、15=0x00;P13=0x00;P14=0x00;P15=0x00;/初始化按键端口PM4=0xff;KRM=0x03; PU4=0xff; KRMK=0; /初始化LCDPF2=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
26、进入设置闹钟中断,分别按P4.2,P4.3,P4.4各几下LCD上显示相应的数字,再按KEY2退出中断,同时电子表继续接着中断前的时间运行,当到达闹钟所设时间,会有声音和灯的提醒,按P4.3退出提醒,电子表继续,最好按KEY6进入流水灯中断,单片机上的LED灯流动闪烁,流水灯完成后自动返回电子表。8.实验中遇到的问题及解决方法1.由于在AD转换连接的电路不同导致公式算出的电阻偏高,在温度-电阻表中无对应的值,导致显示的温度不准确。解决方法:通过试验,自己总结出一套计算电阻的公式代入,得到准确的电阻值,在温度-电阻表中找到相对应的值,显示出较准确的温度。2. 在做更改时间和设置闹钟时,在获取设置值时,出现按得次数与得到的值不符。解决方法:通过单步调
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1