51单片机开发板使用手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STU_MAIN单片机开发板使用手册
第一章STU_MAIN 单片机开发板简介 (2)
1.1 单片机开发板概述 (2)
1.2 单片机开发板载资源介绍 (2)
1.3 STU_MAIN 单片机开发板接口说明 (4)
1.4 如何开始学习单片机 (5)
第二章软件使用方法 ......................... . (6)
2.1 KEIL 软件的使用方法 (6)
2.2 STC-ISP 软件的安装与使用 (13)
2.3 使用USB 口下载程序时设置步骤 (18)
第三章STU_MAIN 开发板例程详细介绍 (21)
3.1 准备工作 (21)
3.2 安装STC-ISP下载程序 (21)
3.3 闪烁灯 (22)
3.4 流水灯 (23)
3.5 单键识别 (25)
3.6 利用定时器和蜂鸣器唱歌 (28)
3.7 DS18B20 温度测量显示实验 (31)
3.8 LCD1602 字符液晶显示 (36)
3.9 串口通讯实验 (39)
3.10 基于DS1302的多功能数字钟实验 (41)
3.11 EEPROM X5045 实验 (47)
第一章STU_MAIN 单片机开发板简介
1.1 单片机开发板概述
STU_MAIN 单片机开发板是经过精心设计开发出的多功能MCS-51 单片
机开发平台。
该开发板集常用的单片机外围资源、串口调试下载接口于一身,可以让您在最短的时间内,全面的掌握单片机编程技术。
该开发板特别适合单片机初学者、电子及通信等专业的课程设计以及电子爱好者自学使用。
STU_MAIN 单片机开发板可作为单片机课程的配套设备,课程从最基本的预备知识开始讲起,非常详细的讲解KEIL 编译器的使用,包括软件仿真、测定时间、单步运行、全速运行、设置断点、调试、硬件仿真调试、变量观察等,整个过程全部用单片机的C 语言讲解,从C 语言的第一个主函数MAIN 讲起,一步步一条条讲解每一个语法、每条指令的意思,即使对单片机一巧不通,对C 语言一无所知,通过本课程的学习也可以让你轻松掌握MCS-51 单片机的C 语言编程。
全新的讲课风格,跳过复杂的单片机内部结构知识,首先从单片机的应用讲起,一步步深入到内部结构,让学生彻底掌握其实际应用方法,把MCS-51单片机的所有应用、每个部分都讲解的非常清晰明了,授课教师在教室前面用电脑一条一条写程序,旁边用STU_MAIN 单片机开发板逐个实验的演示,给学生解释每条指令的意思及原理,通过一学期的学习让学生完全掌握单片机的C 语言编程及单片机外围电路设计的思想。
以实践为主、学生现场写程序、直接下载到开发板观察现象。
1.2 单片机开发板载资源介绍
一. STU_MAIN单片机开发板(串口直接下载程序)
本开发板以STC 公司生产的STC90C54RD+ 单片机做核心控制芯片,它是一款性价比非常高的单片机,它完全兼容ATMEL 公司的51/52系列单片机,除此之外它自身还有很多特点,如:无法解密、低功耗、高速、高可靠、强抗静电、强抗干扰等。
其次STC 公司的单片机内部资源比起ATMEL 公司的单片机来要丰富的多,它内部有1280 字节的SRAM、8-64K 字节的内部程序存储器、2-8K 字节的ISP 引导码、除P0-P3 口外还多P4 口(PLCC封装)、片内自带8路8位AD(AD 系列)、片内自带EEPROM、片内自带看门狗、双数据指针等。
目前STC 公司的单片机在国内市场上的占有率与日俱增,有关STC 单片机更详细资料请查阅相关网站。
STU_MAIN单片机开发板可完全作为各种MCS-51单片机的开发板,用汇编语言或C 语言对其进行编程。
当用STC 公司的单片机时,直接用后面介绍的串口线将开发板与计算机串口相连,按照STC 单片机下载操作教程便可下载程序,
而且下载速度比起其它下载工具要快的多。
二.STU_MAIN 开发板基本配置
1、STC90C54RD+ 单片机,支持串口下载程序方式,也就是你不用买单片机烧
写器也能够随时烧写程序到你的片子里查看您编写的程序状况。
2、字符液晶LCD1602 接口(可显示两行字符)。
3、2 个LED 发光二极管(做流水灯实验)。
4、MAX232 芯片作为RS232 通讯接口(可以作为与计算机通迅的接口同时也
可作为STC 单片机下载程序的接口)。
5、USB 供电系统,直接插接到电脑USB 口即可提供电源,也可外接直流电源。
6、蜂鸣器(做单片机发声实验)。
7、USB 转串口模块,直接由计算机USB 口下载程序至单片机。
8、DS18B20 温度传感器,(初步掌握单片机操作后即可亲自编写程序获知当
前环境温度)。
9、X5045 外部EEPROM 芯片(I2C 总线元件实验)。
10、图形液晶LCD12864 接口(可显示任意汉字及图形)。
11、2*3 键盘(键盘检测试验)。
12、单片机部分IO 口引出,方便自己进行自由扩展。
13、部分元件采用贴片封装,有效的节省了系统空间。
元器件的选择采用软件
选通,无跳线跳接,具有极强的系统综合性。
三.自带在线仿真功能
STU_MAIN 系列开发板可直接安装在线仿真芯片SST89E564/516RD,用户可不必再花钱买价格昂贵的仿真器,将仿真芯片安装在开发板上后便可直接进行在线单步、全速调试等。
仿真芯片的作用:仿真芯片可以实现计算机与开发板之间的真正在线调试,用KEIL 软件连接好仿真器后可以在软件调试模式下进行单步的执行指令、全速执行指令、设置断点等。
每执行一条指令都可看见开发板的运行状态,并且可随时查看各个变量的值,对初学者非常有帮助。
如果不使用仿真芯片而直接使用板上单片机调试程序只能全速执行指令,通过观察开发板现象来重新修改程序,然后再次下载。
STU_MAIN 系列学习板使用仿真功能时只需要把原来板上的单片机取下,安装仿真芯片即可实现仿真调试。
1.3 STU_MAIN单片机开发板接口说明
看此文档时请对照开发板原理图元件布局图及实物,解说顺序大致按从左到右,从上到下。
1. USB:整个系统提供电源及与单片机通迅,直接插在计算机的USB 口上即可。
2. J2为外接电源的输入端,经MC7805输出+5V电源。
3.JP4为外接电源选择跳线。
可选择MC7805或USB供电。
4. D5:为USB供电电源指示灯;D8:为MC7805 电源指示灯。
5. P1:与计算机串口接口。
6. J5:接口LCD1602液晶显示器,最左边为第一脚,与液晶插口直接想插就行。
7. J6:接口LCD128X64液晶显示器,最右边为第一脚,与液晶插口直接想插就行。
8. U1为STC90C54RD+单片机。
9. Y1:单片机使用的11.0592M 晶体。
10. R5 电位器:为128X64液晶对比度调节电位器。
11. SPEAKER:蜂鸣器。
12. SW2:复位按键。
13. U4 为DS18B20 温度传感器。
14. U5:DS1302实时时钟芯片。
15. J8为用户留的单片机的输出IO 口,J3、J4为电源输出(VCC 和GND)。
16.IR为红外接收。
17.J7为RS-485通信。
18.JP2、JP3为RS-232/RS-485通信口选择。
1-2短接为RS-485,2-3短接为RS-232。
19. KEY1-KEY6 为六个独立按键。
20.J9 为INT1引出端,可外接超声波传感器。
1.4 如何开始学习单片机
先说说单片机,我们现在用的比较多的是8051 单片机,它的资料比较多,用的人也较多,市场也很大,8051 单片机内部结构比较简单,非常适合初学者学习,建议初学者将MCS-51 单片机做为入门级芯片。
单片机属于硬件,硬件只有把它摆在你的面前,亲自操作它,才会有深刻的体会,才能学明白它。
单片机这门课是一科非常重视动手实践的科目,不能总是看书,但是也不能完全不看书,我们需要从书中大概了解一下单片机的各个功能寄存器,如果看的多了反而容易搞乱,尤其是现在市场上大多数讲单片机的书一开始就讲解较复杂的内存、地址、存储器什么的,更让初学者感到不知所云、难以入门。
简单的说,当我们使用单片机时,实际上就是用我们自己编写的软件去控制单片机的各个功能寄存器,再简单些,就是控制单片机哪些引脚的电平什么时候输出高,什么时候输出低。
由这些高低变化的电平来控制外围电路,实现我们需要的各个功能。
只要你有信心,做事能坚持到底,有不成功绝不放弃的强烈意志,学个单片机对你来说就是件非常容易的事。
建议步骤:
1、看书大概了解一下单片机结构,大概了解就行。
2、用学习板练习编写程序,学单片机主要就是练编程序,遇到不会的再问人或
查书。
3、自己网上找些小电路类的资料练习设计外围电路。
焊好后自己调试,熟悉过
程。
4、自己完全设计具有个人风格的电路、产品…你已经是高手了。
第二章软件使用方法
2.1 KEIL 软件的使用方法
2.1.1 安装,请用户仔细查看配套光盘里的安装说明。
2.1.2 安装成功后,首次启动界面如下图:
2.1.3 我们先新建一个工程文件,点击“Project->New Project…”.
选择工程文件要存放的路径,并且输入工程文件名,这里我们用test2 作为工程文件名,这里就不用在后面加.c 了。
图片如下:
2.1.4 点击Save 后弹出选择CPU 及型号的对话框:
2.1.5 由于本开发板所配的单片机是STC 公司的,而KEIL 中并没有STC 公司的产品,不过STC 公司的单片机和传统的8051 单片机是兼容的,所以这里我们就选择Atmel 公司的AT89C52。
2.1.6 新建一个C51 文件,单击左上角的New File 如下图所示:
2.1.7 保存新建的文件,单击保存按钮。
2.1.8 输入文件名test2.c,这里必须以**.c 为文件名。
2.1.9 保存好后我们还需要把文件加入到工程项目中,如下图所示在Source Group1 上单击右键,选择Add Files to ‘Group Source Group1’。
2.1.10 然后选择刚才建立的test2.c 文件,单击Add。
这时我们看左边工程信息窗口中的Source Group1 下面多了test2.c 文件,这说明添加文件成功了。
2.1.11 在编辑框内输入下列字符。
2.1.12 接着我们编译工程项目,如下图点击编译
如果在下面的信息窗口中显示0 Error(s),0 Warning(s).则说明没有错误,已经成功编译。
2.1.13 接下来我们生成.HEX 文件,如下图点击Option for Target。
2.1.14 在下图我们单击Output 选中Create HEX File,再单击OK。
2.1.15 再次点击编译按钮就会在文件目录下生成test2.hex 文件。
到此为止,您已经学会了如何使用WAVE 和KEIL 编译文件并生成能够往单片机中烧写的BIN 和HEX 文件了,下面我们讲解如何使用STC-ISP 给单片机下载程序。
2.2 STC-ISP 软件的安装与使用
2.2.1 安装光盘软件目录下stc_isp_
3.1 文件夹中的安装文件。
注意:有些用户无法正常安装此程序,这可能跟你的系统中原来安装的某些程序有冲突,你可以按照以下的方法来尝试解决安装,如果能正常安装的就可以不用看这一小节了。
1.安装过程如果出现类似如下图显示问题那么直接点击确定不用管。
2.接着如果出现如下显示画面时,直接点击忽略不用管。
3.接着出现如下画面。
2.2.2 安装完软件后,启动,首次设置时只需注意芯片的选择,在左上角下拉框中选择STC90C54RD+,一般的台式机通常只有一个串口,所以COM 栏就选择COM1,如果使用别的串口那就选择相应的串口号,其它全部使用默认,不明白时最好不要乱改,不然可能会把芯片锁死,以后就用不了了。
总体设置如下图:
注意:使用笔记本的用户如果笔记本没有串口,可直接使用开发板上的USB 接口下载程序,插上USB线后计算机会发现新硬件,光盘软件目录下有USB 转串口驱动程序,大家安装后查看设备管理器,看多了COM 几,然后下载程序时在软件COM 设置中选择相应的端口号即可。
2.2.3 软件安装设置完后,接下来我们讲如何连接硬件开发板。
首先要保证开发板上插的是STC90C54RD+ 单片机,左上方的USB 数据电缆线一定要与计算机相连,它一方面实现USB 通信,更重要的是给整块电路板提供电源。
当连好USB 线后,会看到开关右边有个电源指示灯会亮。
左下方的九孔串口线与计算机串口相连,(板上串口旁边有个指示灯是亮的,但这并不能说明你的计算机串口是好的或是串口线已经成功连接,这个指示灯的作用主要是下载
程序的时候闪烁,指示正在下载程序中,或是单片机与计算机进行双向串行通信的时候小灯会不停的闪烁,告诉用户通信正在进行。
(若为单向只发送数据或只接收数据,小灯不一定会亮,这里请用户注意)
2.2.4 连接好了硬件也设置好了软件,下面就要下载程序了。
如下图点击软件界面上的Open File 打开对话框,将需要下载的XXX.hex 文件选择,选择好后点击Open。
2.2.5 选择好后,要先把开发板上的电源关掉(因为STC 的单片机内有引导码,在上电的时候会与计算机自动通讯,检测是否要执行下载命令,所以要等点完下载命令后再给单片机上电),然后点击如下图的Download/下载钮。
接着按下开发板上电源给单片机上电。
若出现上述图片,则说明已经给单片机成功下载了程序,并且已经加密。
2.3 使用USB 口下载程序时设置步骤
一.运行光盘用户资料\软件\USB 下载接口驱动程序USB Driver Installer.exe 文件直接安装到默认路径里。
二.将实验板上两个USB 口分别用两根USB 线同时连接到计算机上,关掉实验板电源。
三.当实验板右上角USB 口与计算机连接后,计算机屏幕会出现发现新硬件,并提示安装驱动程序。
如下图:
如上图所示选择“自动安装软件(推荐)”,然后点击下一步
自动安装完后出现上图画面,点击完成。
四.打开电脑的设备管理器->端口
看到如上图所示,需要注意的是不同的电脑这里的COM 口号是不同的,在上图
中我们看到的是COM3,而其它电脑可能又是别的号,记下自己的电脑对应的上图圈内的COM 号,本台电脑为COM3。
五.打开STC-ISP 下载软件在下图圈内选择对应的COM 口号。
第三章STU_MAIN 开发板例程详细介绍
3.1 准备工作
当拿到开发板后的第一件事是先看开发板供电是否正常、下载程序功能是否正常、各芯片功能是否都能成功实现,检测方法如下所示:
将USB 线两端分别插接开发板左侧的USB 供电接口和电脑USB 口,打开开发板上电源,这时会看到开发板左侧开关旁边的电源指示灯会亮,紧接着会看到开发板上LCD1602有字符显示,这是因为我们已在单片机内部装有测试程序,以上状态说明开发板供电系统正常。
3.2 安装STC-ISP下载程序
1. 安装STC 单片机程序下载软件,下载光盘中写好的例程测试各功能是否正常,安装过程及下载方法见前面介绍,关于STC 单片机程序下载软件的STC-ISP 安装,请查看本相关网站说明。
2. 安装单片机编程软件KEIL,软件支持单片机的C 语言或是汇编语言编译,在STU_MAIN 配套的单片机教学光盘中全部使用的是KEIL 软件讲解,在教学的第1 讲中有详细的KEIL 软件建立工程及编译源代码的介绍,请大家自行查看本手册前面的说明。
3.3 闪烁灯
[实验要求]
点亮与单片机P3.0 口相连的发光二极管,延时约0.2S,然后熄灭,再延时约0.2S,再点亮,如此循环下去。
[实验目的]
初步了解单片机IO 口输出高低电平的方法,延时函数的时间估算。
关于延时函数的时间估算问题在视频第二讲有详细演示介绍。
[硬件电路]
[源代码]
#include<reg51.h>
/*************************************************************************************************** 上面这行是一个"文件包含"处理。
所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,这里的程序虽然只写了一行,但C 编译器在处理的时候却要处理几十或几百行,
这里包含reg51.h 的目的在于本程序要使用P3 这个符号,而P3 是在reg51.h 这个头文件中定义的。
大家可以在编译器目录
下面用记事本打开这个文件看看。
******************************************************************************/ sbit P3_0=P3^0; //定义IO 口这步的目的是让编译器知道P3_0 代表的就是单片机的P3.0 口void delay02s(void) //延时0.2 秒子程序
{
unsigned char i,j,k; //定义3 个无符号字符型变量。
for(i=20;i>0;i--) //三个FOR 循环用来延时,这里为
for(j=20;j>0;j--) //什么是0.2S 大家可以用WAVE 或KEIL
for(k=248;k>0;k--); //设置断点仿真,就可知道大概
} //是0.2S 了。
void main(void) //每一个C 语言程序有且只有一个主函数,
{
while(1) //循环条件永远为真,以下程序一直执行下去。
{
P3_0=0; // I/O 口P3.0 输出低电平,小灯被点亮。
delay02s(); //延时经过0.2 秒。
P3_0=1; // I/O 口P3.0 输出高电平,小灯熄灭。
delay02s(); //延时经过0.2 秒。
}
}
3.4 流水灯
[实验要求]
单片机P3 口相连的2个发光二极管中的一个循环移位点亮,同时蜂鸣器发出滴滴的响声。
蜂鸣器用一PNP 型三极管驱动,发射极(E 极)接+5V 电源,基极(B 极)经电阻接控制端P2.6,集电极(C极)接蜂鸣器线圈,蜂鸣器线圈另一端接地。
当控制端P2.6=0时,即B 极为低电平时,三极管E,B 极PN 结正偏时,PN 结导通,,三极管导通,蜂鸣器发声。
[实验目的]
掌握循环移位的工作原理和操作方法,学会使用C51 封装好的函数库C51LIB,延时函数的时间估算。
[硬件电路]
[源代码]
#include <reg51.h>
#include <intrins.h> //后面要用到它里面的_crol_(k,l)函数
这个函数的意思是把一个字符变量k 循环左移l 位,关于它的说明请查看安装KEIL 目录下的\Keil\C51\HLP 文件夹里面的c51lib,这个文件里面有各种用C 语言封装好的函数库,我们在以后使用其中某些函数时可以直接使用而自己不必再写。
unsigned char a,b,k,j; //定义四个字符变量
sbit beep=P2^6; // 定义蜂鸣器的接口
void delay10ms() //延时子程序,大约延时10ms
{
for(a=100;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
k=0xfe; //先给k 一个初值11111110 等待移位
while(1)
{
delay10ms();
beep=0; //打开蜂鸣器
delay10ms(); //让它响10ms
beep=1; //关闭蜂鸣器
j=_crol_(k,1); //把k 循环左移一位
k=j; //把移完的值再送给k
P3=j; //同时把值送到P1 口点亮发光二极管
} //再次循环
}
3.5 单键识别
[实验要求]
每按一次独立键盘KEY1 键,与P3 口相连的2个发光二极管中点亮的一个往下移动一位。
注意:关于按键去抖动的解释,我们在手动按键的时候,由于机械抖动或是其它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。
[实验目的]
独立按键的识别方法、键盘消抖等。
[硬件电路]
#include <reg52.h>
sbit BY1=P1^5; //定义按键的输入端KEY1 键
unsigned char count; //按键计数,每按一下,count 加1
unsigned char temp;
unsigned char a,b;
void delay10ms(void) //延时程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
key() //按键判断程序
{
if(BY1==0) //判断是否按下键盘,当单片机上电时所有IO 口为高电平,KEY1 键一端接地另一端通过74HC245接P0口,所以当键被按下时P0 口中肯定不全为“1”,此时检测哪一位为低电平,则与此相连的键被按下。
{
delay10ms(); //延时,软件去抖动干扰
if(BY1==0) //再次检测确认按键按下
{
count++; //按键计数加1
if(count==8) //计8 次重新计数
{
count=0; //将count 清零
}
}
while(BY1==0); //等待按键释放,如果键未释放则一直在此等待。
}
}
move() //广告灯向下移动移动函数
{
a=temp<<count; //这三句为一个循环移位
b=temp>>(8-count); // _crol_()函数,这里是自己写的过程,大家可对比P1=a|b; //下。
}
main()
{
count=0; //初始化参数设置
P1_5=0;
P0=0xff;
while(1) //永远循环,扫描判断按键是否按下
{
key(); //调用按键识别函数
move(); //调用广告灯移动函数
}
}
3.6 利用定时器和蜂鸣器唱歌
[实验要求]
用单片机的P2.6 口输出不同占空比的方波来控制与它相连的蜂鸣器,当方波的占空比不同时蜂鸣器发出的音调就不同,由此根据歌曲的音调编程实现让蜂鸣器唱歌。
占空比:一个周期中,高电平的长度比上总周期的长度的值再乘上100%。
标准方波的占空比为50%。
[实验目的]
学会利用单片机的定时器,掌握蜂鸣器的发声操作。
[硬件电路]
[源代码]
#include "reg51.h"
unsigned char Count;
sbit _Speak =P2^6 ; //蜂鸣器控制脚
unsigned char code SONG[] ={ //祝你平安,以下为编码
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20 ,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x2 0,0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x 20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0
x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b, 0x10,0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40 ,0x20,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x2 6,0x20,0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x 20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0 x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10, 0x2b,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20 ,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x1 0,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x 10,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
//路边的野华不要采 , 以下为这首歌的编码
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,0x2 0,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x 20,0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0 x30,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,0x2 0,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x 20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0 x20,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 Time0_Init() //定时器0 初始化函数
{
TMOD = 0x01; //工作模式选择
IE = 0x82; //中断设置
TH0 = 0xD8; //装初值
TL0 = 0xEF; //12MZ 晶振,10ms
}
void Time0_Int() interrupt 1 //定时器0 中断子函数
{
TH0 = 0xD8;
TL0 = 0xEF;
Count++; //长度加1
}
/*-------------------------------------------------
1MS 延时子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{
unsigned int i,j;
for( i =0;i < x;i++ )
{
for( j =0;j<3;j++ );
}
}
/*------------------------------------------------- 功能:歌曲播放子程序i 为播放哪一段曲目
-------------------------------------------------*/ void Play_Song(unsigned char i)
{
unsigned char Temp1,Temp2;
unsigned int Addr;
Count = 0; //中断计数器清0
Addr = i * 217;
while(1)
{
Temp1 = SONG[Addr++];
if ( Temp1 == 0xFF ) //休止符
{
TR0 = 0;
Delay_xMs(100);
}
else if ( Temp1 == 0x00 ) //歌曲结束符
{
return;
}
else
{
Temp2 = SONG[Addr++];
TR0 = 1;
while(1)
{
_Speak = ~_Speak;
Delay_xMs(Temp1);
if ( Temp2 == Count )
{
Count = 0;
break;
}
}
}
}
}
/*-------------------------------------------------
功能:主程序
-------------------------------------------------*/
void main()
{
Time0_Init(); //定时器0 中断初始化
while(1)
{
Play_Song(0); //播放
}
}
3.7 DS18B20 温度测量显示实验
[实验要求]
用单片机控制开发板上的DS18B20 数字温度传感器,读取当前环境温度,精度达0.1 度,温度范围0-99 度,并用LCD1602显示出来。
同时开发板上的单片机还能把温度值通过串口发送到计算机,在计算机上安装该目录下的.exe 文件后,打开应用程序可看到温度值。
注意:DS18B20 数字温度传感器是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点(1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125 摄氏度之间。
(5)、数字温度计的分辨率用户可以从9 位到12 位选择。
(6)、内部有温度上、下限告警设置。
DS18B20 详细引脚功能描述1、GND 地信号;2、DQ 数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,也可以向器件提供电源;3、VDD 可选择的VDD 引脚。
当工作于寄生电源时,此引脚必须接地。
DS18B20 的使用方法。
由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对STC90C54RD+ 单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20 芯片的访问。
由于DS18B20 是在一根I/O 线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20 有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
[实验目的]
学习单总线器件的读写方法,数值合成,数字类型变化等。
[硬件电路]
R6
4.7K
[源代码]
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^6; //define interface 定义DS18B20 接口
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
void delay(uint count) //延时子函数
{
uint i; while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void dsreset(void) //发送初始化及复位信号
{
uint i; //DS18B20 初始化
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit 读一位
{
uint i;
bit dat;
DS=0;i++; //i++ for delay 小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date 读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT 里}
return(dat); //将一个字节数据返回
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{ //写一个字节到DS18B20 里
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1 写1 部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0 写0 部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change 发送温度转换命令
{
dsreset(); //初始化DS18B20
delay(1); //延时
tmpwritebyte(0xcc); // 跳过序列号命令
tmpwritebyte(0x44); //发送温度转换命令
}
uint tmp() //get the temperature 获得温度
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe); //发送读取数据命令
a=tmpread(); //连续读两个字节数据
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a; //两字节合成一个整型变量。
tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625 度,所以读回数据的最低位代表的是
//0.0625 度。
temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入操作。
return temp; //返回温度值
}
void readrom() //read the serial 读取温度传感器的序列号
{ //本程序中没有用到此函数
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10; //分离出三位要显示的数字SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=0;
P0=table[A1]; //显示百位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);
dula=0;
P0=table1[A2]; //显示十位带小数点的dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);
P0=table[A3]; //显示个位
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
delay(1);
}
void main() //主函数
{
uchar a;
Init_Com(); //初始化串口
do {
tmpchange(); //温度转换
for(a=10;a>0;a--) {
display(tmp()); //显示十次
} }
while(1); }
3.8 LCD1602 字符液晶显示
[实验要求]
在 LCD 1602 液晶屏上指定的位置显示出自己想要的数字或字符,学会使用LCD 1602 液晶做滚动字符显示。
[实验目的]
学习 LCD 1602 液晶的操作。
注意:插好液晶后如果显示字符不清楚,请调节 LCD 1602 液晶对比度调节电位器,顺时针拧动直到液晶上面一行能显示出黑色的方格为止。
关于 LCD 1602 液晶的使用方法请查看有关资料。
[硬件电路]
AP2.2
AP2.0J5LCD1602
1
2345678910111213141516
A
AP2.1AD7AD5AD3GND AD0AD4AD1AD2AD6R520K
VCC Q1GND。