/* 本程序采用lcd12864显示,接入温度感应模块后会在第一行显示温度*/

//硬件连接:  用1位杜邦线将J11_7与J17_1820连接,将12864液晶接口对应插接到接口。

#include"reg51.h"

#include"intrins.h"     //_nop_();延时函数用

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P2^7;    //温度控制口

sbit RS=P2^5;    //命令/数据选择

sbit RW=P2^4;    //读写口

sbit  E=P2^3;    //锁存控制

sbit RES = P2^0; //复位

sbit PSB = P2^2; //串并选择

void delay1(uint t)

{

while(--t);

}

//**************************************************************************************************

//传感器初始化

//**************************************************************************************************

//**************************************************************************************************

//延时函数

//**************************************************************************************************

delay(uint time)         //int型数据为16位,所以最大值为65535

{

uint  i,j;             //定义变量i,j,用于循环语句

for(i=0;i<time;i++)    //for循环,循环50*time次

for(j=0;j<100;j++); //for循环,循环50次

}

//**************************************************************************************************

//查忙

//**************************************************************************************************

checkbusy()

{

RS=0;                   //命令/数据选择,为0时选择命令

RW=1;                   //读/写选择,为1时选择读

E=1;                    //使能

while((P0&0x80)==0x80); //查忙标志位,等待标志位为0,即表示写入完毕

E=0;                    //关闭读写

}

//**************************************************************************************************

//向LCD写一命令

//**************************************************************************************************

wcode(uchar cmdcode)

{

checkbusy();            //查忙

RS=0;                   //命令/数据选择,为0时选择命令

RW=0;                   //读/写选择,为0时选择写

E=1;                    //使能

P0=cmdcode;             //送入命令

delay(10);              //等待写入

E=0;                    //关闭读写

}

//**************************************************************************************************

//向LCD写一数据

//**************************************************************************************************

wdata(uchar dispdata)

{

checkbusy();            //查忙

RS=1;                   //命令/数据选择,为1时选择数据

RW=0;                   //读/写选择,为0时选择写

E=1;                    //使能

P0=dispdata;            //送入数据

delay(10);              //等待写入

E=0;                    //关闭读写

}

//**************************************************************************************************

//LCD 初始化

//**************************************************************************************************

InitLCD()

