北邮单片机实验报告_第1页
北邮单片机实验报告_第2页
北邮单片机实验报告_第3页
北邮单片机实验报告_第4页
北邮单片机实验报告_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、.电路综合实验报告流水灯计时器和密码锁 目录一、流水灯和计时器41.实验目的42.设计功能43.实验器材及功能44.电路连接图55.电路接口56.主要程序说明57.实验排错及改进9二、密码锁101.设计目的10(1)功能10(2)用途102.设计功能10(1)提示各项操作指令10(2)密码正误识别11(3)重置密码113.实验器材及功能124.硬件设计13(1)电路原理图13(2)电路实际连接图13(3)系统工作流程图14(4)各分块电路的详细情况【包括端口的接线】155.程序设计16(1)键盘扫描程序16(2)显示屏显示程序21(3)滚动显示操作33(4)键盘按键判断程序34(5)主程序43

2、6.操作过程及运行结果447.实验排错及改进45三、体会和建议45四、实验分工47附录48 一、流水灯和计时器1.实验目的 这次实验是我第一次接触单片机,为了更加深入的了解ATmega16单片机的各种应用方法和工作原理,我们从最基础的实验入手,了解单片机的各个端口的作用和利用AVRStudio工具编写单片机可识别的C语言程序。在观看了教学视频和查阅了说明书后,我们了解了单片机的各个端口,对端口进行一定输入输出练习。为了将所学的单片机进行实际应用,我们通过流水灯和计时器这两个入门实验对所学知识进行实践检验。2.设计功能(1)流水灯演示,依次点亮每一个发光二极管。(2)用两个数码管做一个秒表计时器

3、。 要求按下中断按键后能够暂停秒表计时,但不影响流水灯的运行,再次按键能够使秒表继续计时3.实验器材及功能材料名称数量作用ATmega16单片机1对电路进行简单运算和控制发光二极管8实现流水灯功能数码管2秒表计时器按键1控制计时中断4.电路连接图5.电路接口流水灯八个灯:PA0PA7十位数码管:PB0PB7(PB2未接)个位数码管:PD0PD7(PD2未接)中断按键接:PD26.主要程序说明#include<avr/io.h>#include<avr/interrupt.h>char temp;volatile unsigned int cnt = 0;volatile

4、 unsigned int i = 1;volatile unsigned int key = 0;char shuzi10 = /为计时器设置数字0-9数组0b11110011,/00b11000000,/10b01101011,/20b11101010,/30b11011000,/40b10111010,/50b10111011,/60b11100000,/70b11111011,/80b11111010,/9;int main(void)DDRA = 0xff; /设置端口方向和初始状态DDRD = 0xff;DDRB = 0xff;TCNT0 = 55; MCUCR |= (1 <

5、;< ISC01); /八分频GICR |= (1 << INT0);sei();TCCR0 |= (1 << CS01) | (1 << CS00);PORTA |= 0b00000001; PORTD = shuzi0;PORTB = shuzi0;while (1) TCNT0 = 55;cnt+;if (cnt >=60000)cnt = 0;temp = PORTA; /控制发光二极管PORTA = PORTA << 1;if (temp & 0b10000000) /控制流水灯电路PORTA = PORTA | 0

6、b00000001;if(key=0) PORTB = shuzii / 10;PORTD = shuzii % 10;i+;if (i >= 60) /控制数码管的显示 i = 0; SIGNAL(SIG_INTERRUPT0) /中断信号key = !key;7.实验排错及改进错误:最初进行流水灯实验时,灯始终不亮 原因和改进:发光二极管未接地,接地后,再连接上电阻限流,即可正常发光。错误:秒表时间不准确,计数器跳变时间不是1秒 原因和改进:没有使用单片机自带定时器,在经过计算后设置了大致准确的延时,但每分钟仍然会慢三四秒。后来经过老师指导说明,明白了是由于单片机的准确频率应为124

