




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录引言.031. 设计目的.032. 设计要求.03 2.1. 基本功能.03 2.2. 扩展功能.033. 软件设计.03 3.1. 方案论证比较.03 3.1.1. 数码管与LCD液晶显示.03 3.1.2. 用单片机内部定时器设计时钟与用DS1302时钟芯片.03 3.1.2. 用按键模拟红外探测、输入门禁与用发光二极管.04 3.2. 总体框图设计.04 3.3. 电路原理分析.04 3.3.1. 晶振电路.04 3.3.2. DS1302 模块.05 3.3.3. LCD1602 显示模块.05 3.3.4. 按键模块.06 3.3.5. SPEAKER 电路.06 3.3.6. 数码管驱动电路.07 3.4. 总体电路图设计.07 3.5. 程序设计模块.07 3.5.1. LCD 显示程序.07 3.5.2. DS1302 读写数据函数.08 3.5.3. 按键扫描.09 3.5.4. 内中断函数.10 3.5.5. 外中断函数.11 3.6. 完整的程序清单.114. 硬件设计.21 4.1. 硬件实物图.21 4.1.1. 复位.22 4.1.2. 外部中断0模拟红外探测.22 4.1.3. 外部中断1模拟输入门禁.22 4.1.4. 时钟显示.23 4.2. 硬件检错分析.235. 单片机课程设计心得体会.24引 言 20世纪末,电子技术获得了飞速的发展,在其推动下,具有功能强、体积小、可靠性高、价格低廉的单片机在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度。 现在生活的人们越来越重视起了时间观念和防范意识,可以说是时间和防范意识和金钱划上了等号,对于那些对时间把握非常严格和警惕性高的人来说,时间的不准确性带来不小的麻烦,所以说以数码管显示的时钟比指针式的时钟表现出了很大的优势。数码管显示的时间简明而且读数快,时间准确显示到秒。 数字钟是采用数字电路对时分秒数字显示的计时装置。数字钟的精度,稳定性远远超过老式机械钟。数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受到广大消费者的喜爱。1. 设计目的 自制一个单片机最小系统,包括串口下载、复位电路,采用两路外部中断输入门禁和红外探测两路信号(采用两个小按键模拟),中断信号输入后能将报警信息在四位一体数码管上显示,并输出声光报警信号。2. 设计要求2.1. 基本功能 实现最小系统 用外部中断0模拟红外探测 用外部中断1模拟输入门禁2.2. 扩展功能 用单片机内部定时器设计时钟 用LCD1602显示时间 时间具有时间设置功能3. 软件设计3.1. 方案论证比较3.1.1. 数码管与LCD液晶显示由于数码管只能显示数字数码管显示内容单一,液晶则比较丰富,而这个实验中,要求功能较多,为了使电路显示的更清晰明了,本实验最终决定采用LCD1602显示。且液晶显示已占居社会主流,优势明显。3.1.2. 用单片机内部定时器设计时钟与用DS1302时钟芯片美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰 年补偿等多种功能。采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。而只用单片机直接编程做时钟电路虽然节省成本,但功能却有许不足,而且单片机工作不是很稳定,容易出现死机、跑错等当电路一复位就又要从新调整时间,显然这在实际情况中是很麻烦的,与社会的主流发展智能化,不相符合。虽然DS1302时钟芯片方便实用,但是简易报警器只用到了外部中断0和1,还有定时器没有用到,所以为了充分利用单片机的内部资源,所以就使用单片机内部定时器设计时钟。3.1.3. 用按键模拟红外探测、输入门禁与用发光二极管简易报警器实验要求用按键模拟红外探测和输入门禁,但是由于实验室的器材提供有限,所以采用了红色的发光二极管代替红外探测的发光显示,用绿色的发光二极管代替输入门禁的报警器装置。3.2. 总体框图设计STC89C54RD+复位电路时钟电路电源LCD1602发光二极管模拟红外探测与输入门禁按键模块 3.3. 电路原理分析3.3.1. 晶振电路 振荡器是数字钟的核心。振荡器的稳定度及频率的精确度决定了数字钟计时的准确程度,通常选用石英晶体构成振荡器电路。石英晶体振荡器的作用是产生时间标准信号。因此,一般采用石英晶体振荡器经过分频得到这一时间脉冲信号。3.3.2. DS1302电路美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。但是本设计为了充分利用单片机的内部资源,所以就没有采用了DS1302时钟芯片。原本设计利用DS1302的设计图如图1:图1 用DS1302设计时钟电路3.3.3. LCD1602显示模块本电路采用1602LCD,由于数码管只能显示数字数码管显示内容单一,液晶则比较丰富,而这个实验中,要求功能较多,为了使电路显示的更清晰明了,本实验最终决定采用1602LCD显示。且液晶显示已占居社会主流,优势明显。模块引脚功能表: 引脚符 号名 称功 能1Vss接地0V2VDD电路电源5V10%3VEE液晶驱动电压保证VDD-VEE=4.55V电压差4RS寄存器选择信号H:数据寄存器 L:指令寄存器5R/W读/写信号H:读 L:写6E片选信号下降沿触发,锁存数据7-14DB0-DB7数据线数据传输3.3.4. 按键模块 鉴于使用中断电路会增加硬件电路的复杂度,本电路采用独立按键的方法,只需在程序中加入扫描程序即可。其中P2.0接按键光标移位,P2.1接按键时间加数,P2.2接按键时间减数,P3.2接按键模拟红外探测,P3.3接按键模拟输入门禁,。3.3.5. SPEAKER电路报警器装置的原理就是利用P3.7出来的高低电平交换使得扬声器发出声音。但是由于实验室的器材有限,所以我们改用了发光二极管来代替SPEAKER电路。3.3.6. 数码管驱动电路 74LS244是8路3态单向缓冲驱动,也叫做总线驱动门电路或线驱动。简单地说,它有8个输入端,8个输出端,可以增加信号的驱动能力.为单向驱动.对应的双向驱动芯片为245芯片。所以74LS244或者74LS245都可以用来驱动点亮数码管。3.4. 总体电路图设计3.5. 程序设计模块3.5.1. LCD显示程序void write_command(uchar tempdata)/1602LCD写命令函数.void write_data(uchar tempdata) /1602LCD写数据函数.void L1602_init(void)/1602LCD初始化函数.void write_week(uchar addr,uchar temp)/写周显示时间.void write_nyr(uchar addr,uchar temp)/nyr代表“年月日”.void write_sfm(uchar addr,uchar temp)/sfm代表“时分秒”.void timer0() interrupt 1 using 0.3.5.2. DS1302 读写数据函数void WabyteToDS1302(uchar temp) /写一个字节到DS1302.uchar GabyteFromDS1302() /从DS1302读取一个字节.uchar Read_Data(uchar addr) /读DS1302内部的(寄存器)地址.void GetTime()/从DS1302内部的时钟寄存器读取时间出来到数组DateTime中.uchar Read_LCD_State()/检测LCD是否忙./* 设置DS1302的闹铃,软件设置闹钟 *void clock(uchar t) uchar i,j;for(i=200;i0;i-) beep=beep;for(j=t;j0;j-);void alarm(uchar shi,uchar fen,uchar miao)uchar k;GetTime();if(DateTime2=shi & DateTime1=fen & DateTime0=miao)for(k=0;k15;k+)clock(90);clock(120);3.5.3. 按键扫描void keyscan()if(k0=0)/./光标移位if(k0_keycnt=1) /功能按键暂停/运行键被按键第1下if(k0_keycnt=2) /功能按键暂停/运行键被按键第2下if(k0_keycnt=3) /功能按键暂停/运行键被按键第3下if(k0_keycnt=4) if(k0_keycnt=5) /功能按键暂停/运行键被按键第4下if(k0_keycnt=6) /功能按键暂停/运行键被按键第5下if(k0_keycnt=7) /功能按键暂停/运行键被按键第6下if(k0_keycnt=8)/功能按键暂停/运行键被按键第7下,/暂停取消,继续运行时钟if(k0_keycnt!=0)if(k1=0) /加“1”键盘,检测k1是否有键按下?if(k1=0)if(k0_keycnt=1) /秒设置 if(miao=60)if(k0_keycnt=2)/分设置 /*uchar code table1= /00:00:00;*/if(fen=60)if(k0_keycnt=3)/时设置if(shi=24)if(k0_keycnt=4) /周设置if(week=8)if(k0_keycnt=5) /日设置if(day=31)if(k0_keycnt=6) /月设置 /*uchar code table0= if(month=12)if(k0_keycnt=7) /年设置if(year=100)if(k2=0)/. /减号键盘if(k2=0)if(k0_keycnt=1)/秒设置if(miao=-1)if(k0_keycnt=2)/分设置 /*uchar code table1= if(fen=-1)if(k0_keycnt=3) /时设置if(shi=-1)if(k0_keycnt=4) /周设置if(week=0)if(k0_keycnt=5) /天设置if(day=-1)if(k0_keycnt=6) /月设置 /*uchar code table0= if(month=-1)if(k0_keycnt=7) /年设置if(year=-1)3.5.4. 内中断程序void timer0() interrupt 1 using 0TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(tcnt=18) /1s定时if(miao=60)if(fen=60)if(shi=24)if(week=8)if(day=31)if(month=13)if(year=100)write_nyr(5,year);write_nyr(8,month);write_nyr(11,day);write_sfm(4,shi);write_sfm(7,fen);write_sfm(10,miao);3.5.5. 外中断函数void external_int0() interrupt 0 .3.6. 完整的程序清单#include#define uchar unsigned char#define uint unsigned intsbit k0=P20; /光标移位sbit k1=P21; /加sbit k2=P22; /减uchar code table0= 2011-03-31 4;uchar code table1= 20:00:00;uchar i,tcnt,shi,fen,miao,year,month,day,k0_keycnt;uchar year=11;uchar month=2;uchar day=7;uchar week=5;uchar count0,count1;sbit Kint0=P32;sbit Kint1=P33;sbit LED =P36;sbit beep =P37;sbit E=P27;/1602使能引脚sbit RW=P26;/1602读写引脚sbit RS=P25;/1602数据/命令选择引脚void delay(uchar x)uchar a;while(x-)for(a=120;a0;a-);void write_command(uchar tempdata)E=0;delay(5);RS=0;delay(5);RW=0;P0=tempdata;delay(5);E=1;delay(5);E=0;void write_data(uchar tempdata)E=0;delay(5);RS=1;delay(5);RW=0;P0=tempdata;delay(5);E=1;delay(5);E=0;void L1602_init(void)write_command(0x38);write_command(0x0c);write_command(0x01);write_command(0x06);write_command(0x80); /第一行液晶显示for(i=0;i16;i+)write_data(table0i);write_command(0xc0); /第二行液晶显示for(i=0;i12;i+)write_data(table1i);TMOD=0x01;EA=1;ET0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;void write_week(uchar addr,uchar temp)/nyr代表“年月日”uchar wek;wek=temp%10;write_command(0x80+addr); /写命令,从这个地址开始write_data(0x30+wek);void write_nyr(uchar addr,uchar temp)/nyr代表“年月日”uchar s,g;s=temp/10;g=temp%10;write_command(0x80+addr); /写命令,从这个地址开始write_data(0x30+s);delay(5);write_data(0x30+g);void write_sfm(uchar addr,uchar temp)/sfm代表“时分秒”uchar shi,ge;shi=temp/10;ge=temp%10;write_command(0xc0+addr); /写命令,从这个地址开始write_data(0x30+shi);write_data(0x30+ge);void timer0() interrupt 1 using 0TH0=(65536-50000)/256;TL0=(65536-50000)%256;tcnt+;if(tcnt=18) /1s定时tcnt=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;day+;week+;if(week=8)week=1;write_week(15,week);if(day=31)day=0;month+;if(month=13)month=0;year+;if(year=100)year=0;write_nyr(5,year);write_nyr(8,month);write_nyr(11,day);write_sfm(4,shi);write_sfm(7,fen);write_sfm(10,miao);void keyscan()if(k0=0)/./光标移位delay(10);if(k0=0)k0_keycnt+;while(!k0); /松手之后开始执行定时器停止,光标闪烁if(k0_keycnt=1) /功能按键暂停/运行键被按键第1下TR0=0; write_command(0xc0+11);/指针指到“秒”钟个位处 write_command(0x0e); /光标开不闪烁,此处不设置闪烁,闪烁不好看if(k0_keycnt=2) /功能按键暂停/运行键被按键第2下write_command(0xc0+8); /指针指到“分”钟个位处 /*uchar code table1= 00:00:00;*/if(k0_keycnt=3) /功能按键暂停/运行键被按键第3下write_command(0xc0+5); /指针指到“时”钟个位处if(k0_keycnt=4) write_command(0x80+15);/指针指到“周”的位置 if(k0_keycnt=5) /功能按键暂停/运行键被按键第4下write_command(0x80+12);/指针指到“日”的个位处if(k0_keycnt=6) /功能按键暂停/运行键被按键第5下write_command(0x80+9); /指针指到“月”的个位处 /*uchar code table0= 2011-02-07;*/if(k0_keycnt=7) /功能按键暂停/运行键被按键第6下write_command(0x80+6); /指针指到“年”的个位处if(k0_keycnt=8) /功能按键暂停/运行键被按键第7下,暂停取消,继续运行时钟k0_keycnt=0;write_command(0x0c); /光标关,继续运行时钟TR0=1;if(k0_keycnt!=0)if(k1=0) /加“1”键盘,检测k1是否有键按下?delay(10);if(k1=0)while(!k1); /等待k1键松开之后开始执行按键之后的程序if(k0_keycnt=1) /秒设置 miao+;if(miao=60)miao=0;write_sfm(10,miao);write_command(0xc0+11);if(k0_keycnt=2)/分设置 /*uchar code table1= 00:00:00;*/fen+;if(fen=60)fen=0;write_sfm(7,fen);write_command(0xc0+8);if(k0_keycnt=3)/时设置shi+;if(shi=24)shi=0;write_sfm(4,shi);write_command(0xc0+5);if(k0_keycnt=4) /周设置week+;if(week=8)week=1;write_week(15,week);write_command(0x80+15);if(k0_keycnt=5) /日设置day+;if(day=31)day=0;write_nyr(11,day);write_command(0x80+12);if(k0_keycnt=6) /月设置 /*uchar code table0= 2011-02-07 5;*/month+;if(month=12)month=0;write_nyr(8,month);write_command(0x80+9);if(k0_keycnt=7) /年设置year+;if(year=100)year=0;write_nyr(5,year);write_command(0x80+6);if(k2=0)/. /减号键盘delay(10);if(k2=0)while(!k2);if(k0_keycnt=1)/秒设置miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_command(0xc0+11);if(k0_keycnt=2)/分设置 /*uchar code table1= 00:00:00;*/fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_command(0xc0+8);if(k0_keycnt=3) /时设置shi-;if(shi=-1)shi=23;write_sfm(4,shi);write_command(0xc0+5);if(k0_keycnt=4) /周设置week-;if(week=0)week=7;write_week(15,week);write_command(0x80+15); if(k0_keycnt=5) /天设置day-;if(day=-1)day=30;write_nyr(11,day);write_command(0x80+12);if(k0_keycnt=6) /月设置 /*uchar code table0= 2011-02-07 5;*/month-;if(month=-1)month=12;write_nyr(8,month);write_command(0x80+9);if(k0_keycnt=7) /年设置year-;if(year=-1)year=99;write_nyr(5,year);write_command(0x80+6);void init() /报警器初始化子函数 P2 = 0x0f; /使灯灭 P1 = 0x00;ET0 = 1; /外部中断0请求触发方式ET1 = 1; /外部中断1请求触发方式IE = 0x87;/EA=1;EX1=0;EX0=1,ET0=1;IP = 0x07;void external_int0() interrupt 0 /外部中断0模拟红外探测count0+;if(count0=1)if(Kint0=0)while(!Kint0);/等待键放松delay(5);P1=0x3f;/数码管显示0for(i=0;i50;i+)/LED灯闪烁一段时间LED=LED;delay(50);count0=0; /按键计数清零P1=0x00; /灭灯P2=P2|0x0f;/灭灯LED=1; /灭灯void external_int1() interrupt 2/外部中断1模拟输入门禁count1+;if(count1=1)if(Kint1=0)while(!Kint1);delay(5);P1=0x06;for(i=0;i50;i+)beep=beep;delay(50);count1=0;P1=0x00;P2=P2|0x0f;beep=1;void main()init();L1602_init();while(1)keyscan();4. 硬件设计4.1. 硬件实物图图2 整体硬件实物图图2的硬件介绍:单片机的复位按键外部中断0模拟红外探测按键外部中断1模拟输入门禁按键设置时间的光标移动按键时间加数按键时间减数按键LCD1602液晶显示器STC89C54RD+单片机74LS244单向驱动芯片一位数码管4.1.1. 复位 图3 复位硬件电路图 图3中,手指按着的是复位键,当按下此键的时候,单片机的I/O口为高电平,所以数码管显示的是数字8,当放松按键的时候,则程序会进入初始化状态,并且数码管会熄灭。4.1.2. 外部中断0模拟红外探测图4 外部中断0模拟红外探测图4中,当外部中断0有键按下时,红色发光二极管闪烁,数码管显示0表明外部中断0有键按下。二极管闪烁一段时间后熄灭,数码管也熄灭。4.1.3. 外部中断1模拟输入门禁图5 外部中断1模拟输入门禁图5中,当外部中断1有键按下时,绿色发光二极管闪烁,数码管显示1表明外部中断1有键按下。二极管闪烁一段时间后熄灭,数码管也熄灭。4.1.4. 时钟显示图6 LCD1602显示时间 图6的时间显示是用单片机内部定时器0设计的,定时器定时50ms,且焊接板上的晶振为11.0592MHz,所以当内部定时器中断约18次为1s钟的到来。然后将数据通过P0口送到LCD1602的接口上,再通过命令函数,写数据函数将数据显示到液晶显示器上。4.2. 硬件检错分析以下是我在此次检测电路时总结几点:检测万用表。将万用表拨动二极管测量提示符处,将表笔短接一下听听万用表是否发出声音,若发出声音则万用表这个功能可用。检测电源和地。电源线的各个结点都是相通的,地线也是如此,当用万用表的表笔接到电源(底线)的一端,然后另外一支表笔在各个电源(地线)结点处触试,若发出声音则电源(地线)相通。否则得一处处慢慢检测。然后用表笔接上电源线,另外一支表笔接触地线结点,然后慢慢触试,若发出声音则电源和地之间有短路现象,若没有发出声音则电源和地之间没有短路,电源和地线焊接完好。检测其他连线。检测各个连线的两段是否发出声音,若发出声音则焊接良好,若没有发出声音则可能是虚焊,可能是线脱落,可能是其他情况,这个时候得要将此处焊接好,直到触试发出声音为止。检测芯片的电源和地。每块芯片都有VCC和GND引脚,这个时候测试每块芯片的VCC和GND是否完好,若完好的话则可以用来做实验,否则需换芯片。检测数码管。方法一:数码管有一位、两位、四位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第2课《梅岭三章》说课稿 2023-2024学年统编版语文九年级下册
- 初一历史上册鲁教版第三单元第13课大一统的汉朝说课稿
- 活动一 一次性筷子使用情况调查教学设计-2025-2026学年小学综合实践活动四年级上册沪科黔科版
- 蓄电池的性能指标
- 蓄电池的使用与维护
- 2025年殡葬改革试题及答案解析
- 三年级下册心理健康教案-26《和拖延的坏朋友说再见》 北师大版
- 2025年2月消毒科专科模拟考试题(附答案)
- 蒸汽小火车水彩水墨画课件
- 2025年高考生物试题分类汇编生物的变异与进化(原卷版)
- 2025年国家统一司法考试真题及答案
- 绿色矿山培训课件
- 纪念抗美援朝队会课件
- 2025-2026学年人教版(2024)小学数学三年级上册(全册)教学设计(附目录P296)
- 2025广东茂名市信宜市供销合作联社招聘基层供销社负责人2人笔试模拟试题及答案解析
- 成人反流误吸高危人群全身麻醉管理专家共识(2025版)解读
- DGJ08-81-2015 现有建筑抗震鉴定与加固规程
- 碳中和技术概论全套教学课件
- 材料风险调差表
- 精细化管理课件PPT课件
- 村卫生室整治工作会议讲话
评论
0/150
提交评论