第一篇:单片机数码管显示课程设计
单片机数码管显示课程设计
目录引言...............设计任务和要求.............1
2.1 设计目的............1
2.2 设计意义............1总原理图及主要模块的流程图......1
3.1 总原理图及元器件清单..............1
3.2 主要流程图..........1性能测试与分析.............35 结论与心得..........4致谢...........4
参考文献.............4
单片机数码管显示课程设计引言
从上世纪70年代第一批单片机问世,短短二三十年时间,单片机技术已经成为计算机技术的一个重要分支,广泛运用到工业控制、仪器、仪表、消费产品,汽车、办公自动化和通信等领域。因此,单片机技术已经成为电子、测控、自动化、通信等许多工科专业学生的必备技能。
我用AT89C51芯片来设计一个简单的数码管显示。此设计给出了源代码,通过仿真测试,其性能指标达到了设计要求。
关键词:单片机,AT89C51,数码管设计任务和要求
2.1 设计目的1.学习基本理论在实践中综合运用的初步经验,掌握模拟电路设计的基本方法、设计步骤,培养综合设计与调试能力。
2.了解AT89C51这个芯片的使用和性能指标测试方法。
3.培养实践技能,提高分析和解决实际问题的能力。
2.2 设计意义
为了更好地熟悉和掌握单片机的基本功能和编程,掌握数码管动态扫描显示原理及实现方法。自我动态扫描显示电路驱动程序的编写方法。通过课程设计,达到理论与实际应用相结合,提高学生对微机硬件结构的软件设计方法的理解,使学生能够根据实际应用,初步实现硬件及软件的设计,对硬件开发有更深层的认识,为今后打软硬件开发,打下坚实的基础。总原理图及及主要模块的流程图
3.1 总原理图及元器件清单
(1)我用Proteus 7 professional来画出我设计的总原理图,如图3-1。
如图3-1
此电路图就用到AT89C51这个芯片,和一个数码管。
3.2 主要流程图(四号宋体加粗)
1.主程序的流程图
图3.2-1主流程图
2.子程序的流程图
图3.2-2子流程图性能测试与分析
主程序和子程序都存放在AT89C51单片机中。主程序的功能是:显示数字。子程序的功能有:延时。程序代码:
ORG 0000H;初始化
LJMP START;转入主程序
ORG 0010H;初始化
START:
CLR P2.7;P2.7←00H
MOVR0,#00H;R0←00H
MOV R2,#10;R2←10
MAIN:
MOV DPTR,#TAB;DPTR←TAB
MOV A,R0;A←(RO)
MOVC A,@A+DPTR;A←((A)+(DPTR))
MOV P0,A;P0←(A)
LCALL DELAY;调用延时程序
INC R0;RO←(R0)+1
DJNZR2,MAIN;判断
JMP START;循环
DELAY:;延时程序
MOV R3,#11
D1: MOV R4,#100
D2: MOV R5,#100
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
TAB:
DB 00101000B;0
DB 11101011B;1
DB 00110010B;2
DB 10100010B;3
DB 11100001B;4
DB 10100100B;5
DB 00100100B;6
DB 11101010B;7
DB 00100000B;8
DB 10100000B;9
END
我用Proteus 7 professional 软件来测试我设计的电路图。当运行时,数码管显示0。如图4-1。
图4-1
当221ms后,数码管显示1。如图
4-2.图4-2
我的程序是一个循环的,一直到显示9,之后又重新开始显示0。在此不一一列出来。
为了能在实际在到应用,我用开发板来验证我所设计的电路图。其结果如下:
图4-3显示1
图4-4显示8
从仿真的结果可以看出,我的设计是满足我设计的要求的。结论与心得
通过单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。使之不断地战胜别人,超越前人。同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
这个设计过程中,我遇到过许多次失败的考验,就比如,我在软件上仿真软件上能实现其功能,但是把它写进开发板就无法运行,我不停地找原因。最后我找到了答案,这样我明白,做设计不但是软件可以运行,用在硬件上一样是那么重要的。我做的这个设计主要是用AT89C51这个芯片来实现,这个芯片具有很多优点,程序简单易读,结构清楚,最重要的是成本低。很适合我们学生用来学生。在做这个设计的过程中,我也了解到了自己的不足,在日后的学习中,我还需加倍努力学习。
参考文献)
[1]梁炳东.单片机原理与应用。北京:人民邮电出版社,2009
[2]
[3]http://wenku.baidu.com/album/view/702db2c7aa00b52acfc7cae7
致谢(小三号 宋体 加粗)
在此次课程设计中,我遇到不懂的问题,老师和同学都帮我,让我把问题顺利地得到解决,最后完成此次课程设计报告。从中我学到了很多东西,在此,谢谢我的老师和同学,感谢你们在我遇到难题的时候帮我解答。
第二篇:单片机数码管显示实验
实验一
数码管实验
一、实验目的
1.了解数码管的显示原理;2.掌握JXARM9-2440 中数码管显示编程方法
二、实验仪器
JXARM9-2440教学实验箱、ADT1000仿真器和ADT IDE集成开发环境、串口连接线、PC机。
三、实验原理
7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。
LED显示器的接口一般有静态显示与动态显示接口两种方式。
本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。数码管采用共阳方式,向该地址写一个数据就可以控制LED 的显示,数据中的1对应的不亮,0对应的亮,数码管各位从高到低排列为dp-g-f-e-d-c-b-a,例如当数据寄存器是11111111时则不亮,当是01111111时则显示8,其原理图如图所示。
四、实验内容
1、编程实现:六个数码管同时正向显示0-F,然后反向显示F-0。
2、编程实现:在六个数码管上依次显示与自己姓名有关的内容,可分辨出轮流显示。
3、编程实现:在六个数码管上依次显示与自己姓名有关的内容,分辨不出轮流显示。
4*、编程实现:在每个数码管上递增显示0—9。5*、自行开发。
五、实验程序
1, /****************************************************************************/ /*文件名称: LEDSEG7.C
*/ /*实验现象: 数码管依次显示出0、1,2、„„
9、a、b、C、d、E、F
*/ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = {
/* 0
7*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8
A
B
C
D
E
F*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试
*/ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF
*/ /* 返回代码: 无
*/ /* 参数说明: 无
*/ /****************************************************************************/ void Test_Seg7(void){
int i;
*((U8*)0x20007000)=0x00;/*6个数码管都亮*/ for(;;){
/*数码管从0到F依次将字符显示出来*/
for(i=0;i<0x10;i++)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
/*数码管从F到0依次将字符显示出来*/
for(i=0x0f;i>0x00;i--)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
} }
// TODO } /****************************************************************************/
/* Function name : 循环延时子程序
*/ /* Description : 循环 'time' 次
*/ /* Return type :void
*/ /* Argument
: 循环延时计数器
*/ /****************************************************************************/ void Delay(int time){
int i;int delayLoopCount=10000;
for(;time>0;time--);
for(i=0;i 2, /****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象: 数码管依次显示ZHAngg,并能看出轮流显示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 在六个数码管上分别显示字母,与姓名有关 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(10000);} // TODO } /***************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 3, /****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象: 数码管依次显示出ZHAngg,并看不出轮流显示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 在六个数码管上分别显示字母,与姓名有关 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(1);} // TODO } /***************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 4, /****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象: 数码管依次显示出0、1,2、„„ 9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* 0 7*/ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管各自递增显示0—9 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void){ int i;for(;;){ for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } } // TODO } /****************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 六、实验结果与分析 实验一结果:六个数码管同时显示相同的符号,从0-F再由F-0之间的循环变换。 分析:在数码管扫描控制地址处选中六个数码管,使其同时亮,在给其数码管的数据寄存器存入不同符号对应的数值,加上相应的延迟,就 可以是轮流变换的循环的符号变换。 实验二结果:第一个数码管显示Z后,第二个显示H,接着第三个显示A,接着第四个显示n,接着第五个显示g,接着第六个显示g,接着第一个再显示Z…..如此循环。 分析:设置控制地址使其单独并且循环显示,每个数码管的数据寄存器送入不同的符号的数值,并设置较大的延迟时间即可产生该现象。 实验三结果:六个数码管一起显示“ZHAngg”。 分析:原理同实验二,只是将延迟时间改小到人眼无法分辨的地步即使一起显示。 实验四结果:第一个数码管显示0—9之后,第二个接着显示0—9,接着第三个,第四个….分析:设置循环使六个数码管循环单独显示,在每个数码管显示中再加入循环,使其递增显示0—9,设置较大的延迟,是我们可以看清实验现象。 七、实验总结与心得体会 本次试验需要了解数码管的基本工作原理,基于C语言设计编程完成实验,实验的关键在于把握实现各种现象的本质上的差异,在程序上作出修改。通过本次试验对于实验的严谨性有了进一步的体验,稍有不小心实验结果就适得其反,以后要更加用心,更加认真的做实验。 仲恺农业工程学院实验报告纸 信息学院(院、系)专业班组单片机原理及接口技术课实验四单片机键盘输入以及数码管显示编程 一、实验目的1、掌握单片机键盘以及数码管显示的工作原理; 2、掌握单片机键盘以及数码管显示的编程方法。 二、实验内容 1、学习单片机键盘检测、消抖以及译码等; 2、学习单片机数码管静态以及动态的显示方式; 3、利用单片机键盘以及数码管编写程序驱动开发板上的蜂鸣器以及数码管按一定规律工作。 三、实验设备 1、STC单片机开发板; 2、PC机以及串口线。 四、实验步骤 参考实验指导书。 五、实验总结 一、前言 1.1设计制作产品的背景、目的及设计要求 本项目为16x16点阵汉字显示“新年快乐”的设计,首先将本次实训的电路图在仿真软件上绘制完成,将点阵文件存入ROM,形成汉字编码,再进行相关转换,以新编码提取相应的点阵汉字显示。将相应编码代入运行程序,进行调试和准备。 1.2分工情况、工作计划及本人所承担工作 1.周一 1~4 进行分组,选题 和软件的安装 2.周二 1~4 进行电路的设计及程序编写 3.周三 1~4 进行电路的设计及程序编写 4.周四 1~4 进行说明书的填写 5.周五 1~4 答辩 本人在本次课程设计中承担电路图的绘制及相关程序的编写与调试。 1.3本课题的设计重点及难点 本次课程设计重点在于单片机控制系统程序采用单片机汇编语言进行编辑,通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。而其中的难点就在于运行程序的编写及相关汉字的点阵数据,这种显示字符的点阵数据可以自行编写,也可以标准字库中提取。 在进行课题设计时需要熟练掌握相关电路软件及编程软件的使用,编写程序时需掌握一定的C语言逻辑关系的运用。在电路图的绘制时需要清楚的了解各个电路设备的功能及用途。 二、实训内容 2.1实训原理 本设计应用的扫描方法为水平方向(X方向)扫描。 每一个字由16行16列的点阵形成显示,即每个字均由256个点阵来表示,我们可以把每一个点理解为一个像素。一般我们使用的16×16的点阵宋体字库,即所谓的16×16,是每一个汉字在纵横各16点的区域内显示的。汉字库从该位置起的32字节信息记录了该字的字模信息。事实上这个汉字屏不仅可以显示汉字,也可以显示在256像素范围内的任何图形。 上半部分第一列完成之后,继续扫描下半部分的第一列,为了接线的方便,我们仍设计成由上往下的扫描方式,即从A8向A15方向扫描,按照这个方法,继续进行下面的扫描,一共扫描32个8位,可以得出汉字。 2.2硬件设计 2.3软件设计 #include for(j=q;j<32+q;j++) { P1=sm[t]; P0=seg[j]; j++; P2=seg[j]; delay(50);t--; if(t==0) t=16;} q=q+32; if(q==128) q=0;} } 三.结论 3.1 实训过程中遇到的问题及解决措施 在本次实验中,我组在制作的16x16点阵显示汉字“新年快乐”的课程设计中,首先在使用单片机仿真软件找寻相关设备时没有找到16x16的点阵设备,继而用四个8x8的点阵排列组合予以替代。 依据相关教材及指导教师的参考和建议,我组对于本次设计的电路图采用了通用模板设计。 此次课程设计的运行程序是我组在设计中的最大难点,后经多方查资料及参考询问,我组找到了相应汉字在点阵中的排序规律,顺利编写出代码。 3.2 今后的学习展望 经过这次的单片机课程设计,从产生设计想法到实际操作,到最终的设计完成,中间遇到的困难及困难的解决,让我更进一步了解了单片机,让我不再仅仅局限于书本上。 本次的设计经验对于我们日后的学习工作有非常重要的作用,在遇到困难时可以不仅仅从书本上找解决方案,还可以自己亲自动手实践来验证相关问题及找到解决方法。 这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。通过题目选择和设计电路的过程中,加强了我思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。 四、心得体会 本次的设计经验对于我们日后的学习工作有非常重要的作用,在遇到困难时可以不仅仅从书本上找解决方案,还可以自己亲自动手实践来验证相关问题及找到解决方法。 单片机这门课是一科非常重视动手实践的科目,不能总是看书,但是也不能完全不看书。单片机并不象传统的数字电路或模拟电路那样比较直观,原因是除了“硬件”之外还存在一个“软件”的因素。正是这个“软件”的原因使得许多初学者怎么也弄不懂单片机的工作过程,怎么也不明白为什么将几个数送来送去就能让数码管显示一串字符或控制一个电机的变速。对初学单片机的人来说,需要从书中大概了解一下单片机的各个功能寄存器,如果看的多了反而容易搞乱,现在市场上大多数讲单片机的书一开始就讲解较复杂的内存、地址、存储器什么的,更让初学者感到不知所云、难以入门。如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,能够产生什么实际效果,那么也许用不了几天就会觉得枯燥乏味而半途而废。简单的说,使用单片机实际上就是用我们自己编写的软件去控制单片机的各个功能寄存器。再简单些,就是控制单片机哪些引脚的电平什么时候输出高电平,什么时候输出低电平。由这些高低变化的电平来控制外围电路,实现我们需要的各个功能。 经过这次的单片机课程设计,从产生设计想法到实际操作,到最终的设计完成,中间遇到的困难及困难的解决,让我更进一步了解了单片机,让我不再仅仅局限于书本上。 《单片机原理与应用》 课程设计报告 题 目:LCD数字式温度湿度测量计 专 业:自动化 班 级:A1332 学 号:10 姓 名:曾志勇 指导老师:查兵 2016-06-08 目 录 1.设计题目、要求及分工..................................1 1.1.设计要求.........................................1 1.2.分工.............................................1 2.系统设计方案论证与选择................................1 3.系统硬件电路设计......................................1 3.1.单片机的选择......................................1 3.2.温度传感器电路的设计..............................2 3.3.LCD1602显示设计..................................3 4.系统软件设计..........................................4 4.1.主程序...........................................4 4.2.读出温度子程序....................................6 5.系统仿真调试结果记录及分析...........................11 6.总结.................................................13 参考文献................................................14 设计题目、要求及分工 1.1.设计要求 (1)熟悉掌握单片机的中断,定时器及各并行口的应用;(2)熟悉掌握单片机温度湿度的测量方法;(3)利用温度传感器及单片机完成对温度的检测;(4)掌握将检测的温度信号转换为数码管显示的数字信号; (5)设计一个简单数字温度计,能够测量通常环境下的温度,能够实现零下温度的测量,能够测量小数,精度为0.01度。 1.2.分工 经过我和队友的商讨,为了能最大发挥各自的长处。我主要负责程序的编写与单片机的调试。他主要负责一些相关资料文献的查找与课程设计报告。 1.系统设计方案论证与选择 在日常生活和生产中,我们经常要测量环境的温度湿度,传统的测量方式采用水银温度计和干湿球湿度计查算法,存在着误差大,操作使用不便等问题,采用工业级测量仪表价格昂贵。采用AT89C51和温度传感器等构成的LCD数字式温度湿度测量计精度高且价格便宜。 由于本设计是测温电路,可以使用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行A/D转换,将数据传入80C51单片机中,单片机处理后,通过LED显示出当前实测温度。 2.系统硬件电路设计 2.1.单片机的选择 单片80C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统。 本次设计需要注意的几个端口: P0口(39—32):是一组8位漏极开路行双向I/O口,也既地址/数据总线复用口。可作为输出口使用时,每位可吸收电流的方式驱动8个TTL逻辑电路,对端口写“1”可作为高阻抗输入输入端用。在访问外部数据存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,PO口接收指令字节,而在程序校验时,输出指令字节,校验时,要求接上拉电阻。P3口(10—17):是一组带有内部上拉电阻的8位双向I/O口,P1的输入缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输出端口。作输出端口时,被外部拉低的P3口将用上拉电阻输出电流。 2.2.温度传感器电路的设计 DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。 64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图2.3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义:低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率S18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒,可以将检测到的温度直接显示到80C51的两个数码管上。 高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。 当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单 片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB式表示。 当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。 DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令做出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。 在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。 另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。 图 2-1 温度传感器电路 2.3.LCD1602显示设计 图 2-2 LCD显示电路图 LCD1602显示流程: 图3-3 流程图 3.系统软件设计 3.1.主程序 主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。温度测量每1s进行一次。主程序流程图如图4.1所示: #include //初始化LCD1602 //写地址 80表示初始地址 LcdWriteCom(0x88);LcdWriteData('C');while(1){ LcdDisplay(Ds18b20ReadTemp());Delay1ms(1000);//1s钟刷一次 // } } /* 函数名 : LcdDisplay()* 函数功能 : LCD显示读取到温度/ void LcdDisplay(int temp)//lcd显示 { unsigned char datas[] = {0, 0, 0, 0, 0};//定义数组 float tp;if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('-');//显示负 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5;} else { LcdWriteCom(0x80); LcdWriteData('+'); tp=temp; temp=tp*0.0625*100+0.5; } datas[0] = temp / 10000;datas[1] = temp % 10000 / 1000;datas[2] = temp % 1000 / 100;datas[3] = temp % 100 / 10;datas[4] = temp % 10;LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]);//百位 LcdWriteCom(0x83); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]);//十位 LcdWriteCom(0x84); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]);//个位 LcdWriteCom(0x85); //写地址 80表示初始地址 //显示 ‘.’ //写地址 80表示初始地址 LcdWriteData('.');LcdWriteCom(0x86); LcdWriteData('0'+datas[3]);//显示小数点 LcdWriteCom(0x87); //写地址 80表示初始地址 } LcdWriteData('0'+datas[4]);//显示小数点 图 3-1主程序流程图 3.2.读出温度子程序 读出温度子程序的主要功能是读出RAM中的9字节。在读出时必须进行CRC 校验,校验有错时不能进行温度数据的改写。读出温度子程序流程图如下图所示: #include“temp.h” void Delay1ms(uint y){ uint x; } uchar Ds18b20Init(){ uchar i;DSPORT = 0;i = 70; //将总线拉低480us~960us for(;y>0;y--){ for(x=110;x>0;x--);} while(i--);//延时642us DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 } void Ds18b20WriteByte(uchar dat)i = 0;while(DSPORT)//等待DS18B20拉低总线 { } return 1;//初始化成功 i++;if(i>5)//等待>5MS { } Delay1ms(1);return 0;//初始化失败 { uint i, j;for(j=0;j<8;j++) { DSPORT = 0;i++;DSPORT = dat & 0x01;//然后写入一个数据,从最低位开始 i=6;while(i--);//延时68us,持续时间最少60us DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接 //每写入一位数据之前先把总线拉低1us 着写入第二个数值 } uchar Ds18b20ReadByte(){ uchar byte, bi;uint i, j;for(j=8;j>0;j--){ DSPORT = 0;//先将总线拉低1us i++;DSPORT = 1;//然后释放总线 i++;i++;//延时6us等待数据稳定 bi = DSPORT;//读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉 } dat >>= 1;那位补0。*/ byte =(byte >> 1)|(bi << 7); } i = 4;//读取完之后等待48us再接着读取下一个数 while(i--); } return byte;void Ds18b20ChangTemp(){ Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44);//温度转换命令 //等待转换成功,而如果你是一直刷着的话,就不// Delay1ms(100);用这个延时了 } void Ds18b20ReadTempCom(){ Ds18b20Init(); } int Ds18b20ReadTemp(){ int temp = 0; 命令 tml = Ds18b20ReadByte();tmh = Ds18b20ReadByte();temp = tmh;temp <<= 8;Delay1ms(1);Ds18b20WriteByte(0xcc);//跳过ROM操作命令 Ds18b20WriteByte(0xbe);//发送读取温度命令 uchar tmh, tml;Ds18b20ChangTemp();Ds18b20ReadTempCom(); //先写入转换命令 //然后等待转换完后发送读取温度 //读取温度值共16位,先读低字节 //再读高字节 } temp |= tml;return temp;读出温度子程序 读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。得出温度子程序流程图如下图所示。 图 3-2 温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间约为750ms。在本程序设计中,采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如下图所示。 图 3-2 4.系统仿真调试结果记录及分析 硬件调试比较简单,首先检查电感的焊接是否正确,然后可用万用表测试或通电检测。软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试 由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。 电路Isis仿真测试 烧写程序至单片机: 液晶显示室温为+28.06度 用手触摸DS18B20,发现温度上升为+32.75度,证明温度传感正常工作。 5.总结 这次课程设计,主要是以STC89C51单片机为核心的,对温度的检测与显示进行了简单的设计与阐述。因没有湿度传感器模块,所以未进行湿度检测。本次课程设计可以说是软硬结合,又以硬件为主。当今科技发展迅速,单片机开发有着光明的前景。由于单片机经济实用、开发简便等特点依然在工业控制、家电等领域占据了广泛的市场。所以我选择这样的设计课题,并且能通过此次设计来提高自己软件编制和硬件电路设计的能力。在我完成这次课程设计的过程中,当看到自己将专业知识用于解决实际的问题时,那份成就感和喜悦感是难以形容的。在这次实际的编程以及调试程序过程中,我发现自己学很多课本以外的东西。光靠自己在书本上所学过的这点知识是远远不够的,真正地认识到了工作就是学习的道理。尤其是对于编程来说,需要硬件的功底,也需要软件的能力。当程序有一点点错误时,将使整个程序无效,需要自己静下心来发现错误,改正错误,一次又一次得进行调试,锻炼了沉着踏实的心态。 通过这次对数字温度计的设计与制作,让我们了解了设计电路的程序,也让我们了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真,仿真成功之后才实际接线的。 但是最后的成品却不一定与仿真时完全一样,因为,在实际接线中有着各种各样的条件制约着。并且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。 通过这次学习,让我们对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。从这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识应用到实际当中,学习单机片机更是如此,程序只有在经常写和读的过程中才能提高,这就是我在这次课程设计中的最大收获。这次课程设计对我来说是一次比较全面的、富有创造性和探索性的锻炼,令我深有感触,对于我今后的学习、工作和生活都将是受益非浅。 参考文献 (1)江世明.单片机原理与应用.上海交通大学出版社.2013;(2)朱清慧.电子线路设计、制版与仿真.清华大学出版社.2011.6; (3)黄同成.程序设计基础与教程(C语言).湖南人民出版社.2011.12; (4)王东峰等.单片机C语言应用100例[M].北京电子工业出版社,2009; (5)陈海宴.51单片机原理及应用[M].北京航空航天大学出版社.2010; (6)胡汉才.单片机原理及接口技术[M].北京清华大学出版社.1996; (7)高稚允,高岳.光电检测技术[M].北京国防工业出版社.1983;第三篇:实验四 单片机键盘输入以及数码管显示编程
第四篇:单片机16点阵汉字显示课程设计
第五篇:单片机课程设计报告LCD显示温度