单片机电子秒表课程设计报告.doc_第1页
单片机电子秒表课程设计报告.doc_第2页
单片机电子秒表课程设计报告.doc_第3页
单片机电子秒表课程设计报告.doc_第4页
单片机电子秒表课程设计报告.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

题目: 秒表计时器课程: 单片机课程设计专业:班级:学号:姓名:指导老师:设计时间: 25目录一、 设计目的二、 设计要求三、 设计原理四、 电路的功能单元设计五、 各项程序六、设计心得体会一、 设计目的1、用红、绿、黄三色发光二极管做信号灯,主干道a为东西向,设红、绿、黄三色灯为ar、ag、ay;支干道b喂南北向。三色灯为br、bg、by。2、主干道车辆较多,所以亮绿灯的时间设为50s;支干道亮绿灯的时间设为30s。当主干道允许通行亮绿灯时则支干道亮红灯;相反,支干道允许通行亮绿灯时则主干道亮红灯。每次由绿灯转变为红灯时,其间要亮5s的黄灯作为过渡,以便行驶中的车辆有时间停到禁止线以内。3、交通灯正常运行时,用4位数码管m1、m2、m3、m4显示主干道和支干道的倒计时时间,m1、m2显示主干道在当前状态剩余时间;m3、m4显示支干道在当前状态的剩余时间。4、能实现系统总清0,清0后计数器由出事状态开始计数。指示灯指示主干道亮绿灯。5、具有一定的扩展功能: 它能实现特殊状态的功能先死,用开关s作为特殊信号传感器,s为1时进入特殊状态并实现下列特殊状态功能: 1)显示器m1、m2、m3、m4闪烁,即在全0和当前计时时间中交替显示。 2)计数器停止计数并保持原来的时间数据。 3)东西、南北方向的三色灯全显示为红色状态。 4)特殊状态解除后能继续返回正常工作状态。 5)进入特殊状态时,音响电路发出急促的“嘀嘟”声,以示警告。二、设计要求 1、分析设计任务,拟定多种设计方案,根据当时的制作条件,选定其中的一种方案绘制系统框图和设计流程。三、设计原理系统模块划分根据设计要求系统分为4大模块1. 主程序模块(内包含发声模块)2. 键盘按键模块3. 1602显示模块4. 1307时钟模块系统设计思路根据设计要求,我们主程序模块主要以按键为触发其他状态的信号,没有按键时,循环执行当前状态内容,即扫描按键,通过i2c读取1307内部存储时间并在lcd1602上显示。而定时器0主要用来发声脉冲的建立。程序状态主要分为三种(即:秒表模式swit_flag=1、北京时间模式swit_flag=0)a)在时间模式下可以通过设置年月日时分秒的键和一个加键一个减键来设置需要显示的时间;b)秒表模式下,通过切换键切换到秒表模式,通过选择键(即顺计时和倒计时的选择),可以设置需要倒计的时间长度,按相应的键保存当前的数据,按显示键,显示之前保存相应组别的数据(详见流程图)。倒计时到零时,蜂鸣器会发出响声,提醒时间到。主程序流程框图lcd显示n实现当前状态下功能状态转换s0、s1、s2初始化是否有键按?下?y秒表模式 进入秒表 读取秒表功能键 判断键值 打开定时器 查看记录 进入到计时开始计时 键=5,暂停 键=6,查看 按键14和键并存储 记录 10,初值设定 键=13, 开始倒计时 显示=13=9=2 时间模式 进入时间模式 读取键值 关闭时间读取, 键值=7? 对ds1307进 行时间设置 正常读取 ds1307 显示 四、电路的功能单元设计4.1按键电路设计由于设计要求使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的i/o线的数目,在按键比较多的时候,通常采用这样方法。其原理如图41所示。图41每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要n条行线和m条列线,即可组成具有nm个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。对照图24所示的44键盘,说明线反转个工作原理。首先辨别键盘中有无键按下,有单片机i/o口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00h,把全部列线置为低电平,然后将列线的电平状态读入累加器a中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。按键的操作面板如图图44所示。共计数字键10个,功能键6个。tmolzcsr+e1图34 按键操作面板示意图s+ps-e2r-图4-4键位说明:m:模式转换键t:时间模式复位键c:年月日时分秒的切换s+:时间调整+s-:时间调整-l:切入秒表储存记录z:查看秒表储存记录e1:高位倒计时设定e2:低位倒计时设定o:进入秒表s:秒表时间记录键r+:正计时秒表开始r-:倒计时秒表开始p:秒表暂停键4.2 显示电路设计lcd显示信号连接图如图1.7所示。图1.7 lcd信号连接关键网络名和引脚名解释: (1)disctrl04:显示控制信号。(2)d0d7、db0db7:数据总线。(3)e:lcd使能信号。(4)rs:数据、指令选择信号。(5)rw:读、写选择信号。(6)cs1、cs2:lcd12864由两部分组成,cs1和cs2为选择信号。4.3 at24c02掉电存储单元的设计掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。at24c02是atmel公司的2kb字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5v,额定电流为1ma,静态电流10ua(5.5v),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的dip封装,使用方便。其电路如图25所示。图37 掉电存储电路原理图图中r8、r10是上拉电阻,其作用是减少at24c02的静态功耗,由于at24c02的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线scl(移位脉冲)和sda(数据/地址)与单片机传送数据。每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。五、各项程序5.1主程序main#include #includeintrins.h#includertch.h#include key.h#include lcd.h#define unchar unsigned charunsigned int tsave25=0,0,0,0,0,0,0,0,0,0;unsigned int miao = 0;unsigned char interruptcounter=0;/定义中断计数变量并赋初值0unsigned char flag=0;/判断倒计时sbit alarm =p26;/函数声明void delay(unsigned int t);/ void beep() unsigned int num; for(num=0;num500;num+) alarm=alarm; delay(100); void delay(unsigned int t)unsigned int i;for(i = 0;i t;i+);void main() unsigned char table116= ;unsigned char table216= ;unsigned char table10=0123456789 ; unsigned char time7;unsigned char m4; unsigned char state,set_tim=0;unsigned char swit_flag=0,time_f=0,set_f=0; unsigned char p;unsigned char han=1 ,lie =1;unsigned char dajs=0,play_f=0,i;pllcon&=0xf8;/设置频率为12.58mhzcfg848|=0x01;/使用片内xram i2ccon=0xe8;/配置iic为软件主发送模式p2 &= 0xe1;p3 &= 0x17;tmod=0x01; /配置定时器0为16位模式,时钟为12.58mhzie=0x82; /使能定时器0中断和全局中断th0=0x0a;tl0=0x4c;tr0=0; /关闭、开启定时器0flag=0;/显示初始化init_lcd();/while(1) /lcd显示write_lcd(0,0x80);for(p = 0;p = 15;p+)write_lcd(1,table1p);write_lcd(0,0x80+0x40);for(p = 0;p 59)time0=0;/secondif(set_f=2)time1+;if(time159)time1=0;/minuteif(set_f=3)time2+;if(time223)time2=0;/hour if(state=15) if(set_f=1)time0-;if(time0=255)time0=59;/secondif(set_f=2)time1-;if(time1=255)time1=59;/minuteif(set_f=3)time2-;if(time2=255)time2=23;/hour if(set_f!=0)settime(time); if(state=11) if(set_f=5)time5+;if(time512)time5=1;/monthif(set_f=6)time6+;if(time699)time6=0;/yearif(set_f=4)time4+; switch(time5) case 1: case 3: case 5: case 7: case 8: case 10: case 12:if(time431)time4=1;break; case 4: case 6: case 9: case 11:if(time430)time4=1;break; case 2: if(time6%4)if(time428)time4=1; else if(time429)time4=1; break; default:break; /data if(state=15) if(set_f=5)time5-;if(time5=255)time5=12;/monthif(set_f=6)time6-;if(time6=255)time6=99;/yearif(set_f=4)time4-; switch(time5) case 1: case 3: case 5: case 7: case 8: case 10: case 12:if(time4=255)time4=31;break; case 4: case 6: case 9: case 11:if(time4=255)time4=30;break; case 2: if(time6%4)if(time4=255)time4=28; else if(time4=255)time4=29;break; default:break; /data if(set_f!=0)settime(time); if(set_f=0)readtime(time); /清屏for(i=0;i=1001) miao=0; /低二位设置 if(state=10) tr0=0;play_f=0; miao=miao+100; if(miao=1001) miao=0; /高二位设置 if(state=2)/显示 tr0=0; play_f=1; han=1;lie=1; miao=tsavelie-1han-1; if(play_f=1) if(state=6) tr0=0; han=han+1; if(han=6) han=1; lie=lie+1; if(lie=3) lie=1;han=1; miao=tsavelie-1han-1; / m0=miao%10; m1=(miao%100)/10; m2=(miao%1000)/100; m3=miao/1000; /清屏for(i=0;i=20)interruptcounter=0;if(flag=0) miao+; if(miao = 1001)miao = 0;if(flag=1)/倒计时 miao-; if(miao=0|miao=65535)miao = 0; 5.2、i2c及1307程序#include #includeintrins.h#define unchar unsigned char/函数声明 unsigned char key_process(); void delay(); void delay1(unsigned int count); void iic_delay(); void init (void); void start(void); void stop(void); void ack(void); void unack() ; unchar read(void); void write(unchar a); void settime(unsigned char time7); void readtime(unsigned char time7); /iic void delay1(unsigned int count) /延时1ms程序unsigned int i,j;for(i=0;icount;i+)for(j=0;j120;j+); void iic_delay() _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();void init (void) mco=1; mde=1; mdo=1;void start(void) mde=1; mdo=1; mco=1; iic_delay(); mdo=0; iic_delay(); void stop(void) mde=1; mdo=0; mco=1; iic_delay(); mdo=1; iic_delay();void ack(void) unchar i=0; mco=1; mde=1; iic_delay(); while(mdo=1&i100) i+; mco=0; iic_delay();void unack() mde=1; mdo=1; iic_delay(); mco=1; iic_delay(); mco=0; iic_delay(); unchar read(void) unchar i,dat; dat=0; mco=0; iic_delay(); mde=1; mdo=1; mde=0; iic_delay(); for(i=0;i8;i+) mco=1;dat=dat1;dat=dat|mdi; iic_delay();mco=0;iic_delay(); return dat;void write(unchar a) unchar i; mco=0; mde=1; iic_delay(); for(i=0;i8;i+) if(a&0x80) mdo=1; else mdo=0; a=a1; iic_delay(); mco=1; iic_delay(); mco=0; iic_delay(); mdo=1;iic_delay(); void readtime(unsigned char time7) bit eatemp; unsigned char temp,i; eatemp=ea;for(i=0;i4)*10+(time0&0x0f); /second time1=(time1&0x7f)4)*10+(time1&0x0f); /minute if(time2&0x40) if(time2&0x20)temp=0x80;else temp=0x40; time2=(time2&0x1f)4)*10+(time2&0x0f); /12hour time2|=temp; else time2=(time2&0x3f)4)*10+(time2&0x0f);/24 time3=time3&0x07; /week time4=(time4&0x3f)4)*10+(time4&0x0f); /date time5=(time5&0x1f)4)*10+(time5&0x0f); /month time6=(time64)*10+(time6&0x0f); /year ea=eatemp;void settime(unsigned char time7) bit eatemp; unsigned char temp=0; unsigned char timetemp7; eatemp=ea; for(temp=0;temp7;temp+)timetemptemp=timetemp; temp=0; timetemp6=(timetemp6/10)4)+(timetemp6%10);/year timetemp5=(timetemp5/10)4)+(timetemp5%10);/month timetemp4=(timetemp4/10)4)+(timetemp4%10);/date timetemp3=(timetemp3/10)4)+(timetemp3%10);/week /to ascii if(timetemp2&0xc0)=0x00) timetemp2=(timetemp2/10)4)+(timetemp2%10); else if(timetemp2&0xc0)=0x01)temp=0x40;else temp=0x60; timetemp2&=0x3f; timetemp2=(timetemp2/10)4)+(timetemp2%10); timetemp2|=temp; /hour timetemp1=(timetemp1/10)4)+(timetemp1%10);timetemp1&=0x7f;/minute timetemp0=(timetemp0/10)4)+(timetemp0%10); /second timetemp0&=0x7f; start(); write(0xd0); ack(); write(0x00); ack(); write(timetemp0); ack(); write(timetemp1); ack(); write(timetemp2); ack(); write(timetemp3); ack(); write(timetemp4); ack(); write(timetemp5); ack(); write(timetemp6); ack(); stop(); delay1(1); ea=eatemp; 5.3按键程序#include void keydelay(unsigned int keytime);unsigned char getkey();unsigned char getkey()static unsigned char keyhavefree=1;unsigned char temp,keytemp=0xff;p1&=0xf0;p2&=0xf0; temp=p1&0x0f;if(keyhavefree) if(temp!=0x0f)/判断是否有按键按下; keydelay(1000);/消抖; if(temp=(p1&0x0f) p2|=0x0e;/忽略高四位; switch(p1&0x0f) case 0x0e:keytemp=3;break; case 0x0d:keytemp=7;break; case 0x0b:keytemp=11;break; case 0x07:keytemp=15;break; case 0x0f:break; default:keytemp= 0x80;break; p2&=0xf0;p2|=0x0d; switch(p1&0x0f) case 0x0e:keytemp= 2;break; case 0x0d:keytemp= 6;break; case 0x0b:keytemp= 10;break; case 0x07:keytemp= 14;break; case 0x0f:break; default:keytemp= 0x81;break; p2&=0xf0;p2|=0x0b; switch(p1&0x0f) case 0x0e:keytemp= 1;break; case 0x0d:keytemp= 5;break; case 0x0b:keytemp= 9;break; case 0x07:keytemp= 13;break;

温馨提示

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

评论

0/150

提交评论