{

PSB=1;             //设置为8BIT并口工作模式

RES=0;             //复位

delay(10);         //延时

RES=1;             //关复位

wcode(0x30);       //选择基本指令集

wcode(0x0c);       //开显示(无游标、不反白)

wcode(0x01);       //清除显示,并且设定地址指针为00H

wcode(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位

}

//**************************************************************************************************

//任意位置显示字符串

//**************************************************************************************************

void dis(uchar x,uchar y,uchar code *s)

{                                     //x为横坐标,y位纵坐标,*s表示指针,为数据的首地址

switch(y)                            //选择纵坐标

{

case 0: wcode(0x80+x);break;    //第1行

case 1: wcode(0x90+x);break;    //第2行

case 2: wcode(0x88+x);break;    //第3行

case 3: wcode(0x98+x);break;    //第4行

default:break;

}

while(*s>0)                        //写入数据,直到数据为空

{

wdata(*s);                      //写数据

delay(10);                      //等待写入

s++;                            //下一字符

}

}

init_18b20()

{

uchar flag;

DQ=1;

delay1(10);  //延时

DQ=0;

delay1(500); //*延时,要求精度,要求大于480us*

DQ=1;

delay1(200); //*延时,要求精度,要求大于15us*

flag=DQ;    //DQ管脚送出60-240us的0脉冲,以示初始化成功

delay1(10);  //延时

}

//**************************************************************************************************

//写一个字节函数

//**************************************************************************************************

write_byte(uchar t)

{

uchar i;

for(i=0;i<8;i++)   //循环8次写入1字节

{

DQ=0;           //数据线置低

delay1(10);      //延时

DQ=t&0x01;      //发送1位数据,最低位开始

delay1(50);      //*延时,要求精度*

DQ=1;           //数据线置高

t=t>>1;         //右移1位

}

}

//**************************************************************************************************

//读一个字节函数

//**************************************************************************************************

uchar read_byte()

{

uchar i,value=0;;

for(i=0;i<8;i++)   //循环8次读取1字节

{

value=value>>1; //右移1位

DQ=0;           //数据线置低

delay1(10);      //延时

DQ=1;           //数据线置高

delay1(10);      //延时

if(DQ==1)value=value|0x80;//判断接收的1位数据是否为1

delay1(50);      //*延时,要求精度*

}

return(value);

}

//**************************************************************************************************

//数据处理子函数

//**************************************************************************************************

/*

chuli(uint temperature)

{

float t;

if(temperature&0x8000)         //判断是否为负数

{

temperature=~temperature+1;//取反加1

dis[3]=0xb0;               //显示负号

}

else

{

dis[3]=0x2b;               //显示正号

}

t=temperature*0.0625+0.05;     //计算出温度值,百分位四舍五入

temperature=t*10;              //本实验显示到小数点后1位,所以乘10,以便分离得到十分位

dis[7]=temperature%10+0x30;    //除10取余得温度十分位,1602只识别ASCII码,+0x30目的就是把16进制转ASCII

dis[4]=temperature/100+0x30;   //除100取整得温度十位

dis[5]=temperature%100/10+0x30;//除100取余得十位和个位,然后除10取整得温度个位

}  */

//**************************************************************************************************

//温度采集函数

//**************************************************************************************************

//**************************************************************************************************

//数据处理子函数

//**************************************************************************************************

chuli(uint temperature)

{

float t;

if(temperature&0x8000)         //判断是否为负数

{

temperature=~temperature+1;//取反加1

wcode(0x80);

wdata('-');              //显示负号

}

else

{

wcode(0x80);

wdata('+');                 //显示正号

}

t=temperature*0.0625+0.05;     //计算出温度值,百分位四舍五入

temperature=t*10;              //本实验显示到小数点后1位,所以乘10,以便分离得到十分位

}

uint get_temp()

{

uint dat;

uchar wenl,wenh;

init_18b20();         //复位

write_byte(0xcc);     //不进行编号匹配

write_byte(0x44);     //进行温度转换

init_18b20();         //复位

write_byte(0xcc);     //不进行编号匹配

write_byte(0xbe);     //发读命令

wenl=read_byte();     //温度低八位

wenh=read_byte();     //温度高八位

dat=(wenh<<8)+wenl;   //数据高低8位合并

return(dat);          //返回测量结果

}

void main()

{

uint k;

InitLCD();

while(1)

{

k=get_temp();

k=chuli(k);

wcode(0x80+0x01);

wdata(k/100+0x30);

wdata(k%100/10+0x30);

}

}

基于炜煌单片机的温度感应模块源代码,芯片类型STC12c5a60s2相关推荐

  1. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  2. 基于51单片机1602温度显示时钟

    基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...

  3. 基于51单片机的温度报警系统(程序分装)

    文章目录 目录 前言 一.程序结构 1.1.1 全局变量 1.1.2 静态本地变量 1.2 预处理命令 1.3.1 函数原型 1.3.2 头文件 标准头文件结构. 1.4  *声明和定义* 二.错误示 ...

  4. 基于51单片机的温度检测报警系统

    目录 具体实现功能 设计背景 硬件设计 软件设计 原理图 程序 仿真实现 全部资料 具体实现功能 系统由STC89C51单片机+液晶1602显示+DS18B20温度传感器+按键模块+报警模块构成. 具 ...

  5. 51单片机 普中V2 超声波测距 报警 显示 基于MCS51单片机的超声波测距模块的开发

    基于MCS51单片机的超声波测距模块的开发 采用C51程序设计语言,完成下列功能要求. l 必选功能: (1) 超声波模块和单片机的接口设计,画出完整的电路原理图.(15分) (2) 开发板上电时,显 ...

  6. 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...

  7. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

  8. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  9. 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 ...

最新文章

  1. arcgis Server Object Extension (SOE)部署jar文件失败 原因探索
  2. VMware vSphere 虚拟化简介
  3. Makefile文件的编写规则
  4. Java类的继承(将来填坑)
  5. linux var目录满了,Linux入门教程:/var/spool/clientmqueue 占满根目录
  6. 易语言微凉模块oracle,跟着微凉学易语言 【简单子类化】
  7. 组合数据类型练习,综合练习
  8. Linux下Tomcat死活找不到JSP页面中import指定类的解决方法
  9. 生产排程系统_ASPROVA:工序排程软件的全球隐形冠军
  10. 趣头条自媒体审核不过怎么办,趣头条伪原创工具教程
  11. 基于深度学习的自然场景文字识别系统研究 faster-RCNN + CRNN (一)
  12. 关于移动视频直播技术,关键干货都在这里(一)采集
  13. 360导航底部的效果html,jQuery仿360导航页图标拖动排序效果代码分享
  14. IE浏览器无法添加进信任站点和受限站点,添加后被还原
  15. 个人网站学习实践(wordpress教程)
  16. 简单解析android Hander处理机制
  17. 温度上报实时监控项目——服务器端
  18. 电力电子:单项逆变器设计(MATLAB程序+AD原理图)
  19. 数字孪生智慧火电解决方案
  20. CRM 2011 JS集锦

热门文章

  1. 01336软件项目管理考试大纲
  2. 释放百万IOPS性能!阿里云数据库下一代存储介质ESSD云盘来了!
  3. OpenCV之图像梯度
  4. 公众号开发: 给用户发红包
  5. 知识点滴 - 电源适配器接头的极性
  6. 文件上传与下载的场景梳理
  7. mac 文字识别软件ocr_Easy Screen OCR Mac版(Mac文字识别效率助手)V1.1 最新版
  8. php new com(quot;wmplayer.ocxquot;),WMplayer.ocx的一些使用
  9. TypeError: elem.nodeName is undefined
  10. WPF,防止snoop窥探你的程序