18b20配合数码管显示温度

发布者:星光曲折最新更新时间:2015-05-18 来源: 51hei关键字:18b20  数码管  显示温度 手机看文章 扫描二维码
随时随地手机看文章
1、效果图

2、代 码

效果图



 

代码:
#include

#include
 
sbit DQ = P2^0; //定义总线的I/O管脚
sbit dm = P2^2; //段码
sbit wm = P2^3; //位码
 
unsigned char hc[8]={0x3f,0x3f,0x3f}; //显示缓存
unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~F
unsigned char WM[]={0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
void SendByte(unsigned char dat);
void Delay(unsigned char j);
 
void sm() //数码管扫描函数1(95 + 45= 150 us)
 
{
unsigned char k=3;
while (k--)
{
P1 = 0; //消影
dm = 1;
dm = 0;
 
P1 = WM[k]; //写入位码
wm = 1;
wm = 0;
 
P1 = hc[k]; //写入段码
dm = 1;
dm = 0;
Delay(1);
}
}
 
void sm2(unsigned char k) ////数码管扫描函数2(19+15+4 大概 42us)
{
P1 = 0; //消影
dm = 1;
dm = 0;
 
P1 = WM[k]; //写入位码
wm = 1;
wm = 0;
 
P1 = hc[k]; //写入段码
dm = 1;
dm = 0;
Delay(1);
}
void Delay6us() //空闲7个指令周期
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void Delay(unsigned char j) //一个循环15us
{
unsigned char i;
while(j--)
{
i = 5;
while (--i);
}
}
bit d18b20_qs() //18b20 起始
{
bit dat;
DQ = 1; //DQ复位
_nop_();
DQ = 0; //拉低总线
sm(); //这里延时 150us
Delay(15); //这里延时大概 225us
sm();//这里延时 150us
DQ = 1; //拉高总线
Delay(2);  //这里延时大概 30us
dat = DQ; //读取返回值(0:有18b20存在 1:是没有)
Delay(2);
return dat; //返回数值
}
[page]
void d18b20_x(unsigned char dat) //写 8 位 数 据
{
unsigned char i;
for(i=0;i<8;i++) //8位计数器
{
DQ = 0; //拉低总线
DQ = dat & 0x01; //取最低位赋值给总线
sm2(2); //延时45us
DQ = 1; //拉过总线准备写下一个数据(或者总线复位)
dat >>= 1; //数据右移一位
}
}
unsigned char d18b20_d() //读 8 位 数 据
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //8位计数器
{
DQ = 0; //拉低总线
dat >>= 1; //数据右移一位
DQ = 1; //拉过总线(准备读取数据)
if(DQ) //判断是否是 1 如果是就把数据赋值给变量的高位
dat |= 0x80;
sm2(1);
}
return dat; //返回读取到数据数据
}
 
 
unsigned int wd() //读取温度函数
{
unsigned char i = 0; //低8位数据
unsigned char j = 0; //高8位数据
unsigned int k = 0; //无符号16整形用来存储读回来的 16位温度数据(j和i组合后的数据)
 
d18b20_qs(); //初始化
d18b20_x(0xCC); //跳过序列号的操作(因为18b20在总线上可以挂很多个,这个序列号和网卡MAC地址类似)
d18b20_x(0x44); //开启温度转换
for(;k<15;k++) //开启温度转换需要时间这里延时一下15*150us
sm();
d18b20_qs(); //初始化
d18b20_x(0xCC); //跳过序列号的操作(因为18b20在总线上可以挂很多个,这个序列号和网卡MAC地址类似)
d18b20_x(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
i = d18b20_d(); //读取低8位
sm();
j = d18b20_d(); //读取高8位
 
k = j;
k <<= 8;
k = k + i;
return k; //返回读取到的16位数据
}
void zh(unsigned int i)  //数码管显示缓存写入函数
{
unsigned char x,z;
x = i & 0x0f; //取出小数
i >>=4;
z = i & 0xff; //取出整数
switch(x) //小数位写人显示缓存
{
case 0: hc[2]=DM[0];break;
case 1: hc[2]=DM[1];break;
case 2: hc[2]=DM[1];break;
case 3: hc[2]=DM[2];break;
case 4: hc[2]=DM[3];break;
case 5: hc[2]=DM[3];break;
case 6: hc[2]=DM[4];break;
case 7: hc[2]=DM[4];break;
case 8: hc[2]=DM[5];break;
case 9: hc[2]=DM[6];break;
case 10: hc[2]=DM[6];break;
case 11: hc[2]=DM[7];break;
case 12: hc[2]=DM[8];break;
case 13: hc[2]=DM[8];break;
case 14: hc[2]=DM[9];break;
case 15: hc[2]=DM[9];break;
}
x = z/10; //取出十位
hc[0]=DM[x];//十位缓存写入
x = z%10; //取出个位
hc[1] = DM[x] | 0x80;//个位缓存写入
}
/******************************串口操作函数********************************
void CSH  (void) //初始化串口
{
 
    SCON  = 0x50;         // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    //ES    = 1;                  //打开串口中断
}
void SendByte(unsigned char dat) //发送一个字符
{
 SBUF = dat; //SBUF 串行数据缓冲器
 while(!TI);  //TI发送中断标志位 (当数据发送完毕后由硬件置 1 否则等待硬件置 1)
      TI = 0; 
}
*********************************串口操作函数**************************************/             
void main()
{
unsigned char k,i;
while(1)
{
zh(wd());
for(k=0;k<200;k++)
{
sm();
for(i=0;i<5;i++)
Delay6us();
 
}
 
}
 
}  
关键字:18b20  数码管  显示温度 引用地址:18b20配合数码管显示温度

上一篇:I2C总线协议(AT24c02)程序
下一篇:松翰单片机8p2501的功耗问题

推荐阅读最新更新时间:2024-03-16 14:02

单片机学习之动态数码管
在这里简单的谈谈动态数码管的动态显示。数码管的动态显示其实就是利用了人眼的余辉效应,也就是视觉暂留的效果,在每一个时刻数码管是独立显示。当我们把数码管每一时刻的显示效果连续播放的时候,所呈现给我们的就是一种动态的显示效果。 下叙的一段程序主要实现数码管基于STC89C52RD单片机(一下简称51单片机)中定时器0方式一的动态显示,同时也是做电子时钟的基础程序之一。 51单片机中的定时器0方式一为16位定时器,定时时间=(2^16-T0初值)X 时钟周期 X 12。单片机的时钟周期为晶振的12分频,也就是晶振 X 1/12 。 我们采用12MHz晶振,定时50ms,也就是50000us,50000=(6
[单片机]
单只数码管循环显示0—9
#include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x82,0xf8,0x80,0x90,0xff }; void DelayMS(uint x) { uchar t; while(x--) for(t=120;t 0;t--); } void main() { uchar i=0; P0=0x00; while(1) {
[单片机]
单只<font color='red'>数码管</font>循环<font color='red'>显示</font>0—9
显示温度及时间(能调时闹时)的bascom-avr程序
$regfile = m16def.dat $crystal = 8000000 Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0 Config Lcd = 16 * 2 Config 1wire = Porta.0 '************************************************* Dim Id(8) As Byte Dim I As Byte Dim C(2) As Byte Dim T As Word
[单片机]
基于单片机的AD转换的数码管显示程序
*本例程采用AD0804芯片,硬件电路:cs片选端接P2.3,WR写数据端写P3.6,RD读数据端接P3.7,锁存端接P2.6脚,数码管位选端分别接P3.2 ,P3.3,P3.4,段选端接P1口*/ #include reg52.h //头文件 #define uint unsigned int//宏文件 #define uchar unsigned char//宏文件 uchar num;//变量 void delay3(uint z);//延时定义 void dissy();//延时函数定义 sbit ge=P3^2;//个位定义 sbit shi=P3^3;//十位定义 sbit bai=P3^4;//百位定义 sbit a
[单片机]
51单片机 数码管模块
1.原理图 共阴极和共阳极: 简单来说,如果是共阴极的话,我们想要驱动某一个led灯,就应该给另一端加高电平,共阳极的话就加低电平 数码管显示分两种:静态显示和动态显示; 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动。 动态显示:动态驱动是将所有数码管的8个显示笔划 a,b,c,d,e,f,g,dp 的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控
[单片机]
51单片机 <font color='red'>数码管</font>模块
利用单片机的数码管模拟时钟的显示时间
#include reg52.h #define SEGPORT P0 sbit seg_select = P2^1; sbit bit_select = P2^0; unsigned char duanma = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char weima = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char TempData ; unsigned char shi = 20, fen = 54, miao = 55;
[单片机]
89C51单片机按键控制数码管静态显示0~9
1.proteus仿真图 左边为共阴管,高电平点亮;右边为共阳数码管,低电平点亮 2.keli代码 #include reg51.h sbit key1=P3^0; sbit key2=P3^1; int CC_num ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int CC_I=0,CA_I=0; void delay_ms(int ms) { int i,j; for(i=0;i ms;i++) for(j=0;j 110;j++); } void key1_exam() { if(key1 == 0)
[单片机]
89C51单片机按键控制<font color='red'>数码管</font>静态<font color='red'>显示</font>0~9
51单片机学习之陆 —— 1.5 数码管的动态显示
1 学习回顾,上节课学习了静态显示    我们显示了第一位数码管,并让其显示了8    现在我们试着多一些花样   1 点亮所有数码管让其显示6     编程     代码          注意上面已经写好了函数leddata     P0 = ox00;让所有数码管都打开     P0 = leddata ;让数码管显示三     这时就达成了我们的目的了   2 让数码管从0到9循环显示间隔500毫秒     编程     代码:      #include reg52.h // 52系列单片机头文件 2 #define uint unsigned int 3 #define uchar unsigned char
[单片机]
51单片机学习之陆 —— 1.5 <font color='red'>数码管</font>的动态<font color='red'>显示</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved