北邮小学期AVR单片机模拟电梯系统实验报告.docx_第1页
北邮小学期AVR单片机模拟电梯系统实验报告.docx_第2页
北邮小学期AVR单片机模拟电梯系统实验报告.docx_第3页
北邮小学期AVR单片机模拟电梯系统实验报告.docx_第4页
北邮小学期AVR单片机模拟电梯系统实验报告.docx_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

小学期单片机实验报告姓名: 申宇飞班级:信通3班学号:班内序号:03时间:2014/9/9-2014/9/18基于AVR单片机的模拟电梯系统制作目录基于AVR单片机的模拟电梯系统制作21.简介31.1课题名称31.2摘要32.前期准备32.1流水灯32.1.1 功能32.1.2 程序代码32.2蜂鸣器/按键蜂鸣器42.2.1 功能42.2.2 程序代码42.3 秒表计时器62.3.1 功能62.3.2 程序代码62.4流水灯与60秒秒表计时器82.4.1 功能82.4.2 程序代码83.设计过程113.1设计流程113.2 实验元器件113.3实验程序主要流程图123.4实验原理及原理图133.4.1实验原理133.4.2 原理图133.4.3各模块的设计与详解:134.程序源代码及程序分析155.实验结果225.1 操作过程226.排错过程247.心得体会258.参考文献269.意见与建议261.简介1.1课题名称 基于AVR单片机的模拟电梯系统1.2摘要本实验设计制作一个基于单片机Atmega16的模拟电梯系统。此单片机模拟电梯用红色和绿色发光二极管分别来指示电梯当前是处于上升状态还是下降状态,用数码管显示当前是处于哪一层,能够通过键盘控制实现电梯的上下运行来到达指定楼层,此外,在出现意外情况时可以通过按键实现电梯的紧急停止及恢复运行。关键词:单片机,键盘扫描,按键检测,电机的正反转,数码管显示,蜂鸣器,模拟电梯2.前期准备在之前的学习中我们从未学习单片机,所以在确定选题前需要一定的学习和练习。我们小组一共练习了3个工程:流水灯、按键蜂鸣器和秒表计时器,学会了使用AVR studio工作环境和WINAVR(GCC)编译器,并在板子上写入程序。学会了I/O端口初始化、输入输出操作,通过端口控制LED序列、8段数码管、蜂鸣器,中断和定时的使用。2.1流水灯 2.1.1 功能 学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,我们小组用的PB端口作为控制LED的端口,并且由于人眼频率和单片机频率的关系加了延迟函数,使得流水灯每个状态保持1s2.1.2 程序代码#include int main(void)char temp; /用来存储当前A端口的输出unsigned int i,k; /循环变量DDRA=0xff; /将A端口设为输出PORTA=0b00000001; /初始化A端口,从接入PA0的LED灯亮while(1) temp = PORTA;PORTA=PORTA1;if(temp&0b10000000) /若接入7的LED灯亮PORTA=PORTA | 0b00000001;/则点亮接入PA0的LED灯/即实现流水灯循环for(i=0;i50;i+) /延时,约1秒钟for(k=0;k1000;k+);2.2蜂鸣器/按键蜂鸣器 2.2.1 功能 按键蜂鸣器主要为了了解按键的使用,并且学会中断的应用 2.2.2 程序代码蜂鸣器: #include int main(void)unsigned int i,k; DDRB|=(13); /对B端口的设置,使得PD3设置为输出PORTB &=(13); /初始时蜂鸣器不响while(1) PORTB =(13); /设置蜂鸣器每隔约一秒响一次for(i=0;i50;i+)for(k=0;k1000;k+);按键蜂鸣器:#includeint main(void)DDRA &=(16); /按钮6的设置PORTA |=(16);DDRA &=(17); /按钮7的设置PORTA |=(17);DDRA &=(12); /按钮2的设置PORTA |=(12);DDRA &=(13); /按钮3的设置PORTA |=(13);DDRB |=(13);/蜂鸣器输出PORTB &=(13);DDRD =0xff;/灯的输出while(1)switch(PINA &0b11001100)case 0b11001100: /K1被按下PORTD|=(10); /LED0发光break;case 0b11000000: /K2被按下PORTD|=(11); /LED1发光break;case 0b10001000: /K3被按下PORTD|=(12); /LED2发光break;case 0b01001000: /K4被按下PORTB |=(13); /蜂鸣器鸣响break;default:PORTB &=(13); /关蜂鸣器PORTD=0; /关灯break;2.3 秒表计时器 2.3.1 功能 利用两位数码管,实现秒表计时的功能 2.3.2 程序代码#include #include int table= /显示09的数组0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f; int main(void)DDRA=0xff;DDRB=0xff;DDRD=0b11110111;PORTA=0b00000001;PORTD=(13); /设置中断PORTB=0b00001000;MCUCR|=(1 ISC11); /设置INT1下降沿触发中断GICR|=(1 INT1);sei();unsigned int i,j,k,x,y;unsigned char temp;TCCR0|=(1CS01);while(1)for(i=0;i60;i+)x=i/10,y=i%10; /x为十位数,y为个位数PORTD=tablex;/接入PD口的数码管显示十位数PORTB=tabley;/接入PB口的数码管显示个位数temp=PORTA; /流水灯的显示 PORTA=PORTA 1;if(temp & (17)PORTA|=1;TCNT0=55;for(k=0;k3;k+) /延时for(j=0;j10000;j+)while(!(TIFR & (1TOV0);TCNT0=55;SIGNAL(SIG_INTERRUPT1) /中断程序int m=0;while(1)if(PIND & (12) delay(10);while(1)m +;if(!(PIND & (12)m +; break; delay(500);if(m=2)delay(100);break; 2.4流水灯与60秒秒表计时器 2.4.1 功能 学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,此外,利用两个数码管,实现60秒秒表计时功能,可随时停止。2.4.2 程序代码#include #include int main(void) char TEMP;DDRB=0xff;/将B端口设为输出 PORTB=0b11001100;/初始化B端口,最开始第一个灯亮 while(1)/主循环TEMP=PORTB;PORTB=PORTB1;if(TEMP&0b10000000)PORTB=PORTB|0b00000001;for(i=0;i100;i+) for(j=0;j1000;j+);int main(void)char num10= 0b00111111,/00b00000110,/10b01011011,/20b01001111,/30b01100110,/40b01101101,/50b01111101,/60b00000111,/70b01111111,/80b01101111,/9;char shuma10=0b10111111,0b10000110,0b01011111,0b11001111,0b11100110,0b11101111,0b11111101,0b10000111,0b11111111,0b11101111,; unsigned int a = 0,tag = 0; char temp; unsigned int i,j; DDRA=0xff;PORTA=0b10001100; DDRC&=(17); PORTC |=(17); DDRB|=(17); DDRD|=(17)|(02); PORTC &=(16);/关数码管 TCNT0 = 55; TCCR0 |= (1 CS01);/八分频 DDRB=0xff; /DDRD=0xff; DDRA|=0xf0; TCNT0=55; PORTD |= (12);MCUCR |= (1 ISC01) | (0 ISC00);GICR |= (1 INT0);sei(); while(1) /* if(PINC&(17)/按键没被按下 if(a = 9)tag = (tag + 1)%6;a = (a+1)%10;PORTD = numa;PORTB = numtag; Else/按键按下 PORTD = PORTD;/保持原状态PORTB = PORTB; */ PORTA = 0b11000000;temp=PORTA;PORTA=PORTA1;if(temp&0b10000000)/使最后一个等亮起后,又从第一个亮起PORTA=PORTA|0b00000001; for(i = 0;i 50000;i +)while(!(TIFR &(1 TOV0);TCNT0=55;SIGNAL (SIG_INTERRUPT0)/中断程序PORTA = 0xff;for (int p = 0 ; p10000 ; p+)PORTD |= (12);while(!(PORTD | 0b11111011) 3.设计过程3.1设计流程(1)了解AVR单片机原理及编程规则.(2) 编写代码,然后接好电路,下载到单片机测试(3) 所有部分完成后,进行整体测试,有错的话继续整改,无错直接下载测试 了解单片机原理及AVR编程规则先编写一部分代码,然后接好电路,下载到单片机测试,通过后,继续完成下一部分所有部分完成后,进行整体测试报错修改代码正确3.2 实验元器件Atmeal16单片机 1块JTAG下载器 1个4X4矩阵键盘 1块电机 1个蜂鸣器 1个数码显示管 1个导线 若干3.3实验程序主要流程图运行结果及组员分工:申宇飞:主要负责模拟电梯系统程序的编写徐萌扬:主要负责硬件的连接和实物的制作3.4实验原理及原理图3.4.1实验原理单片机识别按键按下的是哪个键,随之进行判断,如果需要进行移动,则驱动电机,在到达指定的楼层后停止,在电梯运动同时到达相应楼层时,数码管显示相应的数字,用红色和绿色发光二极管组成的箭头来指示电梯当前是处于上升状态还是下降状态。此外,如果按下按键,还可以实现电梯的紧急停止和恢复启动。 3.4.2 原理图3.4.3各模块的设计与详解:3.4.3.1中央处理器MCU 中央处理器 中央处理器用的是ATMega16,如图所示。PA0PA7用于连接键盘输入,PC0驱动蜂鸣器,PC1和PC7口设置为电机接入端口,PB0PB7用于连接数码管显示器,PD2设置为中断按键,PD3PD7为LED灯阵。当PC1输出高电平PC7输出低电平时,电动机逆时针旋转;反之,电动机顺时针旋转。由此实现电梯上下行功能。3.4.3.2 4x4键盘 图3键盘与接PB口连接,见图3。 键盘的工作原理: 按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。行线通过上拉电阻接到+5V 电源上。无按键按下时,行线处于高电平的状态, 而当有按键按下时, 行线电平与此行线相连的列 线电平决定。将行列线值组合后即得到一个两位为0六位为1的八位二进制数。由此八位二进制数即可确定按键并设置相应数值。4.程序源代码及程序分析#include #include #include #define uchar unsigned char#define uint unsigned intconst table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07, 0x7f,0x6f;int stop;int floor ;uchar keyscan()/4*4键盘的扫描 uchar cord_h,cord_l,cord; DDRA=0x0f; PORTA=0xf0; /行线输出全为0 delay(1); cord_h = PINA & 0xf0; /读入行线值 if(cord_h!=0xf0) /先检测有无按键按下 delay(100); /去抖 if(cord_h!=0xf0) DDRA = 0xf0;PORTA = 0x0f; /输出当前列线值delay(1); cord_l = PINA & 0x0f; /读入列线值cord = cord_l | cord_h;/键盘最后组合码值 return(cord);/返回该值 return(0xff); void delay(uint ms)/延时函数 uint i,j;for(i=0;ims;i+) for(j=0;j111;j+); void lift_delay(uint ms)/第二次按键按下 uint i,j;uchar m ;for(i=0;ims;i+) for(j=0;j0)/目的地的楼层号大于现在的楼层号,电机正转上升 PORTC = 0b10000000;for(int m =0;m5;m+)light_up();i-; n + ;floor = n;PORTB = tablefloor;/显示当前电梯楼层if (stop = floor)PORTC &= 0b01111101;PORTD |= 0b11110000;PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;delay(10000);PORTC |= 0b10000000;stop = 0; else if(i0)/目的地的楼层号小于现在的楼层号,电机反转下降 PORTC = 0b00000010;for(int m =0;m5;m+) light_down();i+;n -;floor = n;PORTB = tablefloor;if (stop = floor)PORTC &= 0b01111101;PORTD |= 0b01111000;PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;delay(10000);PORTC |= 0b00000010;stop = 0; PORTC = 0x00; PORTD &= 0b00000111; PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;if(stop !=0) int dest = stop;stop = 0;delay(10000);lift(floor,dest); void light_up()/LED灯显示上行uchar i;PORTD |= 0b11110000; lift_delay(100); PORTD &= 0b00000100; lift_delay(100); void light_down()/LED灯显示下行PORTD |= 0b01111000;lift_delay(100);PORTD &= 0b00000100;lift_delay(100); int main(void)MCUCR &= (0 ISC01) & (0 ISC00);GICR |= (1 INT0);sei(); uchar temp,key; DDRD = 0b11111011; PORTD |= (1 2); DDRC = 0b10000011; DDRB = 0xff; floor = 1; PORTB = tablefloor; while(1) key = keyscan();switch(key)/ 内部按键 case 0b11101110:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,1);break;/1 case 0b11101101:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,2);break;/2 case 0b11101011:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,3);break;/3 case 0b11100111:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,4);break;/4 case 0b11011110:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,5);break;/5 case 0b11011101:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,6);break;/6 case 0b01111110:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,1);break;/c/外部按键 case 0b01111101:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,2);break;/d case 0b01111011:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,3);break;/e case 0b01110111:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,4);break;/f case 0b10110111:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,5);break;/b case 0b10111011:PORTC |= 0b00000001;delay(1000);PORTC &= 0b11111110;lift(floor,6);break;/a PORTB = tablefloor; SIGNAL(SIG_INTERRUPT0)/中断程序 char temp;temp = PORTC;int m=0;PORTC &= 0b01111101;while(1)PORTD |= 0b11111000;PORTC |= 0b00000001;delay(300);PORTD &= 0b00000100;PORTC &= 0b11111110;delay(300);m=1;if(PIND & (12) delay(10);while(1)PORTD |= 0b11111000;PORTC |= 0b00000001;delay(300);PORTD &= 0b00000100;PORTC &= 0b11111110;delay(300);m=2;if(!(PIND & (12)m=3; break; delay(500);if(m=3)delay(100);PORTC = temp;break; 5.实验结果5.1 操作过程1)将程序下载到板子上后,数码管默认显示1层,电梯处于停止状态,发光二极管不亮。 2)在键盘上按下相应的楼层,电梯会移动到相应楼层,在电梯移动过程中,发光二极管会根据上行还是下行亮不同颜色的灯,在电梯到达对应楼层,数码管会显示相应的楼层号。 3)按下按键,电梯会紧急停止,再按一下按键,电梯恢复正常运行模式。 5.2 实验结果6.排错过程1)下载程序到单片机上时总是不能自动下载驱动程序,搜索相应的下载包,手动下载驱动,然后安装成功;2)流水灯实验时灯亮的过快,是延时的问题,经过调整延时得以实现1秒亮一个的功能;3)秒表计时器中,为了利用上中断,并同时显示流水灯,因此需要把数码管的小数点位空出来,接入中断;5)置0和置1的语句写错,对&,|的理解不深。将第3位置0/1的正确的写法是:PORTx &= (13);PORTx |= (13); 6)忘记用DDRx将相应端口设置成输入或者输出。7)定时器时晶振不是16兆赫兹。按照先定义初始值为55,达到255溢出时按照16兆的频率应为1ms,但事实上循环1000次远小于1s。改正调试循环值使时间达到1s9)即使是作用于不同位置的局部变量同名时会产生一些问题,调用的函数里面的局部变量和主函数的局部变量名相同下载后有时会报错。为了避免,除了循环变量i、j,其他变量都尽量不重名。10)第二次按下按键时电梯无法恢复正常运行,是因为中断程序没有退出,需要设计计数变量才能退出。11)4*4键盘的使用要分清行线和列线,不同种类的键盘编程不同。8个端口将4个置为输入,4个置为输出。12)设定外部中断时,用上升/下降沿出发时,使用低电平触发中断。13)使用低电平触发时,中断使用的PD2,PD3口需设置下拉电阻。7.心得体会这学期的单片机实验课程已经结束了,虽然做的实验比较简单,但单片机对我来说毕竟是一个从未接触过的东西,所以我通过实验课还是学到了很多知识。单片机实验课是为了更好的学习和使用单片机而开设的一门课程。单片机在实际生活中的应用非常广泛,尤其是在工业控制、网络通信、模块化系统和汽车电子等领域。因此,单片机课程是电子信息类专业学生的必修课之一。由此,可以看出单片机课程对于我们这类专业的学生的重要性。单片机课是一门实践性很强的课程,仅有课堂上理论知识的学习,对运用好单片机是完全不够的,必须亲自做实验,从实验中吸取教训,总结经验,增加实战经验,加深对单片机的理解,更好的运用单片机。单片机实验课的目的就是为学生提供做实验的机会,让学生能够从几个简单的实验中学会单片机开发的过程和单片机的实际运用。单片机实验课让我将课堂上学到的理论知识运用到实验当中去,在实验中发现问题,解决问题,提高了自己的实际操作能力,加深了对理论知识的理解。下面是我在实验当中遇到的一些问题和体会。首先,自己在实验课上对视频讲解的东西没有很好的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论