1、目录1、单片机小实验板设计目的2、单片机小实验板设计要求3、单片机小实验板设计需求分析4、 AT89C51 单片机概述5、单片机小实验板设计原理5.1 电源模块5.2 单片机最小电路5.3 发光二极管(LED)模块5.4 发光数码管静态显示模块5.5 发光数码管动态显示模块5.6 16 位矩阵键盘模块5.7 音频放大模块5.8 DS18B20 数字温度 计模块6、实验数据及源代码6.1 流水灯、交通灯控制等6.2 数码管静态显示程序如秒表、计数器等6.3 键盘显示程序6.4 数码管动态显示程序如数字钟等6.5 音频程序6.6 数字温度计17、程序仿真与硬件调试中出现的问题及其解决方法8、 总结
2、绪论通过本次课程设计进一步熟悉和掌握单片机的结构及工作原理,巩固和加深“单片机原理与应用”课程的基本知识,掌握电子设计知识在实际中的简单应用。综合运用“单片机原理与应用”课程和先修课程的理论及生产实际知识去分析和解决电子设计问题,进行电子设计的训练。学习电子设计的一般方法,掌握 AT89C51 芯片以及简单电子设计过程和运行方式,培养正确的设计思想和分析问题、解决问题的能力,特别是总体设计能力。单片机小实验板设计目的1、 掌握 C51 单片机的各个引脚功能。2、 进一步熟悉 KEIIL C51 集成环境的使用方法。3、 熟悉数码管和 DS18B20 的原理及其使用方法。4、 熟练掌握电路焊接,
3、并能 够检查存在的问题。5、 熟练程序的基本设计及其调试。设计方案、 单片机小实验板设计目的1.掌握单片机最小系统的设计。2.掌握+5v 稳压电源电路的设计。3 发光二极管(LED )模块的设计,如 各种流水灯,跑 马 灯,十字路口交通灯等。4. 两位发光数码管静态显示的设计。5. 六段发光数码管动态显示的设计。6. 44 矩阵键盘的设计。7. 电子密码锁的设计。8. 音频放大模块的设计。29. DS18B20 数字温度计模块的设计。、 单片机小实验板设计要求1、 电路板设计要注意元器件的封装和各个元器件之间的距离,布线尽量减少交错,增加 电路板的稳定性。2、 焊接不能出现虚焊,或者短路,同时
4、注意防止高温烧坏部分元件和电路板。3、程序设计要减少每必要的枝节,尽力提高程序的 稳定性,实用性。、 单片机小实验板设计需求分析 该设计方案是以 MC51 单片机为核心,采用 LED 显示系统 ,辅以闹钟模块,音频及其电子琴、温度采集模块、日期、 键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示, 对温度调节模 块进行了重点设计用 DS18B20, 实现 SB0、SB1、SB2、SB3 四个键实现时钟正常显示,调时,及闹钟时间设置。本系统设计大部分功能有软件来实现,使电路简单明了,系 统稳定性也得大大提高。、 AT89C51 单片机概述89S51 各引脚
5、功能介 绍:VCC:89S51 电源正端输入,接 +5V。VSS:电源地端。XTAL1:单芯片系统时钟的反相放大器输入端。XTAL2:系统时钟的反相放大器输出端,一般在 设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系 统 更稳定,避免噪声干 扰而死机。RESET:89S51 的重置引脚,高电平动作,当要 对晶片重置时,只要对此引脚电平提升至高 电平并保持两个机器周期以上的时间,AT89S51 便能完成系 统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态 ,并且至地址 0000H 处开始
6、读入程序代码而执行程序。EA/Vpp:“EA“为英文“External Access“的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统 会取用外部的程序代码(存于外部 EPROM 中)来执行程序。因此在 8031 及 8032 中,EA 引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高 电平。此外,在将程序代码烧录至 8751 内部EPROM 时,可以利用此引脚来输入 21V 的烧录高压(Vpp)。ALE/PROG:AT89S51 3端口 3 的管脚设置:P3.0:RXD,串行通信 输入。P3.1:TXD,串行通信
7、输出。P3.2:INT0,外部中断 0 输入。P3.3:INT1,外部中断 1 输入。P3.4:T0,计时计 数器 0 输入。P3.5:T1,计时计 数器 1 输入。P3.6:WR:外部数据存储器的写入信号。P3.7:RD,外部数据存储器的读取信号。、 单片机小实验板设计原理整个电子时钟系统电路可分为 6 大部分:中央处理单元(CPU)、复位电路部分、 显示部分、键盘输入部分、温度采集部分。按模块可分为 8 部分:电源模块、单片机最小电路、 发光二极管(LED)模 块、发光数码 管静态显示模块、发光数码管 动态显示模块、 16 位矩阵键盘模块、音频放大模块、DS18B20 数字温度计模块。1)
8、 电源模块电源部分运用了 MC7805 三端稳压器,可将 电压稳压在 5V,Vcc 接单片机 40 脚,20脚为接地。2) 单片机最小电路1、复位电路MCS-51 单 片机的复位是由外部的复位电路来实现的。复位引脚 RST 通过一个斯密特触发器与复位电路相连,斯密特触 发器用来抑制噪声,在每个机器周期的 S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。上电复位:上电复位电路是种简单的复位电路,只要在 RST 复位引脚接一个电容到VCC,接一个电 阻到地就可以了。上 电复位是指在给系统 上电时,复位电路通过电容加到RST 复位引脚一个短暂的高电平信号,
9、这个复位信号随着 VCC 对电容的充电过程而回落,所以 RST 引脚复位的高电平维持时间取决于电容的充电时间 。为了保证系统安全可靠的复位,RST 引脚的高 电平信号必 须维持足够长的时间。电路图如下:4上电自动复位是通过外部复位电路的电容充电来实现的。只要 Vcc 的上升时间不超过1ms,就可以 实现 自动上电复位。3、时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以 时钟频 率为基准,有条不紊的一拍一拍地工作。因此,时钟频 率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电 路有两种方式:一种是内部 时钟方式,另一种 为外部时钟方式。本文用的是内部时钟
10、方式。电路图如下:MCS-51 单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚 XTAL1,输出端为引脚 XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振 荡器。3) 发光二极管(LED )模 块采用低电平有效,共阳接发,为防止二极管击穿,在每个二极管中串接了 1K 的限流电阻。4) 发光数码管静态显示模块5采用共阳极八段数码管, 因此单片机 I/O 口为低电 平有效,分各位与十位两个, 为防止数码管由于电流高二损坏,在数 码管每段串接电阻。5) 发光数码管动态显示模块共阳极数码管 6 个,在片 选端各有三极管放大驱动,74LS
11、244 为锁存器,数据口占用 8个 I/O 口。片选占用 6 个 I/O 口。6) 16 位矩阵键盘模块按键的开关状态通过一定的电路转换为高、低 电平状态。按键闭合过程在相应的 I/O 端口形成一个负脉冲。闭合和释 放过程都要经过一定的过程才能达到 稳定, 这一过程是处于高、低电平之间的一种不稳定状态,称 为抖动。抖 动持续时间的常 长短与开关的机械特性有关,一般在 5-10ms 之间。为了避免 CPU 多次处理按键的一次 闭合, 应采用措施消除抖动。本文采用的是独立式按键,直接用 I/O 口线构成单个按键电路,每个按键占用一条 I/O 口线,每个按键的工作状态不会产生互相影响。7) 音频放大
12、模块6采用 LM386 放大,最大 输出功率 1W,失真度低,适合小实验板的音频放大。8) DS18B20 数字温度 计模块数字温度传感器采用 DS18B20,只需一根信号 线与单片机连接,不需要其他外部元件,电压范围为 3.3V5V,测温范 围为一 55+125,在-10+85 范围内,精度为O.5,温度最高分辨率可达 0.0625。、 实验数据及源代码1) 流水灯、交通灯控制等#include /*流水灯左移- 使用顺序程序实现*/void delay(unsigned int count) /延时程序unsigned int i,j,k;for(i=0;i/*/ 数码管-静态工作方式 实
13、现/*/void delay(unsigned int count)/延时程序unsigned int i,j,k;for(i=0;i9)y=0;x+;if(x9)x=0;3) 键盘显示程序/*/ 按键计数程序 /*/#include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, /09 数组0x6d,0x7d,0x07,0x7f,0x6f; unsigned char Count; void delay10ms(void) /延时 unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-);
14、void main(void) Count=0; 10P1=tableCount/10; /个位取整P2=tableCount%10; /十位取余while(1) /循环和消抖 if(P3_7=0) delay10ms(); if(P3_7=0) Count+; if(Count=100) /满百位后复位 Count=0; P1=tableCount%10; P2=tableCount/10; while(P3_7=0); 4) 数码管动态显示程序如数字钟等/*/ 数字钟计时 /*/#include unsigned char code dispcode=0x3f,0x06,0x5b,0x4f
15、,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,110x39,0x5e,0x79,0x71,0x00; /数码管显示段数据unsigned char dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/数码 管位驱动,第一次 驱动接在最低位的那一个数 码管unsigned char dispbuf8=0,0,16,0,0,16,0,0;/显示缓冲寄存器unsigned char dispbitcnt;unsigned char second; unsigned char minite;unsigned ch
16、ar hour;unsigned int tcnt;unsigned char mstcnt;unsigned char i,j;void main(void)TMOD=0x02;/设置定时器工作方式 为 2,8 位定时 状态,自动装入初值。TH0=0x06;/装入初值TL0=0x06;TR0=1;/起动 定时器ET0=1;/开启定时器中断EA=1;/开总中断while(1)/主循环if(P0_0=0)/如果 P0.0 位等于 0,往下走for(i=5;i0;i-)for(j=248;j0;j-);/延时防抖 动if(P0_0=0)/再次判断 P0.0 是否等于 0,如果是,则设置秒secon
17、d+;/秒加 112if(second=60)/如果秒等于 60,又重 0 开始,以便开始走时second=0;dispbuf0=second%10;/刷新秒个位,并装 驱动显示缓冲寄存器dispbuf1=second/10;/刷新秒十位,同上。while(P0_0=0);/等待 P0.0 放开。(等待按 键放开)if(P0_1=0)/如果 P0.1 位等于 0,往下走for(i=5;i0;i-)for(j=248;j0;j-);/延时防抖 动if(P0_1=0)/再次判断 P0.1 是否等于 0,如果是,则设置分钟值minite+;/分 钟加 1if(minite=60)/minite=0;
18、dispbuf3=minite%10;/刷新分钟个位,并装驱动显示缓冲寄存器dispbuf4=minite/10;/刷新分钟十位,同上while(P0_1=0);/等待 P0.1 放开。(等待按 键放开)if(P0_2=0)/大概意思同上,只是这里是用来设置小时值的for(i=5;i0;i-)for(j=248;j0;j-);if(P0_2=0)hour+;if(hour=24)13hour=0;dispbuf6=hour%10;dispbuf7=hour/10;while(P0_2=0);void t0(void) interrupt 1 using 0/定时器中断子程序mstcnt+;/用
19、于刷新所显示的数据,第中断 8 次显示 1 位数码管(动态显示)if(mstcnt=8)/判断中断 8 次没,如果是,则显示数据mstcnt=0;P1=dispcodedispbufdispbitcnt;/段位码送 P1 口,驱动数码管显示P3=dispbitcodedispbitcnt;/选中数码管显示位dispbitcnt+;/显示索引,用于 调哪一位数据if(dispbitcnt=8)/判断调完没,如果调完了,则又从第一位开始。dispbitcnt=0;tcnt+;/第中断一次自动加 1,如果中断 4000 次,则秒自动加 1if(tcnt=4000)tcnt=0;second+;/秒加
20、 1if(second=60)/如果秒等于 60,则分钟自动加 1,并且秒回 0second=0;minite+;/分 钟加 114if(minite=60)/如果分钟等于 0,则小时值自动加 1,并且分钟回 0minite=0;hour+;/小时值 加 1if(hour=24)/如果小时值等于 24,则回 0hour=0;dispbuf0=second%10;/刷新显示缓冲寄存器dispbuf1=second/10;dispbuf3=minite%10;dispbuf4=minite/10;dispbuf6=hour%10;dispbuf7=hour/10;5) 音频程序#include /
21、*/ 歌曲播放 /*/unsigned char Count;sbit _Speak =P23 ; /讯响器控制脚 unsigned char code SONG = /祝你平安0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20。;15void Time0_Init()TMOD = 0x01;IE = 0x82;TH0 = 0xD8;TL0 = 0xEF; /12MZ 晶振,10msvoid Time0_Int() interrupt 1TH0 = 0xD8;TL0 = 0xEF;Count+; /长度加 1/*-功能:1MS 延时子程
22、序-*/void Delay_xMs(unsigned int x)unsigned int i,j;for( i =0;i 0;i-)DQ = 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);return(dat);/*ds18b20 写一个字节*/ void WriteOneChar(uchar dat)unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = datdelay_18B20(5);DQ = 1;dat=1;/*读取 ds18b20 当前温度*/void ReadT
23、emp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();19WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / 延时Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b
24、=ReadOneChar(); /读取温度值高位temp_value=b4; void temp_to_str() /温度数据 转换成液晶字符显 示TempBuffer0=temp_value/10+0; /十位TempBuffer1=temp_value%10+0; /个位TempBuffer2=0xdf; /温度符号TempBuffer3=C;TempBuffer4=0;void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j120;j+);、 程序仿真与硬件调试中出现的问题及其解决方法1、动
25、态显示中数码管显示乱码 。排查原因:a,数 码管排线顺序是否接反;20b,数码管的管脚是否有虚 焊;c,数 码管是否损坏;d,程序是否正确。2、动态显示中几个数码管显示同一数字。排查原因:a,数 码管的片选电路中是否有短路;b,程序延时是否过长 ;c,锁存器是否正常工作。3、按键无反应或部分按键无反 应。排查原因:a,键盘 程序和键盘锁连接 I/O 口是否一致;b,排线是否有断路;c,程序是否有 错误;d,按键有无虚焊。4、音频调试无声音或者声音太小不正常。a,连接线有无虚焊或短路、断路;b,程序中音符数组 是否有错误;c,程序中定 义的数据口和扬声器所接口是否一致;d,音频放大器是否足以 驱
26、动扬声器。、 总结此次实训大大提高了我的单片机相关知识的综合运用。 单 片机作为我主要专业, 虽然一直以来比较感兴趣,但还是感 觉在某些方面比较难,主要是程序,感觉自己学不动,总是懵懵懂懂。通过这次实训后发现 自己对这门课有了更深的 认识和了解,而且 兴趣比以前更浓烈。就课程设计而言,也是一件很有意义的事情,总结我们在大学里学到的单片机相关知识,以及知识的综合运用。且此次 实训为我们在大学所学知识 提供了一次很好的展示和实践机会。通过实训,我认识到,要做好一次实训项目就必须做到:在 实训之前,对于所用单片机的内部结构要有一定的了解,要知道 单片机内部有哪些资 源;在心里要有一个清晰的思路和一个完整的软件流程图;在设计时不要妄想一口气就将整个程序设计的很完美,应该认真仔细,反复的修改,不不断改进 是设计程序的必经之路,要养成写程序注释的好习惯,这样才能让人读懂自己的程序,这样 也为以后的学习交流提供了方便。从此次单片机实训,从理论到 实践,我 们不仅巩固了以前所学的知 识,而且还学到了在以前理论课堂上没有学到的知识,更加 让我认识到理论与 实践结合的重要性,也在 实训中发现了自己在单片机方面的不足,比如在 动态数码管计时程序的中断部分就有很大的 问题;总之,通过这次实训,使我对单片机及其周边科目有了新认识 ,对我以后的单片机学习有相当大的帮助,以后我会更加的努力。