stc15f104e单片机+max7219+ds18B02数码管温度显示

发布者:WhisperingWave最新更新时间:2020-08-18 来源: 51hei关键字:stc15f104e  单片机  max7219  ds18B02  数码管温度显示 手机看文章 扫描二维码
随时随地手机看文章

成品

成品

电路图

电路图

PCB 图

PCB 图


CAD 外壳

CAD 外壳

热转印制PCB板

热转印制PCB板

显微镜改台钻打洞

显微镜改台钻打洞

元件电路板

元件电路板

运行程序  15f104e是1T运行速度,晶体速度11.0529M 使用12T芯片延时降低10倍 #include

#include

#define uchar unsigned char

bit flag1s = 0; //1s 定时标志

unsigned char T0RH = 0; //T0 重载值的高字节

unsigned char T0RL = 0; //T0 重载值的低字节

void ConfigTimer0(unsigned int ms);

unsigned char code disp1[]={0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb};        //数字带点

unsigned char code disp2[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};        //数字不带点  

unsigned char code disp3[]={0x0};  //不显示

unsigned char code disp4[]={0x4f};  //显示E

unsigned char code disp5[]={0x01};  //显示-


sbit Max7219_pinCLK = P3^2;

sbit Max7219_pinCS  = P3^5;

sbit Max7219_pinDIN = P3^4;

sbit IO_18B20 = P3^3; //DS18B20 通信引脚


/* 软件延时函数,延时时间(t*10)us */

void DelayX10us(unsigned char t)

{

   do {

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

      }

          while (--t);

}


//向MAX7219(U3)写入字节

void Write_Max7219_byte(uchar DATA)         

{

            uchar i;   

                Max7219_pinCS=0;                                //CS=0有效,CS=1锁存       

            for(i=8;i>=1;i--)

          {                  

            Max7219_pinCLK=0;

            Max7219_pinDIN=DATA&0x80; //&10000000, 编译器对位操作的理解:非0即为1

            DATA=DATA<<1;

            Max7219_pinCLK=1;                //上升沿把数据送出去

          }                                 

}


/*向M第一片MAX7219写入数据*/

void Write_Max7219(uchar add1,uchar dat1)

{

     Max7219_pinCS=0;

         Write_Max7219_byte(add1);           //写入地址,即数码管编号

     Write_Max7219_byte(dat1);               //写入数据,即数码管显示数字

         Max7219_pinCS=1;                        

}


/*初始化芯片*/

void Init_MAX7219(void)

{

Write_Max7219(0x09, 0x00);       //译码方式:BCD码

Write_Max7219(0x0a, 0x03);       //亮度

Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示

Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1

Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0

Write_Max7219(1,disp3[0]);

Write_Max7219(2,disp3[0]);

Write_Max7219(3,disp3[0]);

Write_Max7219(4,disp3[0]);

}


/* 复位总线,获取存在脉冲,以启动一次读写操作 */

bit Get18B20Ack()

{

   bit ack;

   EA = 0; //禁止总中断

   IO_18B20 = 0; //产生 500us 复位脉冲

   DelayX10us(500);//50

   IO_18B20 = 1;

   DelayX10us(60); //延时 60us 6

   ack = IO_18B20; //读取存在脉冲

   while(!IO_18B20); //等待存在脉冲结束

   EA = 1; //重新使能总中断

   return ack;

}


/* 向 DS18B20 写入一个字节,dat-待写入字节 */

void Write18B20(unsigned char dat)

{

   unsigned char mask;

   EA = 0; //禁止总中断

   for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 个 bit

   {

      IO_18B20 = 0; //产生 2us 低电平脉冲

      _nop_();

      _nop_();

      if ((mask&dat) == 0) //输出该 bit 值

         IO_18B20 = 0;

      else

         IO_18B20 = 1;

      DelayX10us(60); //延时 60us

      IO_18B20 = 1; //拉高通信引脚

   }

   EA = 1; //重新使能总中断

}


/* 从 DS18B20 读取一个字节,返回值-读到的字节 */

unsigned char Read18B20()

{

   unsigned char dat;

   unsigned char mask;

   EA = 0; //禁止总中断

   for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次采集 8 个 bit

   {

      IO_18B20 = 0; //产生 2us 低电平脉冲

      _nop_();

      _nop_();

      IO_18B20 = 1; //结束低电平脉冲,等待 18B20 输出数据

      _nop_(); //延时 2us

      _nop_();

      if (!IO_18B20) //读取通信引脚上的值

         dat &= ~mask;

      else

         dat |= mask;

      DelayX10us(60); //再延时 60us

   }

      EA = 1; //重新使能总中断

      return dat;

}


/* 启动一次 18B20 温度转换,返回值-表示是否启动成功 */

bit Start18B20()

