当前位置:文档之家› 数码管模块化显示电子万年历

数码管模块化显示电子万年历

uchar Init_DS18B20()
{
uchar status;
DQ = 1; delayms(8); DQ = 0 ; delayms(90); DQ = 1; delayms(8);
status = DQ; delayms(100);
DQ = 1;
return status;
}
//-------------------------------------------------------
extern void write1(uchar addr,uchar dat);
extern void init();//7221初始化
extern void init1();
#endif
/*max7221.c*/
#include "max7221.h"
#include <intrins.h>
uchar CurrentT = 0 ; //当前读取的温度整数部分
uchar Temp_Value[] = {0x00,0x00}; //从DS18B20读取的温度值
bit ng=0;//正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
bit DS18B20_IS_OK=1;//为1时表示当前读取温度正常,否则读取失败。
//----------------------------------------------------------------
void Process_Temperature()
{
// uchar i;
//延时值与负数标识
// uchar ng = 0;
//高5位全为1(0)则为负数,为负数时取反加1,并设置负数标识
Temp_Value[1] = ReadOneByte(); //温度高8位
DS18B20_IS_OK = 1;
}
}
//----------------------------------------------------------------
//对读取的温度值进行判断,处理,负数的情况,整数情况
#define NOP() {_nop_(),_nop_(),_nop_(),_nop_()}
sbit DQ=P1^3; //DS18B20控制线,单线模式。
extern bit ng; //正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
extern bit DS18B20_IS_OK;//为1时表示当前读取温度正常,否则读取失败。
uchar Display_Digit[4]={0,0,0,0}; //读取的温度值转换后存在这个数组中
//-------------------------------------------------------
//初始化DS18B20
//-------------------------------------------------------
dat<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
CSB=1;
}
void write1(uchar addr,uchar dat)
{
uchar i;
CSB1=0;
for(i=0;i<8;i++)
{
CLK1=0;
addr<<=1;
DIN1=CY;
CLK1=1;
_nop_();
void WriteOneByte(uchar dat)
{
uchar i ;
for (i = 0; i < 8; i++)
{
DQ = 0 ; DQ = dat & 0x01 ; delayms(5); DQ = 1; dat>>=1;
}
}
//----------------------------------------------------------------
SCLK=1;
RST=0;
return dat;
}
void gettime()//ds1302读取当前时间存储在datetime中
{
uchar i,add=0x81;
for(i=0;i<7;i++)
{
datetime[i]=read_data(add);
add+=2;
}
}
/*max7221.h*/
#ifndef _MAX7221_H_//注:Max7221只能用来驱动共阴数码管,对共阳的没效
数码管显示模块化显示电子万年历
数码管共阳极7407驱动共阴极max7221/7419驱动
Ds1302实时时间显示
Ds18b20温度显示芯片
/*delay.h*/
#ifndef _DELAY_H
#define _DELAY_H_
#define uint unsigned int
#define uchar unsigned char
write(0x0a,0x07); //亮度地址0x0a,0x00-0x0f,0x0f时最亮
write(0x0b,0x07); //扫描数码管个数地址0x0c,最多扫描8只数码管
write(0x0c,0x01); //工作模式地址0x0c0x00:关闭;0x01:正常
}
void init1()
{
write1(0x09,0xff);
#define uchar unsigned char
sbit IO=P1^0; //ds1302跟单片机接口
sbit SCLK=P1^1;
sbit RST=P1^2;
extern unsigned char datetime[7]; //存储获得的时间值
extern void gettime();//读取时间值函数
{
IO=X&0X01;
SCLK=1;
SCLK=0;
X>>=1;
}
}
uchar get_a_byte_from_ds1302()
{
uchar i,b=0x00;
for(i=0;i<8;i++)
{
b|=_crol_((uchar )IO,i);
SCLK=1;
SCLK=0;
}
//return b/16*10+b%16; //返回的BCD码转换为十进制
write1(0x0a,0x07);
write1(0x0b,0x07);
write1(0x0c,0x01);
}
/*ds18b20.h*/
#ifndef _DS18B20_H
#define _DS18B20_H
#include <reg51.h>
#include "delay.h"
#include <intrins.h>
else
{
WriteOneByte(0xCC); //跳过序列号
WriteOneByte(0x44); //启动温度转换
Init_DS18B20();
WriteOneByte(0xCC); //跳过序列号
WriteOneByte(0xBE); //读取温度寄存器
Temp_Value[0] =ReadOneByte(); //温度低8位
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void delayms(uint xms)//毫秒级别延时
{
while(xms--);
}
/*ds1302.h*/
#ifndef _DS1302_H_
#define_DS1302_H_
#include <reg51.h>
#define uint unsigned int
void write(uchar addr,uchar dat) //写数据,写地址函数
{
uchar i;
CSB=0;
for(i=0;i<8;i++)
{
CLK=0;
addr<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
for(i=0;i<8;i++)
{
CLK=0;
//读一字节
//-------------------------------------------------------
uchar ReadOneByte()
{
uchar i, dat = 0;
DQ = 1; _nop_();
for (i = 0; i < 8; i++)
{
DQ = 0; dat >>= 1; DQ = 1; _nop_();_nop_();
extern uchar Display_Digit[4];//读取的温度值转换后存在这个数组中
externvoid Read_Temperature(); //读取当前温度值
extern void Process_Temperature();//处理当前获得的温度值,正数,负数等。
#endif
/*ds18b20.c*/
if(DQ) dat |= 0x80;
delayms(30);
DQ = 1;
}
return dat;
}
相关主题