7、0000而非1M导致。二、密码锁1.设计目的(1)功能在现实生活中,很多场合都用到了电子密码锁,比如说门禁系统,银行账户管理,保险箱等等地方都要用到电子密码锁,而且对其要求也很高。所以高安全性能密码锁的研究就成了一个必需的话题。本设计的目的就是为了在保证高安全性的前提下,实现降低成本,方便携带安装的功能,真正服务于人民。(2)用途可设计在一些简单的安全系统上,类似于密码箱,门禁系统上面,以提高产品的安全性。其中输入密码错误自动报警和立即锁死的功能能提高用户的警觉性,降低失窃率。除此之外,本款密码锁具有修改密码的功能,增加用户的安全性。2.设计功能(1)提示各项操作指令接通电源,液晶屏显示“we

8、lcome!”, 显示“2013211104-group9”滚动字幕。(2)密码正误识别 由屏幕显示提示按键,进入密码输入阶段。用键盘输入六位密码,初始密码为【123456】。若输入的密码正确,蜂鸣器响一声,绿色二极管发光。若输入的密码错误,可再次输入,且每错误一次,增加一颗红色二极管发光。连续输入错误达三次时,蜂鸣器长鸣,三个二极管均发光。系统进入锁定状态,液晶屏显示六十秒倒计时,结束后方可再次输入密码。(3)重置密码密码输入正确后,提示是否修改密码,两次输入一致后修改内置密码,且修改密码时,新密码必须为6位,多6位无法继续输入,少于六位,无法进行其他操作。液晶屏显示“ok”,若两次不一样显

9、示“fail”,需再次输入。3.实验器材及功能材料名称数量作用4*4键盘1 09为数字键输入作为密码。 A-F为功能键根据显示屏的提示代表各项指令,详见下面的【五、操作过程及运行结果】1602液晶屏1 显示欢迎界面以及各项操作指南 显示输入的密码,不显示数字,显示为*。蜂鸣器1显示密码正误。密码输入正确,蜂鸣器响一声;密码输入错误三次,蜂鸣器长响,按A停止响,开始倒计时。发光二极管4(红3、绿1)显示密码正误。 若密码正确,则绿色二极管亮。 若密码错误,则红色二极管亮,错几次亮几个。导线若干连接各器件4.硬件设计(1)电路原理图(2)电路实际连接图进入60秒倒计时(3)系统工作流程图蜂鸣器长鸣

10、,三个红色二极管均发光开始开始是否是否为第三次输入错误输入密码输入密码正确错误蜂鸣器响一声,绿色发光二极管亮修改密码蜂鸣器鸣叫,第一次错误亮一个红灯,第二次亮两个不相同再次输入新密码相同修改成功,按C返回 结束(4)各分块电路的详细情况【包括端口的接线】系统以Atmega16单片机为控制核心,4*4键盘作为输入模块,1602液晶显示屏作为显示模块实现密码锁的各项功能。 键盘电路本系统使用的键盘采用行列式键盘,对键盘进行扫描时,可以采用查询扫描的方法:先对行进行扫描,再对列进行扫描,直至将每行每列都扫描一次,通过单片机端口电平的变化,判断哪个按键被按下使用单片机的8个I/O端口就可以控制16个按

11、键。键盘的8个引脚分别接在PORTB的8个端口。列线:PB0-PB3行线:PB4-PB7 SMC1602A液晶屏电路1602液晶屏主要用于与用户交互,包括显示操作指南,提示密码输入状态和显示结果。根据左图,由上至下依次为1-16号引脚。1号,3号接地。2号,15号接VCC。46号引脚与PC0、PC1、PC7相连,分别控制RS(数据/指令寄存器选择)、RW(读写选择引脚)、E(读写使能引脚)。714号引脚分别接在PORTA的8个端口,用于数据的并行传输。16接GND。 声光电路利用发光二极管和蜂鸣器表示输入密码正确与否:密码正确时,绿色发光二极管亮,蜂鸣器响一声;若输入的密码错误,可再次输入,且

12、每错误一次,增加一颗红色二极管发光。连续输入错误达三次时,蜂鸣器长鸣,三个二极管均发光。蜂鸣器的两端:PD1和AGND红色发光二极管的正负极:PD2和AGND、PD3和AGND、PD4和AGND。绿色发光二极管的正负极:PD0和AGND5.程序设计(1)键盘扫描程序 本程序通过行扫描法,对4 x 4 的行列结构的键盘进行扫描。其按键识别的过程如下:将全部行线置低电平输出,然后读四根输入列线中 有无低电平出现。只要有低电平出现,则说明有键按下。实际编程时,还要考虑按键的消抖。如读到的都是高电平,则表示无键按下。在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依次将行线置为低电平,

13、并检测列线的输入(扫描) ,进而确认是具体的按键 位置。如当 PD5 输出低电平时(PD3=1、PD4=1、PD5=0、PD6=1) ,测到 PD1 的输入为低电平(PD0=1、PD1=0、PD2=1、PD3=1) ,则可确认按键 K3-2 处于闭合。 此段程序通过每次循环进入三种状态中的一种以确定键盘的状态。 unsigned char read_keyboard()static unsigned char key_state = 0, key_value, key_line;unsigned char key_return = No_key ;unsigned char i;switch

14、(key_state)case 0:key_line = 0b00010000;for (i = 1; i <= 4; i+) / 扫描键盘PORTB = key_line;PORTB = key_line;key_value = Key_mask & PINB;if (key_value = Key_mask)key_line <<= 1; / 没有按键,继续扫描elsekey_state+; / 有按键,停止扫描PORTD=0b00000010; / 每次按键,蜂鸣器响一下delay(50);PORTD=0b00000000; break;break;case 1

15、:if (key_value = (Key_mask & PINB) / 消抖处理,键盘编码,返回编码值switch (key_line | key_value)case 0b00011110: /根据输入返回相应键值key_return = K1_1;break;case 0b00101110:key_return = K1_2;break;case 0b01001110:key_return = K1_3;break;case 0b10001110:key_return = K1_4;break;case 0b00011101:key_return = K2_1;break;cas

16、e 0b00101101:key_return = K2_2;break;case 0b01001101:key_return = K2_3;break;case 0b10001101:key_return = K2_4;break;case 0b00011011:key_return = K3_1;break;case 0b00101011:key_return = K3_2;break;case 0b01001011:key_return = K3_3;break;case 0b10001011:key_return = K3_4;break;case 0b00010111:key_ret

17、urn = K4_1;break;case 0b00100111:key_return = K4_2;break;case 0b01000111:key_return = K4_3;break;case 0b10000111:key_return = K4_4;break;key_state+; / 转入等待按键释放状态elsekey_state-; / 两次行电平不同返回状态,(消抖处理)break;case 2: / 等待按键释放状态PORTB=0b00001111; / 列线全部输出低电平PORTB=0b00001111; / 重复送一次if (Key_mask & PINB)

18、= Key_mask)key_state = 0; / 行线全部为高电平返回状态break;return key_return; (2)显示屏显示程序根据1602显示屏的说明书标注的不同地址代表的不同含义以及网上查阅的相关资料以实现对显示屏进行指令和数据的读写功能;利用switch-case语句实现不同按键按下后显示屏上显示相应的文字的功能;void show(uchar j)/显示屏uchar i;write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x80+0);delay(5);switch(j) case 0:writ

19、e_com(0x01); delay(5);write_com(0x80+4);delay(300);uchar table = "Welcome!"/显示welcomefor (i=0;i<8;i+)write_dat(tablei);delay(500);delay(1000);for (i=0;i<9;i+)/移动9次write_com(0x18); delay(10);instru(instr);break;case 1:uchar table1 = "*"for (i=0;i<1;i+)write_dat(table1i);d

20、elay(1);break;case 2:write_com(0x01); delay(5);uchar table2 = "press F"for (i=0;i<7;i+)write_dat(table2i);delay(1);break;case 3:write_com(0x01); delay(5);uchar table3 = "press B"for (i=0;i<7;i+)write_dat(table3i);delay(1);break;case 4:uchar table4 = "then press F"

21、write_com(0x80+40);/让字符在第二行显示delay(5);for (i=0;i<12;i+)write_dat(table4i);delay(1);break;case 5:write_com(0x01); delay(5);uchar table5 = "input the code"for (i=0;i<14;i+)write_dat(table5i);delay(1);break;case 6:write_com(0x01); /先清屏delay(5);uchar table6 = "right"for (i=0;i&

22、lt;5;i+)write_dat(table6i);delay(1);break;case 7:uchar table7 = "open"write_com(0x80+40);/让字符在第二行显示for (i=0;i<4;i+)write_dat(table7i);delay(1);break;case 8:uchar table8 = "press E"write_com(0x80+40);/让字符在第二行显示delay(5);for (i=0;i<7;i+)write_dat(table8i);delay(1);break;case 9

23、:write_com(0x01); delay(5);uchar table9 = "wrong"for (i=0;i<5;i+)write_dat(table9i);delay(1);break;case 10:write_com(0x01); delay(5);uchar table10 = "change code"for (i=0;i<11;i+)write_dat(table10i);delay(1);break;case 11:write_com(0x01); delay(5);uchar table11 = "inpu

24、t again"for (i=0;i<11;i+)write_dat(table11i);delay(1);break;case 12:write_com(0x01); delay(5);uchar table12 = "ok"for (i=0;i<2;i+)write_dat(table12i);delay(1);break;case 13:write_com(0x01); delay(5);uchar table13 = "modify password"for (i=0;i<15;i+)write_dat(table13

25、i);delay(1);break;case 14:write_com(0x01); delay(5);uchar table14 = "fail"for (i=0;i<4;i+)write_dat(table14i);delay(1);break;case 15: uchar table15 = "press C "for (i=0;i<7;i+)write_dat(table15i);delay(1);break;case 16: write_com(0x01); delay(5);uchar table16 = "press

26、any key "for (i=0;i<13;i+)write_dat(table16i);delay(1);break;case 17: write_com(0x01); delay(5);uchar table17 = "press A to back"delay(5);for (i=0;i<15;i+)write_dat(table17i);delay(1);break; default : break; (3)滚动显示操作void instru(unsigned char a) /显示操作指南unsigned int length, i, sl

27、ength;length = strlen(a);write_com(0x38);delay(100);write_com(0x01);delay(100);write_com(0x0c);delay(100);write_com(0x06);delay(100);slength = length - 16;write_com(0x80 + 0); /让字符在第一个位置显示delay(100);for (i = 0; i < length; i+)write_dat(ai); /写length次数据显示语句delay(1000);for (i = 0; i < slength; i

28、+) /移动write_com(0x18); /数据左移,光标左移delay(300);delay(1000);(4)键盘按键判断程序利用字符型变量animation_states判断程序进程,通过键盘扫描程序的反馈在按键时执行相应的命令void keyboard_states()unsigned char i, j=0;if(key_temp='C')/ -关锁number = 0;error=0;PORTD = 0x00; animation_state=0;if(animation_state=0)/ -显示/只有当用户先按"B",再按"F&

29、quot;键时,密码锁才能进入工作状态。if(key_temp='B') show(2);animation_state+;if(key_temp!='B')show(3);show(4);delay(5);else if(animation_state=1)/ -先按B 后按F 然后才能解锁if(key_temp='F')show(5);animation_state+;else if(animation_state=2)/ -输入六位密码(除了B,D和F以及以外的键) if(key_temp='F')animation_sta

30、te+;else if(key_temp='D') number=0; show(5);else if(number=0)/输入密码 先清屏,然后输入密码(6位)write_com(0x01); delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x80+number);delay(5);uchar table1 = "*"if(number!=6)for (i=0;i<1;i+)write_dat(table1i);delay(1);code_numbernumb

31、er=key_temp;number+; else if(animation_state=3) if(number=6) for(i=0;i<6;i+)if(code_numberi=passwordi) /判断密码正误j+; if(j=6)show(6);show(7);PORTD = 0x02;/输入正确的话 蜂鸣器鸣响三声delay(1000);PORTD = 0x00;delay(100);PORTD = 0x02; delay(1000);PORTD = 0x00;delay(100);PORTD = 0x02;delay(1000);PORTD = 0x00;delay(10

32、0); for(int m=0;m<10;m+)for(int k=0;k<1000;k+)PORTD = 0x01; show(13);show(8);delay(10);error=0;animation_state+=2; else show(9);delay(10000);error+; else show(9);delay(10000);error+; if(error=1) /判断是第几次输错PORTD = 0x06; delay(1000); PORTD = 0x04;show(5);animation_state=2; number = 0;else if(erro

33、r=2)PORTD = 0x0e; delay(1000); PORTD = 0x0c;show(5);animation_state=2; number = 0;else if(error=3)PORTD = 0x1e;/蜂鸣器鸣响 当按下A键时才可以取消鸣响show(17);animation_state=4; number = 0; else if(animation_state=4)/ 三次错误后复位,A表示复位if(key_temp='A')PORTD = 0x00; write_com(0x0c);delay(5);write_com(0x06);delay(5);

