51单片机+18B20显示程序+74HC164扩展显示数码管

2018-01-12 21:06:19编辑:什么鱼 关键字:51单片机  18B20  74HC164  数码管

51 单片机 +18B20显示程序+74HC164扩展显示数码管

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

#define  uint  unsigned int


//================18b20数据口定义===============
uint  temp;                     // 定义一个16位变量用于COPY数据 
sbit  DQ = P2^6; 
char flash,presence;
uint temp1,temp2;               //读出温度暂放
uchar s1,s2,s3,s4;              //显示单元数据,共6个数据和一个运算暂用
//=======164端口定义==========
sbit ge=P2^5;    //个位
sbit shi=P2^4;   //十位
sbit bai=P2^3;   //百位
sbit qian=P2^2;  //千位
sbit clk=P2^1;   //164时钟线
sbit data1=P2^0; //164数据线
sbit a0=ACC^0;   //累加器

uchar code LED[10]={        //不带小数点的代码表
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};
uchar code led1[10]={       //带小数点的代码表
0x40,0x79,0x24,0x30,0x19,
0x12,0x2,0x78,0x0,0x10,};
//======164数据转换程序=======
void chuanshu164(uchar data_buf)
{
  uchar i;
  ACC=data_buf;      //数据送累加器
  for(i=8;i>0;i--)
  {
  clk=0;
      data1=a0;
      clk=1;
      ACC=ACC>>1;
  }
      clk=0;
}

/*****************延时函数*************************/
void delay(uint t)
{
  for (;t>0;t--);
  _nop_();
}
//========显示4位数码管函数===========
void xianshi(uint shu)
{
    uchar ss;
    for(ss=10;ss>0;ss--)
     {
     uint wei1,wei2,wei3,wei4;
     wei1=shu/1000;            //将千位分离
     wei2=shu%1000/100;        //将百位分离
     wei3=shu%100/10;          //将十位分离
     wei4=shu%10;              //将个位分离
 
     chuanshu164(led[wei1]);   //显示第一位数码管
     qian=0;
     delay(200);
     qian=1;
   chuanshu164(led[wei2]);   //显示第二位数码管
     bai=0;
     delay(200);
     bai=1;
 
     chuanshu164(led1[wei3]);   //显示第三位数码管
     shi=0;
     delay(200);
     shi=1;
     chuanshu164(led[wei4]);   //显示第四位数码管
     ge=0;
     delay(200);
     ge=1;
     //}
     }
    
    
}
//=================18b20相关函数开始==============
/****************DS18B20复位函数************************/
ow_reset(void)
{
char presence=1;
 while(presence)
 {
   while(presence)
    {
  DQ=1;_nop_();_nop_();      //从高拉倒低
  DQ=0;                                       
  delay(550);                //550 us
  DQ=1;                                        
  delay(66);                 //66 us
  presence=DQ;               //presence=0 复位成功,继续下一步
    } 
 delay(500);                   //延时500 us
 presence=~DQ;         
 }
DQ=1;                            //拉高电平
}

/****************DS18B20写命令函数************************/
void write_byte(uchar val)               //向1-WIRE 总线上写1个字节

  uchar i;
  for(i=8;i>0;i--)
  {
   DQ=1;_nop_();_nop_();                  //从高拉倒低
   DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
   DQ=val&0x01;                           //最低位移出
   delay(66);                              //66 us
   val=val/2;                             //右移1位
   }
   DQ=1;
   delay(10);
}
//
/****************DS18B20读1字节函数************************/
uchar read_byte(void)  //从总线上取1个字节
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
  DQ=1;_nop_();_nop_();
  value>>=1;
  DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
  DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
  if(DQ)value|=0x80;
  delay(66);                                    //66 us
}
DQ=1;
return(value);
}

/****************读出温度函数************************/
read_temp()
{
  ow_reset();                           //总线复位 
  write_byte(0xcc);                     //发命令
  write_byte(0x44);                     //发转换命令
  ow_reset(); 
  delay(1);
  write_byte(0xcc);                     //发命令
  write_byte(0xbe);
  temp1=read_byte();                    //读温度值的低字节
  temp2=read_byte();                    //读温度值的高字节
  temp=(temp2*256+temp1)*0.625;
  
  return temp;                          //返回温度值
}

//=================18b20相关函数结束==============

//=================主函数=========================
void main(void)

   
   ow_reset();              //开机先转换一次
   write_byte(0xcc);        //Skip ROM
   write_byte(0x44);        //发转换命令

   
   while(1)
   {
   xianshi(read_temp());
   //xianshi(read_temp()); 
   //xianshi(read_temp());

   //delay(500);
     
    }
}


关键字:51单片机  18B20  74HC164  数码管

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018011237333.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:89c51六首歌曲的音乐门铃程序
下一篇:读内部R/C时钟及ID号C语言参考程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机实现LED流水灯(数组方式和位运算方式)

/* 名称:51单片机实现LED流水灯(数组方式和位运算方式)说明:今天又重新开始系统的学习51了,LED就算个开端吧。 要注意两点: 1、sfr和sbit是C语言扩展出来的关键字。其中sfr用于对特殊功能寄存器进行声明,sbit用于对某些特殊功能寄存器的某位进行声明。这里和宏定义很相似,但是不能用宏定义进行替换,对于前者是因为51单片机的寄存器存在于内部空间0x80-0xFF,这空间属于直接寻址,51特殊功能寄存只能直接寻址,不能间接寻址。如果用宏定义的话,在翻译成汇编时就会认为是通过总线访问对应的外部地址了。对于后者,sbit是定义一个标志位,也叫位变量。而类似于#define key1 P3
发表于 2018-07-21 13:08:22

51单片机之按键实验

/* 名称:51单片机之按键实验 说明:键盘是计算机最基础、最重要的输入设备之一。对于键盘来说,其工作任务大体可以分为以下三项: (1)、按键识别。即判断有无按键按下。 (2)、求键值。判断哪个键被按下。 (3)、执行相应的操作。 在这里,实验所用到的键盘为独立键盘和矩阵键盘。对于独立键盘,它的每个按键需要占用一个IO口。一般来说,按键一端接地,另一端接IO口。当按键按下时,线路被导通,IO口被拉低,即状态为‘0’。所以在使用是我们一般把对应IO口置成高电平,然后不断检测此IO口是否被拉低,从而判断按键是否按下。 对于矩阵键盘来说,它用较少的IO口完成较多个按键
发表于 2018-07-21 13:07:26

51单片机之数码管显示实验

/* 名称:51单片机之数码管显示实验 说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。 本实验编写了几个数码管显示的简单程序。在此不做赘述了。*/#include <reg52.h>#define uchar unsigned char//共阳极段码(a在高位,dp在低位
发表于 2018-07-21 13:06:23

关于单片机死机的一些问题

最近的一个项目中测试系统的高低温实验,结果意外的发现经过高低温实验后(80℃到-20摄氏度)单片机有些已经死机了,所以不得不着手研究一下这个问题,在网上查阅资料后,基本上可以归结于以下几个问题:1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象 2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。  3. 地址溢出,常见错误为指针操作
发表于 2018-07-16 20:31:16

单片机外部中断的两种模式

51单片机的外部中断有两种模式:电平触发模式和跳变沿触发模式第一,选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。第二,选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 区别:电平触发模式时,中断标志寄存器不锁存电平中断请求信号。单片机把每个周期的S5P2采样外部中断口的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换言之,就是要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行
发表于 2018-07-16 20:29:36

基于80C51单片机——中断小结

最近看了一下80C51单片机的中断部分的实验,做一些笔记,方便以后学习查找。 首先说一下什么是中断吧,中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设(外部设备)请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去执行相应的服务处理程序;当服务处理程序运行完毕之后,CPU再返回到暂停处继续执行原来的程序。那什么是中断嵌套呢?简单点说就是低优先级的中断可以被高优先级的中断源所中断,等高优先级中断服务程序结束后,再返回去执行被中断的的低优先级的中断服务程序。举个简单的栗子吧(之前写过但不知道怎么删了,,又让我重新编辑):比如我们就是一个CPU,我们当前在洗衣服(当前程序),突然电话铃声响了(中断来了
发表于 2018-07-16 20:26:35

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved