单片机课程设计-单片机系统最小系统设计及应用(22页).docx
-单片机课程设计-单片机系统最小系统设计及应用-第 20 页 单片机原理及应用 课程设计(论文)设计(论文)题目 单片机系统最小系统设计及应用 学院名称 ZZZZZZ学院 专业名称 电气工程及其自动化 学生姓名 ZZZ 学生学号 ZZZZZ 任课教师 ZZZZZZZ 设计(论文)成绩 教务处 制2016年 7 月 1 日单片机系统最小系统设计及应用摘要单片微型计算机也称为单片计算机,不但集CPU,RAM,ROM,而且定时,计数和多种接口于一体的微型控制器。单片机成低,功能强,非常好的应用于智能产品和工业自动化生产之中。51单片机是单片机的典型代表之一,本课程设计是利用单片机的知识,通过软件与硬件的结合来实现对51单片机最小系统的设计与研究,从而达到设计,开发软件与硬件的能力。关键词:51单片机;数码管;矩阵键盘;DS18B20。设计目的单片机原理及应用课程设计是在教学及实验基础上,对课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的小型单片机系统,并在实践的基本技能方面进行一次系统的训练。 能够较全面地巩固和应用“单片机”课程中所学的基本理论和基本方法,并初步掌握小型单片机系统设计的基本方法。 培养独立思考、独立收集资料、独立设计规定功能的单片机系统的能力;培养分析、总结及撰写技术报告的能力。本次课程设计运用到51单片机的基本知识,焊接技术,数码管的使用,矩阵键盘的理解与运用,温度传感器DS18B20的运用以及Keil软件和stc-isp-15xx-v6.85H下载器的使用。有利于我们加深和巩固所学知识。前期准备,焊接开发板一、清点器材,准备焊接所需的器材有:16个键盘,4个数码管,STC-89C52单片机,9个led灯,电容电阻若干,排针跳冒若干,蜂鸣器,DS18B20,74HC273,74HC244,基座若干,开发板一个,接口若干等一系列原材料。二、焊接注意事项1、选用合适的焊锡,应选用焊接电子元件用的低熔点焊锡丝。 2、助焊剂,用25%的松香溶解在75%的酒精(重量比)中作为助焊剂。 3、电烙铁使用前要上锡,具体方法是:将电烙铁烧热,待刚刚能熔化焊锡时,涂上助焊剂,再用焊锡均匀地涂在烙铁头上,使烙铁头均匀的吃上一层锡。4、焊接方法,把焊盘和元件的引脚用细砂纸打磨干净,涂上助焊剂。用烙铁头沾取适量焊锡,接触焊点,待焊点上的焊锡全部熔化并浸没元件引线头后,电烙铁头沿着元器件的引脚轻轻往上一提离开焊点。5、焊接时间不宜过长,否则容易烫坏元件,必要时可用镊子夹住管脚帮助散热。6、焊点应呈正弦波峰形状,表面应光亮圆滑,无锡刺,锡量适中。 7、焊接完成后,要用酒精把线路板上残余的助焊剂清洗干净,以防炭化后的助焊剂影响电路正常工作。 8、集成电路应最后焊接,电烙铁要可靠接地,或断电后利用余热焊接。或者使用集成电路专用插座,焊好插座后再把集成电路插上去。 9、电烙铁应放在烙铁架上。10、先焊接小原件,后焊接大原件。三、整体图开发板主要部件介绍一、单片机1、单片机特性·8位CPU·4kbytes 程序存储器(ROM)·128bytes的数据存储器(RAM)·32条I/O口线·111条指令,大部分为单字节指令·21个专用寄存器·2个可编程定时/计数器·5个中断源,2个优先级·一个全双工串行通信口·外部数据存储器寻址空间为64kB·外部程序存储器寻址空间为64kB·逻辑操作位寻址功能·双列直插40PinDIP封装·单一+5V电源供电2、单片机CPU部分接线图:二、数码管1、数码管特点及应用数码管是一类价格便宜 使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。2、数码管部分接线图三、矩阵键盘在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵键盘接线图:设计方案一、矩阵键盘扫描程序1、键盘译码地址:MCS-51单片机键盘部分,外接1片74LS273芯片作为扫描的输出接口,地址为:0C000H,输入接口在74HC244对应的引脚上, 地址为:0C000H。2、键盘扫描原理:当给74LS273芯片赋值为0x07时,为检测键盘第一列,若为K5按下,则74HC244的1A2口的值为0,1A1,1A3,1A4口值为1。故推出接受到的值为0x0d;反之,若74HC244接受的值为0x0d,则是K5键被按下。当给74LS273芯片赋值为0x0b时,为检测键盘第二列,此时由74HC244接受的值来判断是第二列第几行。当给74LS273芯片赋值为0x0d时,为检测键盘第三列,此时由74HC244接受的值来判断是第三列第几行。当给74LS273芯片赋值为0x0e时,为检测键盘第四列,此时由74HC244接受的值来判断是第四列第几行。二、数码管显示程序1、LED译码地址:2、LED显示原理LED可分为共阳极或共阴极,各段码位和显示段码的对应关系如下图所示:adp依次对应D0D7。共阳极或共阴极的十六进制数及空白字符与P的显示段码如下图所示,分别对地址:8000H,9000H,A000H,B000H赋值可让LED显示出字符。三、温度传感器DS18B20DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。DS18B20在开发板上的接线图:初始化(1) 先将数据线置高电平“1”。(2) 延时(该时间要求的不是很严格,但是尽可能的短一点)(3) 数据线拉到低电平“0”。(4) 延时750微秒(该时间的时间范围可以从480到960微秒)。(5) 数据线拉到高电平“1”。(6) 延时等待(如果初始化成功则在15到60微秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。(7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。(8) 将数据线再次拉高到高电平“1”后结束。写操作(1) 数据线先置低电平“0”。(2) 延时确定的时间为15微秒。(3) 按从低位到高位的顺序发送字节(一次只发送一位)。(4) 延时时间为45微秒。(5) 将数据线拉到高电平。(6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。(7) 最后将数据线拉高。读操作(1)将数据线拉高“1”。(2)延时2微秒。(3)将数据线拉低“0”。(4)延时3微秒。(5)将数据线拉高“1”。(6)延时5微秒。(7)读数据线的状态得到1个状态位,并进行数据处理。(8)延时60微秒。综合程序设计开机显示HELL,等待按键操作。按A键显示P001,再按一个键,若为数字键,这数字左移,若为字母键,则返回HELL。 按B键显示P232,再次按键显示-,再按一个键,若为数字键,这数字左移,若为字母键,则返回HELL。按C键显示232C,再按一个键,返回HELL。按1键显示秒表计时,发光二极管同时闪烁,可记录09999的任意时间,按F键停止计时。按2键数码管轮流显示1F,按F键停止。按3键为流水灯,按F键停止。按4键为显示室温,按F键停止。按5键蜂鸣器发音,按F键停止。综合程序如下:#include <reg51.h>#include<absacc.h>#include<intrins.h>#define uchar unsigned charunsigned char code DIG_CODE19=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xc7,0x8c,;code unsigned char seg7code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff; code unsigned char seg7codeB=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff; sbit DQ=P20; sbit Beep = P21 ;unsigned char tempL=0; unsigned char tempH=0; unsigned int sdata;unsigned char xiaoshu1;unsigned char xiaoshu2;unsigned char xiaoshu;bit fg=1; void KeyDown(void);void Delay10ms(unsigned int c); unsigned char KeyValue;int d,e,f=1,g=-1,j,h,i,k=1,n,m;unsigned char l=0; unsigned char code music_tab = 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 void int0() interrupt 1 TH0=0xd8; TL0=0xef; l-; void delay2 (unsigned char r) unsigned o=3*r; while(-o); void delayms2(unsigned char s) while(-s); void delay(unsigned char i)for(i;i>0;i-);void delay1(uchar i)uchar j,k; for(j=i;j>0;j-)for(k=125;k>0;k-);void Init_DS18B20(void) unsigned char x=0;DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(5); x=DQ; delay(20); ReadOneChar(void) unsigned char i=0; unsigned char dat=0; for (i=8;i>0;i-) DQ=1; delay(1); DQ=0;dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4);return(dat);void WriteOneChar(unsigned char dat) unsigned char i=0; for(i=8;i>0;i-) DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1;delay(4);void ReadTemperature(void) Init_DS18B20(); WriteOneChar(0xcc); WriteOneChar(0x44); delay(125); Init_DS18B20(); WriteOneChar(0xcc); WriteOneChar(0xbe); tempL=ReadOneChar(); tempH=ReadOneChar(); if(tempH>0x7f) tempL=tempL;tempH=tempH+1; fg=0; sdata = tempL/16+tempH*16; xiaoshu1 = (tempL&0x0f)*10/16; xiaoshu2 = (tempL&0x0f)*100/16%10;xiaoshu=xiaoshu1*10+xiaoshu2; void Led(unsigned int date)if(fg=1)XBYTE0xb000=seg7codedate/10; delay1(5);XBYTE0xA000=seg7codeBdate%10;delay1(5);XBYTE0x9000=seg7codexiaoshu1;delay1(5);XBYTE0x8000=seg7codexiaoshu2;delay1(5);if(fg=0) XBYTE0xb000=seg7code11; delay1(5);XBYTE0xA000=seg7codedate/10;delay1(5);XBYTE0x9000=seg7codeBdate%10;delay1(5);XBYTE0x8000=seg7codexiaoshu1;delay1(5);main()/主函数XBYTE0xB000=DIG_CODE16;XBYTE0xa000=DIG_CODE14;XBYTE0x9000=DIG_CODE17;XBYTE0x8000=DIG_CODE17;while(1)KeyDown();if(KeyValue=10) int w=0,x=0,y=0,z=0; XBYTE0xB000=DIG_CODE18;XBYTE0xa000=DIG_CODE0;XBYTE0x9000=DIG_CODE0;XBYTE0x8000=DIG_CODE1;Delay10ms(5); while(f>0) KeyDown(); if(KeyValue>=11) f=-1;if(KeyValue<=9)w=x;x=y;y=z; z=KeyValue;XBYTE0xB000=DIG_CODEw;XBYTE0xa000=DIG_CODEx;XBYTE0x9000=DIG_CODEy;XBYTE0x8000=DIG_CODEz;KeyValue=10;f+; Delay10ms(20); KeyDown();if(KeyValue>9)XBYTE0xB000=DIG_CODE16;XBYTE0xa000=DIG_CODE14;XBYTE0x9000=DIG_CODE17;XBYTE0x8000=DIG_CODE17;if(KeyValue=11) int w=0,x=0,y=0,z=0; XBYTE0xB000=DIG_CODE18;XBYTE0xa000=DIG_CODE2;XBYTE0x9000=DIG_CODE3;XBYTE0x8000=DIG_CODE2; Delay10ms(100); XBYTE0xB000=0xbf;XBYTE0xa000=0xbf;XBYTE0x9000=0xbf;XBYTE0x8000=0xbf;KeyValue=10;while(g<0)KeyDown();if(KeyValue>=11)g=6;if(KeyValue<=9) w=x;x=y;y=z; z=KeyValue; XBYTE0xB000=DIG_CODEw; XBYTE0xa000=DIG_CODEx; XBYTE0x9000=DIG_CODEy; XBYTE0x8000=DIG_CODEz; KeyValue=10; g-; Delay10ms(20); KeyDown(); if(KeyValue>9)XBYTE0xB000=DIG_CODE16; XBYTE0xa000=DIG_CODE14; XBYTE0x9000=DIG_CODE17; XBYTE0x8000=DIG_CODE17;if(KeyValue=12) XBYTE0xB000=DIG_CODE2;XBYTE0xa000=DIG_CODE3;XBYTE0x9000=DIG_CODE2;XBYTE0x8000=DIG_CODE12;if(KeyValue=1) for(j=0;j<=9999;j+) XBYTE0xB000=DIG_CODEj/1000%10; XBYTE0xa000=DIG_CODEj/100%10; XBYTE0x9000=DIG_CODEj/10%10; XBYTE0x8000=DIG_CODEj%10; Delay10ms(92); KeyDown(); if(j%2=1) P1=0x00;if(j%2=0) P1=0xff; if(KeyValue=15) j=10000;if(KeyValue=2) for(e=0;e<=15;e+) XBYTE0xB000=DIG_CODEe; XBYTE0xa000=DIG_CODEe; XBYTE0x9000=DIG_CODEe; XBYTE0x8000=DIG_CODEe; Delay10ms(50); if(e=15) e=-1; KeyDown(); if(KeyValue=15) e=10000;/break;if(KeyValue=3) P1=0xfe; for(h=0;h<7;h+) P1=_crol_(P1,1); Delay10ms(15); KeyDown();if(KeyValue=15) h=8;P1=0xff; for(h=0;h<7;h+) P1=_cror_(P1,1); Delay10ms(15); KeyDown(); if(KeyValue=15) h=8; P1=0xff;if(KeyValue=4) while(k>0) ReadTemperature(); Led(sdata); KeyDown(); if(KeyValue=15) XBYTE0xB000=DIG_CODE15; XBYTE0xa000=DIG_CODE15; XBYTE0x9000=DIG_CODE15; XBYTE0x8000=DIG_CODE15;k=-1;if(KeyValue=5) unsigned char p,r; unsigned char o=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) a: p=music_tabo; if(p=0x00) o=0, delayms2(1000); goto play; else if(p=0xff) o=i+o;delayms2(100),TR0=0; goto a; else r=music_tabo+, l=music_tabo+; TR0=1; while(l!=0) Beep=Beep,delay2(r); TR0=0; KeyDown(); if(KeyValue=15) Beep = P21 ; void KeyDown(void)XBYTE0xC000=0X07;m=XBYTE0xC000;m=m&0x0f; if(m!=0x0f)if(m=0X0e)KeyValue=1;if(m=0X0d)KeyValue=5;if(m=0X0b) KeyValue=9;if(m=0X07)KeyValue=12;XBYTE0xC000=0X0b;m=XBYTE0xC000;m=m&0x0f; if(m!=0x0f) if(m=0X0e)KeyValue=2;if(m=0X0d)KeyValue=6;if(m=0X0b) KeyValue=0;if(m=0X07)KeyValue=13;XBYTE0xC000=0X0d;m=XBYTE0xC000;m=m&0x0f; if(m!=0x0f) if(m=0X0e)KeyValue=3;if(m=0X0d)KeyValue=7;if(m=0X0b) KeyValue=10;if(m=0X07)KeyValue=14;XBYTE0xC000=0X0e;m=XBYTE0xC000;m=m&0x0f; if(m!=0x0f)if(m=0X0e)KeyValue=4;if(m=0X0d)KeyValue=8;if(m=0X0b) KeyValue=11;if(m=0X07)KeyValue=15;while(n<50)&&(XBYTE0xC000!=0xf0)Delay10ms(1);n+;void Delay10ms(unsigned int c) unsigned char a,b; for(;c>0;c-) for(b=38;b>0;b-) for(a=130;a>0;a-);设计内容展示开机显示HELL,等待按键操作。按A键显示P001,依次按276键,如图:按B键显示P232,再次按键显示-,依次按678,如图: 按C键显示232C,再按一个键,返回HELL。按1键显示秒表计时,发光二极管同时闪烁,此时已记录到120秒。 按3键为流水灯,按F键停止。按4键为显示室温,此时寝室室温26.12摄氏度。设计总结通过这次单片机设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己,同时也使我认识到自身存在的不足之处,无论是理论上还是遇到问题的处理能力上都还有待提高,而且这也激发了我今后努力学习的兴趣。发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中学生学习心得通过这次单片机设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己,这也激发了我今后努力学习的兴趣。发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中通过这次设计,我发现了自己的不足之处,比如动手能力还需加强,我将不断发展壮大自己,争取在以后的学习生活中有更好的表现。非常感谢各位老师在本次实验中的精心指导!学生(签名): 年 月 日诚信承诺本人郑重声明所呈交的课程报告是本人在指导教师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注的地方外,论文中不包含其他人已经发表或撰写过的研究成果。与我一同工作的同学对本文研究所做的贡献均已在报告中作了明确的说明并表示谢意。学生(签名):任课教师评语成绩评定:任课教师(签名): 年 月 日