单片机课程设计1.doc_第1页
单片机课程设计1.doc_第2页
单片机课程设计1.doc_第3页
单片机课程设计1.doc_第4页
单片机课程设计1.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

课程设计任务书学院_专业_班级_姓名_一、 课程设计题目:_二、 课程设计主要参考资料:(1)_(2)_(3)_(4)_三、 课程设计应解决的主要问题:(1)_(2)_(3)_(4)_四、 课程设计相关附件(如:图纸、软件等):(1)_(2)_(3)_(4)_五、 课程设计开始日期:_ 课程设计完成日期:_指导老师签字:_指导老师对课程设计的评语 指导老师签字:_ _年_月_日 一、 主要器件与软件介绍:1. 单片机介绍: 单片微型计算机简称单片机,是典型的嵌入式微控制器(microcontroller unit),常用英文字母的缩写mcu表示单片机,它最早是被用在工业控制领域。单片机由芯片内仅有cpu的专用处理器发展而来。最早的设计理念是通过将大量外围设备和cpu集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。intel的z80是最早按照这种思想设计出的处理器; 单片机有40个引脚,功能大致可以分为4个种类:电源、时钟、控制和i/o引脚。电源: vcc - 芯片电源,接+5v; vss - 接地端;时钟:xtal1、xtal2晶体振荡电路反相输入端和输出端;控制:控制线一共有4根: ale/prog:地址所存允许/片内eprom编程脉冲 psen:外rom读选通信号 rst/vpd:复位/备用电源 ea/vpp:内外rom选择/片内eprom编程电源i/o引脚:80c51共有4个8位并行i/o端口:p0、p1、p2、p3口,共32个引脚。p3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)p3口第二功能: p30 rxd 串行输入口 p31 txd 串行输出口 p32 int0 外部中断0(低电平有效) p33 int1 外部中断1(低电平有效) p34 t0 定时计数器0 p35 t1 定时计数器1 p36 wr 外部数据存储器写选通(低电平有效) p37 rd 外部数据存储器读选通(低电平有效)2. 74hc164介绍:8位串入、并出移位寄存器74hc164、74hct164 是高速硅门 cmos 器件,与低功耗肖特基型 ttl (lsttl) 器件的引脚兼容。74hc164、74hct164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(dsa 或 dsb)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。符号引脚说明a1数据输入b2数据输入q0q336输出gnd7接地cp8时钟输入/m/r9中央复位输入q4q71013输出vcc14正电源3. 数码管介绍:按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(com)的数码管。共阳数码管在应用时应将公共极com接到+5v,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(com)的数码管。共阴数码管在应用时应将公共极com接到地线gnd上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。4. keil uvision2 软件介绍:keil uvision2是美国keil software公司出品的51系列兼容单片机c语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,c语言在功能上、结构上、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期, 他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。keil c51软件提供丰富的库函数和功能强大的集成开发调试工具,全windows界面,使爱好者在很短的时间内就能学会使用keil c51来开发您的单片机应用程序;5. proteus7 软件介绍:proteus软件是英国labcenter electronics公司出版的eda工具软件。它不仅具有其它eda工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。proteus是世界上著名的eda工具,从原理图、代码调试到单片机与外围电路协同仿真,一键切换到pcb设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、pcb设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、hc11、pic10/12/16/18/24/30/dspic33、avr、arm、8086和msp430等,2010年即将增加cortex和dsp系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持iar、keil和mplab等多种编译器。6. protel 99 se 介绍:protel99se是应用于windows9x/2000/nt操作系统下的eda设计软件,采用设计库管理模式,可以进行联网设计,具有很强的数据交换能力和开放性及3d模拟功能,是一个32位的设计软件,可以完成电路原理图设计,印制电路板设计和可编程逻辑器件设计等工作,可以设计32个信号层,16个电源-地层和16个机加工层。电路工程设计部分: 电路原理设计部分:电路原理设计部分包括电路图编辑器(简称sch)、电路图零件库编辑器(简称schlib编辑器)和各种文本编辑器。 印刷电路板设计系统:印刷电路板设计系统包括电路板编辑器(简称pcb编辑器)、零件封装编辑器(简称pcblib编辑器)和电路板组件管理器。 自动布线系统:自动布线系统包含一个基于形状的无栅格自动布线器,用于印刷电路板的自动布线,以实现pcb设计的自动化。电路仿真与pld部分: 电路模拟仿真系统:电路模拟仿真系统包含一个数字/模拟信号仿真器,可提供连续的数字信号和模拟信号,以便对电路原理图进行信号模拟仿真从而验证其正确性与可行性。 可编程逻辑设计系统:可编程逻辑系统包含一个有语法功能的文本编辑器和一个波形编辑器。主要功能是对逻辑电路进行分析、综合;观察信号的波形。利用pld系统可以最大限度的精简逻辑部件,使数字电路设计达到最简化。 高级信号完整性分析系统:高级信号完整性分析系统提供了一个精确的信号完整性模拟器,可用来分析pcb设计、检查电路设计参数、实验超调量、阻抗和信号谐波要求等。二、设计步骤:1.protel使用:画原理图:选组件:选出单片机、74hc164、去耦电容、瓷片电容、数码管、稳压管、电解电容、按键。电路构造: 三个按键,一个模式键、一个加键、一个减键,分别接入单片机的p1.2、p1.1、p1.0,设置串口发送波特率,rxd送到a、b,txd送到cp,当做时钟用,其中74hc164与数码管相连得准确,否则会乱码。注意,因为购买器件时,按键是4腿的,所以画原理图时尽量与实物图一致,更改按键如右图: 电路连线:如图画版图:先编号(tools-annotate),再生成网标文件(design-create netlist),再打开.pcb文件,导入刚生成的网表文件(design-load nets),再手工布局布线,同时注意规则,如电源线加粗之类的地方,另外在正确连线的基础上,尽量美观。另外其三维俯视图如下图:然后送至生产pcb板的厂家生产板子,购买器件,焊接,烧写程序,调试程序,直至完成设计要求。2.keil uvision2 使用:新建工程,保存之后并选择相关单片机类型,如下图:下图选择atmel公司的at89从c51系列单片机类型:添加文件:选择target 1-source group 1,右击选择add files to group source group 1如图:程序调试:程序对p1.0、p1.1、p1.2口在reg51.h中定义,否则会出错。编译结果:3.proteus使用:画原理图:选器件,51单片机、74hc164、led、气段数码管、稳压管、电容(因为由于proteus仿真功能强大,仿真时复位电路不需加,电阻都不用加,但在proutel中画原理图和pcb都加上用于实际电路焊接,复位时显示11年1月1日,这是编程决定的,在后续程序中提到,这里不赘述。),先显示下图:仿真:添加hww.hex文件到单片机中,并设置成6mhz,开始运行:接下来立即就显示11年1号1日:大概过0.5秒的接下来显示12点整:下来显示的时分秒就不截图了,截年月日这关键图:多截图,以提供动态显示的效果:(当对日先加到3号)再按减,慢慢减到1号:但是减到1号后,就不再减,只是闪烁(原因在特别注意中有解释):再按加,因为当前是1月,加到31号后就为2月1号:因为11年(不是闰年)的2月份只有28天,故之后就为3月1号:再调年数,看看闰年的2月份是否是29天:如上图所示,完全正确;再调,看看4月份,是否为30天:如图完全正确;看看时分秒、年月日进位情况,为了把所有的数码管都用上,故设置成99年12月31号23点59分59秒:再过一秒就是00年1月1号00点00分00秒:以上图都说明这些时分秒年月日显示及进位都没问题,证明程序没问题,满足设计要求。二、 程序说明: 定义变量(简要变量):显示缓冲区unsigned char dispbuf6;结构体变量time、calendar,其中成员分别为hour、min、sec和yea、mon、day,用于显示;标志位 flag2、flag1、flag0,分别对应p1.0、p1.1、p1.2口的标志位; flag_time、flag_calendar对应用于显示时分秒还是年月日; flash_flag、display_back对应闪烁显示和缓冲区备份 ledcode、errorledcode分别对应正确和错误版图的要显示的十个数0到9;定义函数(简单函数):初始化函数: void ini(void) calendar.yea=11;calendar.mon=01;calendar.day=01;time.hour=12;time.min=0;time.sec=0;tmod=0x01; th0=(65536-25000)/256; tl0=(65536-25000)%256; tr0=1; et0=1; ea=1;显示函数()void displaybuf(void) unsigned char i; for(i=0;i=31) calendar.day=1; calendar.mon+; else if(calendar.day=29) calendar.day=1; calendar.mon+; else if(calendar.day=28) calendar.day=1; calendar.mon+; else if(calendar.day=30) calendar.day=1; calendar.mon+; else if(calendar.day=13)calendar.mon=1; calendar.yea+;特别说明:调表时只有机械地加减,并不考虑进位和借位;在显示年月日时,四个led灯均不亮,以便和时分秒区分;按加减时,只需要按一下即可实现调多下的功能(因为按键毕竟灵活有限,这样每秒增或减即人性化又科学化,又方便简单)每个数码管发生变化时(肉眼看到的表面现象)只在每半秒跳动,这样肉眼很容易分别,看起来也美观大方,不别扭;跳表时,对时分秒调时,加减情况只与对应的管有关联,故需对其他位管调时,再按一下增或减;没有按键按下时,故显示时分秒,当模式键按一下对秒(同时可以按下其它两键进行调表)操作,再按一下是分,下一次是时,再按一下就显示年月日,再按模式键就对日(同时可以按下其它两键进行调表)操作,再按一下是月,下一次是年,最后一次就回到显示时分秒;各位都正常进位,完全正确;本程序年只能显示两位,故最多只能显示0到99,默认为2000年到2099年,根据闰年规则,能被100或400整除的,或者是不能被100整除,但能被4整除的也是闰年,其2月份是28天,不是闰年就是29天,这些由(proteus)上图来示意演示;调年月日时,减操作(对日)能减,但当减到1号时,号就不再减,只是闪烁(这由内部函数test_calendar()加加,而到调表函数case 5中是减减,故不能实现减,只能闪烁)而加操作可以使号数增加,还可以使月增加,甚至年增加;三、程序清单:#include#includeunsigned char dispbuf6; /显示缓冲区struct /设定时间结构体unsigned char hour; unsigned char min; unsigned char sec; time; struct /设定时间结构体unsigned char yea; unsigned char mon; unsigned char day; calendar; unsigned char point=0;unsigned char flag0=0;unsigned char flag_time=0;unsigned char flag_calendar=0;unsigned char flag1=0;unsigned char flag2=0;unsigned char t0_int_times=0; /中断次数计数变量unsigned char flash_flag=0; /闪烁标志,每半秒闪烁unsigned char display_back=0; /显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致code unsigned char ledcode=0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80,0xff; /数码管显示代码code unsigned char errorledcode=0x01,0xe7,0x12,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80;/绘制错误图纸的数码管显示代码/*/ 年月日显示函数/*void test_calendar(void) switch(calendar.mon) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(calendar.day=31) calendar.day=1; calendar.mon+; else if(calendar.day=29) calendar.day=1; calendar.mon+; else if(calendar.day=28) calendar.day=1; calendar.mon+; else if(calendar.day=30) calendar.day=1; calendar.mon+; else if(calendar.day=13) calendar.mon=1; calendar.yea+;/*/*/ ini 初始化代码/ 设定50ms中断一次,注:在fosc=6mhz情况下/*void ini(void) time.sec=0;time.min=0;time.hour=12;calendar.yea=11;calendar.mon=01;calendar.day=01;th0=(65536-25000)/256;tl0=(65536-25000)%256;tmod=0x01;tr0=1;et0=1;ea=1;/*/ 把显示缓冲区的内容发到74hc164/* void displaybuf(void)unsigned char i;for(i=0;i=10) /每半秒更新闪烁标志 flash_flag =1; else flash_flag =0; if(t0_int_times=20)/如果中断20次为1秒的时间开始更新时、分、秒 t0_int_times=0; time.sec+; if(time.sec=60) time.sec=0; time.min+; if(time.min=60) time.min=0; time.hour+;if(time.hour=24) time.hour=0; test_calendar(); /*/ 把时间转换为可以显示的代码/*void changetodispcode_calendar(void)dispbuf0=ledcodecalendar.yea/10; dispbuf1=ledcodecalendar.yea%10; dispbuf2=ledcodecalendar.mon/10; dispbuf3=ledcodecalendar.mon%10; dispbuf4=errorledcodecalendar.day/10; dispbuf5=ledcodecalendar.day%10;void changetodispcode_time(void)dispbuf0=ledcodetime.hour/10; dispbuf1=ledcodetime.hour%10; dispbuf2=ledcodetime.min/10; dispbuf3=ledcodetime.min%10; dispbuf4=errorledcodetime.sec/10; dispbuf5=ledcodetime.sec%10;/*/ 主程序/*void main (void)unsigned int j;ini(); /初始化changetodispcode_calendar();dispbuf2=dispbuf2|0x10; /双点熄灭dispbuf4=dispbuf4|0x20;displaybuf();for(j=0;j=32000;j+); /延时flag_time=1; /显示时分秒for(;)if(p1_2=0) /扫描模式键有无按下 flag0=0;flag1=0;flag2=1;for(j=0;j=20000;j+);if(p1_2) point=(point+1)%8; /模式累加以供作多路选择 else if(p1_1=0) /+键扫描,增 for(j=0;j=20000;j+); if(p1_1) flag1=1; /若有+,则把-置零 flag0=0; else if(p1_0=0) /-键扫描,减 for(j=0;j0) switch(point%4) case 1:dispbuf5=0x0ff;/使对应的数码管灭,以达到闪烁效果 dispbuf4=ledcode10;break; case 2:dispbuf3=ledcode10; dispbuf2=ledcode10;break; case 3:dispbuf1=ledcode10; dispbuf0=ledcode10;break; else if(flash_flag=0) switch (point) case 1: if(flag1) /通过+-来调表 time.sec=(time.sec+1)%60; else if (flag0) time.sec=(time.sec+60-1)%60;break; case 2: if(flag1) time.min=(time.min+1)%60;else if (flag0) time.min=(time.min+60-1)%60;break; case 3: if(flag1)if( time.hour=23) time.hour=0; calendar.day+;else time.hour+; else if (flag0) time.hour=(time.hour+24-1)%24;break; dispbuf2=dispbuf2&0xef; /点亮双点 dispbuf4=dispbuf4&0xdf; if(flag_calendar) changetodispcode_calendar(); /转化年月日为可显示代码 dispbuf2=dispbuf2|0x10; /双点熄灭,使 dispbuf4=dispbuf4|0x20;if(flash_flag) /更新双点闪烁 if(point0) switch(point%4) case 1: dispbuf5=0x0ff; dispbuf4=ledcode10; break; case 2: dispbuf3=ledcode10; dispbuf2=ledcode10;break; case 3: dispbuf1=ledcode10; dispbuf0=ledcode10;break; else switch(point) case 5: if(flag1) test_calendar(); else if(flag0) if(calendar.day=1) test_calendar(); calendar.day-; elsecalendar.day-; break; case 6: if(flag1) if(calendar.mon=12) calendar.mon=1; calendar.yea+; else calendar.mon+;else if (flag0) if(calendar.mon

温馨提示

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

评论

0/150

提交评论