基于蓝桥杯单片机的温度与时钟基础显示 您所在的位置:网站首页 蓝桥杯ds18b20数码管不显示 基于蓝桥杯单片机的温度与时钟基础显示

基于蓝桥杯单片机的温度与时钟基础显示

2024-06-03 07:18| 来源: 网络整理| 查看: 265

在蓝桥杯单片机中ds1302和ds18b20作为两个常考的模块其基础的应用十分重要。

这种写法适合c语言基础较为薄弱的同学。前面为讲解,后面为例程代码。

先看ds18b20

首先,通过官方给出的驱动,我们首先需要将#include 的头文件换成蓝桥杯单片机的

#include 的头文件,由于蓝桥杯单片机的运行环境是51的12倍,故我们需要将单总线延时函数扩大12倍。

改为

由于蓝桥杯单片机上只有一个ds18b20,通过手册,如图

我们可以知道温度转换的过程,可以将温度转化的函数补充完整。

此时读出的温度是十六进制数,我们需要将其转化为十进制数方便显示。

DS18B20的分辨率为0.0625。读出数据为正温度时,将LSB和MSB整合成的16位整数,直接乘以0.0625即可。读出数据为负温度时,则需要将LSB和MSB整合成的16位整数,取反加1后,再乘以0.0625。

保留两位小数---*0.0625

保留一位小数---*0.625

保留整数---*6.25

2.时钟(ds1302)

通过官方给出的驱动,我们首先需要将#include 的头文件换成蓝桥杯单片机的

#include 的头文件.

通过ds1302的手册

首先补充时钟读取函数

通过for循环不断对时分秒年月日星期去读取。

补充时钟设置函数

除了正常操作以外设置时钟时还需要先关闭写保护

ds1302的使用

首先需要在主函数中定义一个数组存储当前的时间

因为ds1302中时间是以二进制的形式存在的,所以数组里的时间也是以二进制的形式存在的。

然后在主函数中调用设置时钟函数,将数组中的时间存入ds1302中,完成时钟的初始化。

最后调用读取函数,读取ds1302中的时间,并将其转化为十进制,在数码管上显示。

下面是具体的应用,通过读取·ds18b20,ds1302,完成温度,时分秒,年月日的界面显示,并且界面3秒自动切换。

main.c

#include #include /*************头文件的调用***********************/ #include "ds1302.h" #include "onewire.h" #define uc unsigned char #define ui unsigned int /****************时间时间的存放***********/ uc tac[7]={0x50,0x35,0x11,0x16,0x03,0x04,0x23}; /***********打开所需要的通道*********/ #define COM(X) {P0 = X; P2 = (P2 & 0x1F | 0xC0); P2 &= 0x1F;} #define SEG(X) {P0 = X; P2 = (P2 & 0x1F | 0xE0); P2 &= 0x1F;} #define BUZ(X) {P0 = X; P2 = (P2 & 0x1F | 0xA0); P2 &= 0x1F;} #define LED(X) {P0 = X; P2 = (P2 & 0x1F | 0x80); P2 &= 0x1F;} /***********数码管显示数组********************/ uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x8e,0x8C,0xC1,0x86,0xbf,0x88};//0-9,C,F,P,U,E,- //10-C //11-F //12-P //13-U //14-E //15-- /*************界面切换时的变量***********/ xdata uc k; xdata ui count; /**************延时函数*************/ void Delay100us() //@12.000MHz { unsigned char i, j; i = 2; j = 39; do { while (--j); } while (--i); } void Delay750ms() //@12.000MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 35; j = 51; k = 182; do { do { while (--k); } while (--j); } while (--i); } /*************数码管显示函数******************/ void OutputSMG(uc gqb,uc yxl) { uc i; for(i=0;i>4)*10+(tac[1]&0X0F);//十六进制转十进制 M=(tac[0]>>4)*10+(tac[0]&0X0F);//十六进制转十进制 OutputSMG(0,tab[S/10]); OutputSMG(1,tab[S%10]); OutputSMG(2,tab[15]);//- OutputSMG(3,tab[F/10]); OutputSMG(4,tab[F%10]); OutputSMG(5,tab[15]);//- OutputSMG(6,tab[M/10]); OutputSMG(7,tab[M%10]); } /*******************年月日显示函数**********/ void smg_RYN() { uc R,Y,N; readtime(tac); R=(tac[3]>>4)*10+(tac[3]&0X0F); Y=(tac[4]>>4)*10+(tac[4]&0X0F); N=(tac[6]>>4)*10+(tac[6]&0X0F); OutputSMG(0,tab[N/10]); OutputSMG(1,tab[N%10]); OutputSMG(2,tab[15]);//- OutputSMG(3,tab[Y/10]); OutputSMG(4,tab[Y%10]); OutputSMG(5,tab[15]);//- OutputSMG(6,tab[R/10]); OutputSMG(7,tab[R%10]); } /*******************温度显示函数**********/ void smg_wd() { ui temp; temp=rd_temperature(); temp=temp*0.625; OutputSMG(5,tab[temp/100]); OutputSMG(6,(tab[temp/10%10]&0x7f)); OutputSMG(7,tab[temp%10]); } /*******************定时器2函数用于界面切换**********/ void Timer2Init(void) //500微秒@12.000MHz { AUXR |= 0x04; //定时器时钟1T模式 T2L = 0x90; //设置定时初值 T2H = 0xE8; //设置定时初值 AUXR |= 0x10; //定时器2开始计时 IE2|=0X04; EA=1; } void tim2()interrupt 12 { count++; if(count==4000) { count=0; k++; if(k>2) {k=0;} } } /************用于消除温度开机时的85显示*************/ void ds18b20_xxx() { Delay750ms(); rd_temperature(); } /*******主函数********/ void main() { LED(0XFF); BUZ(0X00); ds18b20_xxx(); savetime(tac); Timer2Init(); while(1) { switch(k)//界面切换 { case 0:smg_RYN();break;//年月日 case 1:smg_wd();break;//温度 case 2:smg_SFM();break;//时分秒 } } }

ds18b20.c

/* 程序说明: 单总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机 日 期: 2011-8-9 */ #include "onewire.h" sbit DQ = P1^4; //单总线接口 //单总线延时函数 void Delay_OneWire(unsigned int t) //扩大12倍 { unsigned int i; while(t--) {for(i=0;i= 1; } Delay_OneWire(5); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } //DS18B20设备初始化 bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } unsigned int rd_temperature(void)//自己补的温度读取函数 { unsigned int H,L; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); Delay_OneWire(80); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); L=Read_DS18B20(); H=Read_DS18B20(); return (H=1; if(SDA) temp|=0x80; SCK=1; } RST=0; _nop_(); SCK=0; _nop_(); SCK=1; _nop_(); SDA=0; _nop_(); SDA=1; _nop_(); return (temp); } void readtime(unsigned char *time) { unsigned char i=0; unsigned char dat=0x81; for (i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有