{

   bit ack;

   ack = Get18B20Ack(); //执行总线复位,并获取 18B20 应答

   if (ack == 0) //如 18B20 正确应答,则启动一次转换

   {

      Write18B20(0xCC); //跳过 ROM 操作

      Write18B20(0x44); //启动一次温度转换

   }

   return ~ack; //ack==0 表示操作成功,所以返回值对其取反

}


/* 读取 DS18B20 转换的温度值,返回值-表示是否读取成功 */

bit Get18B20Temp(int *temp)

{

   bit ack;

   unsigned char LSB, MSB; //16bit 温度值的低字节和高字节

   ack = Get18B20Ack(); //执行总线复位,并获取 18B20 应答

   if (ack == 0) //如 18B20 正确应答,则读取温度值

   {

      Write18B20(0xCC); //跳过 ROM 操作

      Write18B20(0xBE); //发送读命令

      LSB = Read18B20(); //读温度值的低字节

      MSB = Read18B20(); //读温度值的高字节

      *temp = ((int)MSB << 8) + LSB; //合成为 16bit 整型数

   }

     return ~ack; //ack==0 表示操作应答,所以返回值为其取反值

}


/*****************************main.c 文件程序源代码******************************/

void main()

{

   bit res;

   int temp; //读取到的当前温度值

  // int intT, decT; //温度值的整数和小数部分

   unsigned char qian,bai,shi,ge;

   float tp;

   Init_MAX7219();  

   EA = 1; //开总中断

   ConfigTimer0(10); //T0 定时 10ms

   Start18B20(); //启动 DS18B20

   while (1)

   {

      if (flag1s) //每秒更新一次温度

      {

         flag1s = 0;

         res = Get18B20Temp(&temp); //读取当前温度

         if (res) //读取成功时,刷新当前温度显示

         {

                if(temp< 0)                                                 //温度低于0度

                  {               

                       temp=temp-1;

                       temp=~temp;

                       tp=temp;

                       temp=tp*0.0625*100+0.5;

                           qian = temp % 10000 / 1000;

                   bai = temp % 1000 / 100;

                   shi = temp % 100 / 10;

                   ge = temp % 10;

                           Write_Max7219(1,disp5[0]);          // 显示 "-"

                           Write_Max7219(2,disp2[qian]);

                           Write_Max7219(3,disp1[bai]);

                           Write_Max7219(4,disp2[shi]);                                  

                  }

                  else                                                        // 温度大于0度

                  {                       

                   tp=temp;

                   temp=tp*0.0625*100+0.5;

                           qian = temp % 10000 / 1000;

                   bai = temp % 1000 / 100;

                   shi = temp % 100 / 10;

                   ge = temp % 10;

                           if(qian>0)                                        // 温度10度显示十位

                           {

                              Write_Max7219(1,disp2[qian]);

[1] [2]
关键字:stc15f104e  单片机  max7219  ds18B02  数码管温度显示 引用地址:stc15f104e单片机+max7219+ds18B02数码管温度显示

上一篇:基于STC15F2K60S2的内部AD转换程序(1602显示)
下一篇:stc12c5a60s2单片机用自带ADC采集电压源程序

推荐阅读最新更新时间:2024-11-16 21:05

基于STM8L15xxx设计的超低功耗8位MCU开发方案
ST公司的STM8L15xxx是超低功耗8位MCU系列,采用先进的STM8内核,动态功耗为192 μA/MHZ,16MHz CPU时钟的性能高达16 MIPS, 工作电压从1.8 V 到3.6 V (低至1.65 V ),多达32KB嵌入闪存程序存储器,主要用在医疗和手提设备,PC外设,游戏机,GPS,告警系统,有线和无线传感器.本文介绍了STM8L15xxx主要特性,方框图, 时钟树框图和超低功耗STM8L15LPBOARD演示板主要特性,详细电路图. The STM8L15xxx devices are members of the STM8L Ultralow power 8-bit family. They are ref
[单片机]
基于STM8L15xxx设计的超低功耗8位<font color='red'>MCU</font>开发方案
基于单片机PID算法控制电机转速设计
#include reg52.h #include lcd1602.h sfr T2MOD = 0x0c9; #define uchar unsigned char #define uint unsigned int sbit Q0 = P2^4; sbit Q1 = P2^5; sbit Q2 = P2^6; sbit Q3 = P2^7; sbit GORB = P1^6; //换相 sbit PWM = P1^7; sbit UP = P1^0; sbit DOWM = P1^1; sbit ADDSPEED = P1^2; sbit SUBSPEED = P1^3; uint tuint = 65535
[单片机]
基于<font color='red'>单片机</font>PID算法控制电机转速设计
[单片机框架][bsp层][cx32l003][bsp_key] KEY配置和使用
按键的基本原理是设置单片机IO口(PB0-PB3)为输入状态,如DDRB = 0XF0(方向寄存器,“1”为输出,“0”为输入); 单片机一直检测按键端口(PB0-PB3)的状态,当端口为低电平时(即按键按下),实行相应的动作(比如控制LED灯)。 原理就是这么回事,但是正真实现时,按键会有抖动,要进行按键去抖,下图为按键按下时的抖动图。 按键实行一个动作过程是需要一定时间的,一般为100mS-1S左右,而一个单片机执行一个机器周期的时间很短,时钟为10MH的周期为0.1μs,这样按键每一次动作程序就会多次检测按键,出现误判(一次按下,多次动作)。 /********************************
[单片机]
学习STM32总结的单片机(msp430,c8051等)一般学习方法
1,一块板子有必须的供电线,和必要的仿真下载调试线(如STM32的J-link) 2,安装开发环境:keil4(c51或者ARM系列注册),好像还有msp430系列首先清楚板子是什么系列,IAR EWARM是(IAR System公司开发的ARM系列环境) 3,安装驱动:软件里的各种驱动 4,在开发环境里配置选择DEVICE设备(注册不同的系列有很多不同的设备),选择下载调试驱动 (1)创建新工程,保存文件夹a (2)创建新文件(参照一下文件规范化),保存在a里,或者拷贝已有的配套文件 (3)把文件添加到工程 5,单片机有配套的中文资料,文件,和实例程序 6,对照中文资料,看懂配套文
[单片机]
恩智浦为8位微控制器家族再添新成员
  恩智浦半导体(NXP Semiconductors)近日宣布再推新品——LPC97x和LPC98x微控制器,将为目前的8位微控制器市场提供更多性能优越的产品选择。LPC97x和LPC98x控制器提供了多达5个16位定时器/计数器,同时配备有16位的可读实时时钟和强健的掉电检测。采用宽电压(2.4V-5.5V)操作范围的恩智浦新款8位微控制器新品,比窄电压的同级别产品性能更高、更具性价比,结构也愈加简洁、紧凑,能够实现更佳的小型微控制器系统控制。   利用其高性能、低成本的优势,集成了电机控制、PWM设计和先进电源管理功能的LPC97x和LPC98x将会是工业、医疗、通讯、测试、汽车电子和消费电子应用,诸如安防、门禁、遥控、
[单片机]
单片机入门:新手如何学习单片机
作为一个初学者,如何单片机入门? 知识上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。一般的大学毕业生都可以了,自学过这2门课程的高中生也够条件。设备上,一般是建议购买一个仿真器,例如,目前的“双功能下载线”就具有良好的稳定性和较快的下载速度,上位机可扩展,可以下载更多的单片机及嵌入式芯片。通过实验,这样才可以进行实际的,全面的学习。日后在工作上,仿真器也大有用处。还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板,如图,即为,单片机最小系统。 学习板以强大的接口为主,单片机的学习分两方面,一方面是单片机的原理及内部结构,另一方面是单片机的接口技术。这些都是需要平时多积累,多动手,多思考,这样
[单片机]
如何采用Arduino系统板进行单片机编程
用Arduino编程具有简单易学的特点,但要配合Arduino控制板使用,使得成本比较高,体积也大,而且除单片机电路以外的大部分电路只在编程时有用,在电子制作上使用后就是多余的了,造成了浪费。能不能不用Arduino控制板,直接想办法用Arduino给单片机编程呢?答案是肯定的,只要做一个Arduino最小系统板,配合ISP下载线USBtinyISP或USBasp 就可以给AVR单片机下载程序了,Arduino最小系统板有一个锁紧座,方便单片机插上和取下,下载好程序的单片机就可以取下装到目标板上去使用了。 Arduino最小系统板电路见下图,适用于对ATmega8、ATmega168、ATmega328等型号的单片机编程。
[单片机]
如何采用Arduino系统板进行<font color='red'>单片机</font>编程
基于单片机设计康复仪的方法及其应用
  1. 引言   人类的 平衡能力 是人能够进行各种运动的基础,人的站立、坐卧、行走都需要有 平衡能力 。一旦人的 平衡能力 有障碍,则人的行动能力就受制约,给学习、生活带来极大的不便。在现代化的社会,人口老龄化问题突出,老年人因某种疾病而导致脑损伤引起 平衡能力 降低,行动能力受阻。因此,在临床治疗中,需要一种能对平衡功能检验的设备。我校在上海瑞金医院的协作下,在分析了国际、国内有关资料的基础上,应用先进的计算机控制技术研制成功了多功能的人体平衡 康复仪 。使用该仪器可以客观、定量地进行平衡功能的测试、分析和训练,可以地进行 平衡能力 的 静态测试 和 动态训练 。为临床研究提供了有效的手段。   2.仪器功能   ·
[医疗电子]
基于<font color='red'>单片机</font>设计康复仪的方法及其应用
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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