基于炜煌单片机的温度感应模块源代码,芯片类型STC12c5a60s2
/* 本程序采用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相关推荐
- matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc
基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...
- 基于51单片机1602温度显示时钟
基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...
- 基于51单片机的温度报警系统(程序分装)
文章目录 目录 前言 一.程序结构 1.1.1 全局变量 1.1.2 静态本地变量 1.2 预处理命令 1.3.1 函数原型 1.3.2 头文件 标准头文件结构. 1.4 *声明和定义* 二.错误示 ...
- 基于51单片机的温度检测报警系统
目录 具体实现功能 设计背景 硬件设计 软件设计 原理图 程序 仿真实现 全部资料 具体实现功能 系统由STC89C51单片机+液晶1602显示+DS18B20温度传感器+按键模块+报警模块构成. 具 ...
- 51单片机 普中V2 超声波测距 报警 显示 基于MCS51单片机的超声波测距模块的开发
基于MCS51单片机的超声波测距模块的开发 采用C51程序设计语言,完成下列功能要求. l 必选功能: (1) 超声波模块和单片机的接口设计,画出完整的电路原理图.(15分) (2) 开发板上电时,显 ...
- 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)
基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...
- 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)
本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...
- 基于51单片机、DS1302时钟模块的电子闹钟设计
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...
- 基于51单片机多路温度检测proteus仿真 ds18b20
本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 ...
最新文章
- arcgis Server Object Extension (SOE)部署jar文件失败 原因探索
- VMware vSphere 虚拟化简介
- Makefile文件的编写规则
- Java类的继承(将来填坑)
- linux var目录满了,Linux入门教程:/var/spool/clientmqueue 占满根目录
- 易语言微凉模块oracle,跟着微凉学易语言 【简单子类化】
- 组合数据类型练习,综合练习
- Linux下Tomcat死活找不到JSP页面中import指定类的解决方法
- 生产排程系统_ASPROVA:工序排程软件的全球隐形冠军
- 趣头条自媒体审核不过怎么办,趣头条伪原创工具教程
- 基于深度学习的自然场景文字识别系统研究 faster-RCNN + CRNN (一)
- 关于移动视频直播技术,关键干货都在这里(一)采集
- 360导航底部的效果html,jQuery仿360导航页图标拖动排序效果代码分享
- IE浏览器无法添加进信任站点和受限站点,添加后被还原
- 个人网站学习实践(wordpress教程)
- 简单解析android Hander处理机制
- 温度上报实时监控项目——服务器端
- 电力电子:单项逆变器设计(MATLAB程序+AD原理图)
- 数字孪生智慧火电解决方案
- CRM 2011 JS集锦
热门文章
- 01336软件项目管理考试大纲
- 释放百万IOPS性能!阿里云数据库下一代存储介质ESSD云盘来了!
- OpenCV之图像梯度
- 公众号开发: 给用户发红包
- 知识点滴 - 电源适配器接头的极性
- 文件上传与下载的场景梳理
- mac 文字识别软件ocr_Easy Screen OCR Mac版(Mac文字识别效率助手)V1.1 最新版
- php new com(quot;wmplayer.ocxquot;),WMplayer.ocx的一些使用
- TypeError: elem.nodeName is undefined
- WPF,防止snoop窥探你的程序