34、write_com(0x80+0);delay(5); write_com(0x01); write_dat(time_show0);write_dat(time_show0);write_dat(time_show10);/输出':'for(int m=5;m>=0;m-)for(int n=9;n>=0;n-) LCD_show(m,n);/倒计时 delay(500);write_com(0x01); /先清屏/delay(5);show(2);number=0;error=0;animation_state=1;else if(animation_state

35、=5)/ 修改密码 Eif(key_temp='E')number=0;show(10);animation_state+;else if(animation_state=6)if(key_temp='F')&&(number=6)/F为确定键,且不输入到6位不能确定number=0;animation_state+;show(11);else if(key_temp='D')/D表示删除show(10);number=0;elseif(number=0)write_com(0x01);delay(5);write_com(0x0

36、c);delay(5);write_com(0x06);delay(5);write_com(0x80+number);delay(5);uchar table1 = "*"if(number!=6) /超过6位不能键入,且不到6位让F不能显示在屏幕上if(key_temp='F')animation_state=6;elsefor (i=0;i<1;i+)write_dat(table1i);delay(1);temp1number=key_temp;number+; else if(animation_state=7)if(key_temp=

37、9;F')&&(number=6)animation_state+;else if(key_temp='D')show(11);number=0; else if(number=0)write_com(0x01); delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x80+number);delay(5);uchar table1 = "*"if(number!=6)if(key_temp='F')animation_state=

38、7;elsefor (i=0;i<1;i+)write_dat(table1i);delay(1);temp2number=key_temp;number+; else if(animation_state=8)i=0,j=0;for(i=0;i<6;i+)if (temp1i=temp2i) j+;if(j=6)show(12);delay(5000);PORTD = 0x03; /修改成功的话 蜂鸣器鸣响一声delay(1000);PORTD = 0x01; show(15);delay(5);for(i=0;i<6;i+) passwordi=temp2i; /修改后的

39、密码赋给初始密码else show(14); delay(10000);write_com(0x01); show(10);animation_state=5;show(8); (5)主程序显示初始状态,并进入while大循环int main(void)write_com(0x38); /设置16*2显示delay(35);DDRB = 0xff;PORTB = 0xff;DDRB = 0xf0; /高四位为输入高电平,低四位输出低电平DDRD = 0xff;PORTD = 0x00;DDRA = 0xff;DDRC = 0b11000011; /C0表示VL,C1表示RW,C7表示EPORT

40、C &= 0x80;show(0); /显示welcome!和操作指南delay(35);show(16);while (1)key_temp = read_keyboard(); / 调用键盘接口函数读键盘/if (key_temp != No_key)if(key_temp!=255)keyboard_states();/ 有按键按下 6.操作过程及运行结果接通电源,液晶屏显示“welcome!”,显示“2013211104-group9”滚动字幕。 然后按照提示“press any key”按键继续。屏幕显示“press B then press F”,然后进入输入密码界面,此时

41、显示“input the code”,输入六位密码并按“F”确定。 输入正确密码,以“F”键确认,屏幕显示“right open”,同时蜂鸣器响一声,绿色发光二极管发光。 密码输入正确后,屏幕显示“modify password press E”,按“E”确认修改,屏幕显示“change code”。输入新密码以“F”键结束,屏幕显示“input again”,按照提示再次输入新密码以“F”键结束。屏幕显示“ok”,之后显示“press C”,此时按下C就返回到系统初始界面。 输入错误密码,以“F”键确认,屏幕显示“wrong”,两个二极管均不发光。每错误一次,增加一颗红色二极管发光。连续输入错误达三次时,蜂鸣器长鸣,三个二极管均发光。屏幕显示“press A to back”按“A”键停止蜂鸣器,同时系统进入锁定状态,开始六十秒倒计时。 运行结果详见视频。7.实验排错及改进错误:调试显示屏时,显示屏显示一些乱码。 原因和改进:一开始我们也不知道是怎么回事儿,后来我们觉得可能是显示屏布线问题,于是我们根据代码算法走了一遍程序,界面顺序按键都没有大

温馨提示

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

评论

0/150

提交评论