课程论文
题 目:作 者:所在学院:专业年级:学 号:指导教师:职 称:
基于51单片机和DS1302万年历的设计 信息科学与工程学院 讲 师
2013年 6月 13日
1
Proteus简介:
Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Keil简介:
2009年月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。新版本支持更多最新的ARM芯片,还添加了一些其他新功能。2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。
基本组成:
硬件控制电路主要用了ATC51芯片处理器、1602LCD显示器、DS1302实时时钟。根据各自芯片的功能互相连接成电子万年历的控制电路。软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及温度显示程序等组成。
2
ATC51单片机:
本系统采用的是美国ATMEL公司生产的ATC51单片机,首先我们来熟悉一下ATC51单片机的外部引脚和内部结构。 1.单片机的引脚功能
ATC51单片机有40个引脚。
Vcc:电源电压+5V GND:接地
P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线服用,在访问期间激活内部上拉电阻。 在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时要求外接上拉电阻。
P1口:P1口是一个带内部上拉电阻的8位双向I/O,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
Flash 编程和程序校验期间,P1接收低8位地址。 P2口:P2口是一个带内部上拉电阻的8位双向I/O,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(MOVX @Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。
3
Flash 编程和程序校验期间,P2亦接收低高位地址和其他控制信号。
P3口:P3口是一组带内部上拉电阻的8位双向I/O,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部的上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,见表3-1所示:
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
表3-1 P3口的第二功能图 端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD(串行输入口) TXD(串行输出口) INT0(外中断0) INT1(外中断1) T0(定时/计时器0外部输入) T1(定时/计时器1外部输入) WR(外部数据存储器写选通) RD(外部数据存储器读选通) RST:复位输入。当振荡器工作时,RST引脚出现两个机器周
期以上高电平将使单片机复位。WDT溢出将使引脚输出高电平,设置SFR AUXR的DISRT0(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存器允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数
4
据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过多特殊功能寄存器(SFR)区中的8EH单元的D0位置,可禁止ALE操作。该位置后,只有一条MOVX和MOVC指令ALE才会被激活。另外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
PSEN:程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当ATC51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的变成电压Vpp. XTAL1:振荡器反相放大器及内部时钟发生器的输入端。 XTAL2:振荡器反相放大器的输出端。 ATC51单片机内部结构
2.ATC51单片机与MCS-51完全兼容
看门狗(WDT):WDT是一种需要软件控制的复位方式。WDT 由13位计数器和特殊功能寄存器中的看门狗定时器复位存储器
(WDTRST)构成。WDT 在默认情况下无法工作;为了激活WDT,用户必须往WDTRST 寄存器(地址:0A6H)中依次写入01EH 和0E1H。当WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT计时周期依赖于外部时钟频率。除了复位(硬件复位或WDT溢出复位),没有办法停止WDT工作。当WDT溢出,它将驱动RSR引脚输出一个高电平。
可编程串口(UART)在ATC51中,UART 的操作与ATC51 和ATC52 一样。ATC51系列单片机的串行通信口可以工作于同步和异步通信方式。当工作于异步方式时,它具有全双工的操作功能,也就是说,它可以同时进行数据的发送和接收。串行口内的接收器采用
5
的是双缓冲结构,能够在接收到的第一个字节从接收寄存器读走之前就开始接收第二个字节(当然,如果第二个字节接收完毕,而第一个字节仍然没有被读走,那将会丢掉一个字节)。串行口的发送和接收操作都是通过特殊功能寄存器中的数据缓冲寄存器SBUF进行的,但在SBUF的内部,接收寄存器和发送寄存器在物理结构上是完全的。如果将数据写入SBUF,数据会被送入发送寄存器准备发送。如果执行SBUF指令,则读出的数据一定来自接收缓存器。因此,CPU对SBUF的读写,实际上是分别访问2个不同的寄存器。这2个寄存器的功能决不能混淆。
振荡电路:ATC51系列单片机的内部振荡器,由一个单极反相器组成。XTAL1反相器的输入,XTAL2为反相器的输出。可以利用它内部的振荡器产生时钟,只要XTAL1和XTAL2引脚上一个晶体及电容组成的并联谐振电路,便构成一个完整的振荡信号发生器,此方式称为内部方式。另一种方式由外部时钟源提供一个时钟信号到XTAL1端输入,而XTAL2端浮空。在组成一个单片机应用系统时,多数采用这种方式,这种方式结构紧凑,成本低廉,可靠性高。在电路中,对电容C1和C2的值要求不是很严格,如果使用高质的晶振,则不管频率为多少,C1、C2通常都选择30pF。
定时/计数器:ATC51单片机内含有2个16位的定时器/计数器。当用于定时器方式时,定时器的输入来自内部时钟发生电路,每过一个机器周期,定时器加1,而一个机器周期包含有12个振荡周期,所以,定时器的技术频率为晶振频率的1/12,而计数频率最高为晶振频率的1/24。为了实现定时和计数功能,定时器中含有3种基本的寄存器:控制寄存器、方式寄存器和定时器/计数器。控制寄存器是一个8位的寄存器,用于控制定时器的工作状态,方式寄存器是一个8位的寄存器,用于确定定时器的工作方式,定时器/计数器是16位的计数器,分为高字节和低字节两部分。
RAM:高于7FH内部数据存储器的地址是8位的,也就是说其地址空间只有256字节,但内部RAM的寻址方式实际上可提供384字节。的直接地址访问同一个存储空间,高于7FH的间接地址访问另一个存储空间。这样,虽然高128字节区分与专用寄器 ,即特殊功能寄存器区的地址是重合的,但实际上它们是分开的。究竟访问哪一区,存是通过不同的寻址方式加以区分的。
SFR:SFR是具有特殊功能的所有寄存器的集合,共含有22个不
6
同寄存器,它们的地址分配在80H~FFH中。虽然如此,不是所有的单元都被特殊功能寄存器占用,未被占用的单元,其内容是不确定的。如对这些单元进行读操作,得到的是一些随机数,而写入则无效,所以在编程时不应该将数据写入这些未确定的地址单元中,特殊功能寄存器主要有累加器ACC、B寄存器、程序状态字寄存器PSW、堆栈指针SP、数据指针DPTR、I/O端口、串行口数据缓冲器SBUF、定时器寄存器、捕捉寄存器、控制寄存器。
中断系统:ATC51单片机有6个中断源,中断系统主要由中断允许寄存器IE、中断优先级寄存器IP、优先级结构和一些逻辑门组成。IE寄存器用于允许或禁止中断;IP寄存器用于确定中断源的优先级别;优先级结构用于执行中断源的优先排序;有关逻辑门用于输入中断请求信号。在整个中断响应过程中CPU所执行的操作步骤如下:
(1)完成当前指令的操作
(2)将PC内容压入堆栈 (3)保存当前的中断状态 (4)阻止同级的中断请求
(5)将中断程序入口地址送PC寄存器 (6)执行中断服务程序
DS1302实时时钟:
1 时钟芯片DS1302的工作原理:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图所示。为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。
7
位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。2 DS1302的控制字节:DS1302的控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
表-1 DS1302的控制字格式
RAM RD 1 A4 A3 A2 A1 A0 / CK /WR
3 数据输入输出(I/O):在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图所示:
8
图1 DS1302读/写时序图
4 DS1302的寄存器:DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字。此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
实时时钟电路设计:
DS1302与单片机的连接,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。
9
DS1302时钟程序流程:
流程图分析:DS1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片的时间数据送入液晶显示。这时若有设置键按下,进行时间修改,完成后将时间数据送入1302芯片,若没有按键按下,直接送入EPROM中,送入液晶显示。
10
LCD显示程序流程:
流程图分析如下:首先对1602显示屏进行初始化(初始化大约持续10ms),然后检查忙信号,若BF=0,则获得显示RAM地址,写入相应的数据显示。若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=0为止。
11
Proteus电路图:
Proteus运行图:
12
源程序:
#include #define uint unsigned int #define uchar unsigned char uchar a,miao,shi,fen,ri,yue,nian,week,key1n,temp; #define yh 0x80 13 #define er 0x80+0x40 sbit rs=P2^6; sbit en=P2^7; sbit rw=P2^5; sbit IO=P3^4; sbit SCLK=P3^6; sbit RST=P3^5; sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit key1=P2^0; sbit key2=P2^1; sbit key3=P2^2; uchar code tab1[]={\"20 - - \uchar code tab2[]={\" : : \ 14 void delay(uint xms) { uint x,y; for(x=xms;x>0;x--) for(y=120;y>0;y--); } void write_1602com(uchar com) { rs=0; rw=0; P0=com; delay(1); en=1; delay(1); en=0; } 15 void write_1602dat(uchar dat) { rs=1; rw=0; P0=dat; delay(1); en=1; delay(1); en=0; } void lcd_init() { write_1602com(0x38); write_1602com(0x0c); write_1602com(0x06); write_1602com(0x01); write_1602com(yh+1); 16 for(a=0;a<14;a++) { write_1602dat(tab1[a]); //delay(3); } write_1602com(er+2); for(a=0;a<8;a++) { write_1602dat(tab2[a]); //delay(3); } } void write_byte(uchar dat) { ACC=dat; RST=1; for(a=8;a>0;a--) 17 { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>1; } } uchar read_byte() { RST=1; for(a=8;a>0;a--) { ACC7=IO; SCLK=1; SCLK=0; ACC=ACC>>1; } 18 return (ACC); } void write_1302(uchar add,uchar dat) { RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0; } uchar read_1302(uchar add) { uchar temp; RST=0; SCLK=0; 19 RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp); } uchar BCD_Decimal(uchar bcd) { uchar Decimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F)); } void ds1302_init() { RST=0; SCLK=0; 20 write_1302(0x8e,0x00); write_1302(0x80,0x00); write_1302(0x82,0x00); write_1302(0x84,0x12); write_1302(0x8a,0x02); write_1302(0x86,0x11); write_1302(0x88,0x06); write_1302(0x8c,0x13); write_1302(0x8e,0x80); } void write_sfm(uchar add,uchar dat) { uchar gw,sw; gw=dat%10; sw=dat/10; write_1602com(er+add); 21 write_1602dat(0x30+sw); write_1602dat(0x30+gw); } void write_nyr(uchar add,uchar dat) { uchar gw,sw; gw=dat%10; sw=dat/10; write_1602com(yh+add); write_1602dat(0x30+sw); write_1602dat(0x30+gw); } void write_week(uchar week) { write_1602com(yh+0x0c); switch(week) 22 { case 1:write_1602dat('M'); write_1602dat('O'); write_1602dat('N'); break; case 2:write_1602dat('T'); write_1602dat('U'); write_1602dat('E'); break; case 3:write_1602dat('W'); write_1602dat('E'); write_1602dat('D'); break; case 4:write_1602dat('T'); write_1602dat('H'); write_1602dat('U'); break; 23 case 5:write_1602dat('F'); write_1602dat('R'); write_1602dat('I'); break; case 6:write_1602dat('S'); write_1602dat('T'); write_1602dat('A'); break; case 7:write_1602dat('S'); write_1602dat('U'); write_1602dat('N'); break; } } void keyscan() { 24 if(key1==0) { delay(9); if(key1==0) { while(!key1); key1n++; if(key1n==9) key1n=1; switch(key1n) { case 1: TR0=0; //TR1=0; write_1602com(er+0x09); write_1602com(0x0f); temp=(miao)/10*16+(miao)%10; 25 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp); write_1302(0x8e,0x80); break; case 2: write_1602com(er+6);//按2次fen位置显示光标 //write_1602com(0x0f); break; case 3: write_1602com(er+3);//按动3次,shi //write_1602com(0x0f); break; case 4: write_1602com(yh+0x0e);//按动4次,week //write_1602com(0x0f); break; 26 case 5: write_1602com(yh+0x0a);//按动5次,ri //write_1602com(0x0f); break; case 6: write_1602com(yh+0x07);//按动6次,yue //write_1602com(0x0f); break; case 7: write_1602com(yh+0x04);//按动7次,nian //write_1602com(0x0f); break; case 8: write_1602com(0x0c);//按动到第8次,设置光标不闪烁 TR0=1;//打开定时器 temp=(miao)/10*16+(miao)%10; 27 write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);//miao数据写入DS1302 write_1302(0x8e,0x80); break; } } } if(key1n!=0) { if(key2==0) { delay(10); if(key2==0) { 28 while(!key2); switch(key1n) { case 1:miao++; if(miao==60) miao=0; write_sfm(0x08,miao); temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,temp); write_1302(0x8e,0x80); write_1602com(er+0x09); //write_1602com(0x0b); break; case 2:fen++; if(fen==60) fen=0; 29 write_sfm(0x05,fen); temp=(fen)/10*16+(fen)%10; write_1302(0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80); write_1602com(er+6); break; case 3:shi++; if(shi==24) shi=0; write_sfm(2,shi); temp=(shi)/10*16+(shi)%10; write_1302(0x8e,0x00); write_1302(0x84,temp); write_1302(0x8e,0x80); write_1602com(er+3); break; 30 case 4:week++; if(week==8) week=1; write_1602com(yh+0x0C); write_week(week); temp=(week)/10*16+(week)%10; write_1302(0x8e,0x00); write_1302(0x8a,temp); write_1302(0x8e,0x80); write_1602com(yh+0x0e); break; case 5:ri++; if(ri==32) ri=1; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10; write_1302(0x8e,0x00); 31 write_1302(0x86,temp); write_1302(0x8e,0x80); write_1602com(yh+10); break; case 6:yue++; if(yue==13) yue=1; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10; write_1302(0x8e,0x00); write_1302(0x88,temp); write_1302(0x8e,0x80); write_1602com(yh+7); break; case 7:nian++; if(nian==100) nian=0; 32 write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_1302(0x8e,0x00); write_1302(0x8c,temp); write_1302(0x8e,0x80); write_1602com(yh+4); break; } } } if(key3==0) { delay(10);//调延时,消抖动 if(key3==0) { while(!key3); 33 switch(key1n) { case 1:miao--; if(miao==-1) miao=59; write_sfm(0x08,miao); temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,temp); write_1302(0x8e,0x80); write_1602com(er+0x09); break; case 2:fen--; if(fen==-1) fen=59; write_sfm(5,fen); 34 temp=(fen)/10*16+(fen)%10; write_1302(0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80); write_1602com(er+6); break; case 3:shi--; if(shi==-1) shi=23; write_sfm(2,shi); temp=(shi)/10*16+(shi)%10; write_1302(0x8e,0x00); write_1302(0x84,temp); write_1302(0x8e,0x80); write_1602com(er+3); break; 35 case 4:week--; if(week==0) week=7; write_1602com(yh+0x0C); write_week(week); temp=(week)/10*16+(week)%10; write_1302(0x8e,0x00); write_1302(0x8a,temp); write_1302(0x8e,0x80); write_1602com(yh+0x0e); break; case 5:ri--; if(ri==0) ri=31; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10; write_1302(0x8e,0x00); 36 write_1302(0x86,temp); write_1302(0x8e,0x80); write_1602com(yh+10); break; case 6:yue--; if(yue==0) yue=12; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10; write_1302(0x8e,0x00); write_1302(0x88,temp); write_1302(0x8e,0x80); write_1602com(yh+7); break; case 7:nian--; if(nian==-1) nian=99; 37 write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_1302(0x8e,0x00); write_1302(0x8c,temp); write_1302(0x8e,0x80); write_1602com(yh+4); break; } } } } } void init() { TMOD=0x11; TH0=0; TL0=0; 38 EA=1; ET0=1; TR0=1; } void main() { lcd_init(); ds1302_init(); init(); while(1) { keyscan(); } } void timer0() interrupt 1 { 39 miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); ri = BCD_Decimal(read_1302(0x87)); yue = BCD_Decimal(read_1302(0x)); nian=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); write_sfm(8,miao); write_sfm(5,fen); write_sfm(2,shi); write_nyr(9,ri); write_nyr(6,yue); write_nyr(3,nian); write_week(week); } 40 设计总结 经过几天不懈的努力终于完成了设计。通过这次单片机课程设计,使我在理论课程的基础上对单片机有了更进一步的了解。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节。有了老师在实验室给我们的讲解和平时每次的作业练习使我有了一定的基础来完成本次设计。刚开始时我在整体思路模糊的情况下,不知道从什么地方入手。通过在网上查找资源有了初步的构想。随着知识的积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,就开始了我的设计。 41 设计单元电路阶段,这个阶段可以说是考察数电书本知识的阶段。所有的设计方法还有步骤在数字电路书上都有,而且还有例题。这个阶段遇到的主要问题就是以前的知识忘记不少,所以做设计的时候要常随手翻阅课本,等于是做了几道数字电路作业题。这个阶段的难度虽然不是很大,但是要有耐心,要心细。仿真阶段可以说是这次设计中最重要的部分,因为以前的只是理论而不是真正的实体。所以说它是最重要的。在设计中出现了不少问题通过和同学交流和借助于资料书的帮助很快就解决了问题。本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,学习到了不少的专业知识。各个模块可以在软件或者硬件上实现。在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。 两周时间的课程设计结束了,在两周的努力学习和老师的精心指导下,我顺利地完成了课程设计任务。在课设的进行中,在自己一步一步的实践和仿真中,这让我学会了很多,学到了许多书本上没有的东西,同时也帮助自己温习了数字电路和电子软件的知识。在此期间,我知道了“三人行,必有我师”的道理。在设计制作过程中遇到困难时,可以向同学和老师求救经过和同学和老师的探讨可以解决不少的问题。 42 参考文献: [1] 李朝青.单片机原理及接口技术[M],北京:北京航天航空大学 出版社,2005 [2] 李广弟.单片机基础[M],北京:北京航空航天大学出版社,2000 [3] 万光毅.单片机实验与实践教程[M],北京:北京航空航天大学 出版社,2003 [4] 唐亚平、李移伦.单片机原理实训与学习指导[M],长沙:中南 大学出版社,2006 [5] 刘军.单片机原理与接口技术[M],华东理工大学出版社,2006 [6] 谢自美.电子线路设计、实验、测试[M],武汉:华中理工大学 出版社,2000 43 44
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务