单片机C语言模块化编程之数码管显示电子万年历篇_精品文档.doc
《单片机C语言模块化编程之数码管显示电子万年历篇_精品文档.doc》由会员分享,可在线阅读,更多相关《单片机C语言模块化编程之数码管显示电子万年历篇_精品文档.doc(13页珍藏版)》请在冰豆网上搜索。
数码管显示模块化显示电子万年历
数码管共阳极7407驱动共阴极max7221/7419驱动
Ds1302实时时间显示
Ds18b20温度显示芯片
/*delay.h*/
#ifndef_DELAY_H
#define_DELAY_H_
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uintxms);//秒级延时
voiddelayms(uintxms); //毫秒级延时,不可以更改,若更改,DS18B20将显示异常
#endif
/*delay.c*/
#include"delay.h"
voiddelay(uintxms)
{
uinti;
ucharj;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddelayms(uintxms) //毫秒级别延时
{
while(xms--);
}
/*ds1302.h*/
#ifndef_DS1302_H_
#define_DS1302_H_
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitIO=P1^0;//ds1302跟单片机接口
sbitSCLK=P1^1;
sbitRST=P1^2;
externunsignedchardatetime[7];//存储获得的时间值
externvoidgettime(); //读取时间值函数
#endif
/*ds1302.c*/
#include
#include"ds1302.h"
uchardatetime[7]={0,0,0,0,0,0,0};//用来接收获得的时间值
voidwrite_a_byte_to_ds1302(ucharX)
{
uchari;
for(i=0;i<8;i++)
{
IO=X&0X01;
SCLK=1;
SCLK=0;
X>>=1;
}
}
ucharget_a_byte_from_ds1302()
{
uchari,b=0x00;
for(i=0;i<8;i++)
{
b|=_crol_((uchar)IO,i);
SCLK=1;
SCLK=0;
}
//returnb/16*10+b%16;//返回的BCD码转换为十进制
return(b>>4)*10+(b&0x0f);//注意运算的优先级
}
ucharread_data(ucharadd)
{
uchardat;
RST=0;
SCLK=0;
RST=1;
write_a_byte_to_ds1302(add);
dat=get_a_byte_from_ds1302();
SCLK=1;
RST=0;
returndat;
}
voidgettime() //ds1302读取当前时间存储在datetime中
{
uchari,add=0x81;
for(i=0;i<7;i++)
{
datetime[i]=read_data(add);
add+=2;
}
}
/*max7221.h*/
#ifndef_MAX7221_H_ //注:
Max7221只能用来驱动共阴数码管,对共阳的没效
#define_MAX7221_H_
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitDIN=P2^0; //max7221与单片机接口DIN..CSB..CLK..
sbitCSB=P2^1;
sbitCLK=P2^2;
sbitDIN1=P2^3;
sbitCSB1=P2^4;
sbitCLK1=P2^5;
externvoidwrite(unsignedcharaddr,unsignedchardat); //max7221写数据,转换数据函数,num的值为1,或者2,当num为1时,片选的是第一块Max7221,同理亦然。
externvoidwrite1(ucharaddr,uchardat);
externvoidinit(); //max7221初始化
externvoidinit1();
#endif
/*max7221.c*/
#include"max7221.h"
#include
voidwrite(ucharaddr,uchardat)// 写数据,写地址函数
{
uchari;
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;
dat<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
CSB=1;
}
voidwrite1(ucharaddr,uchardat)
{
uchari;
CSB1=0;
for(i=0;i<8;i++)
{
CLK1=0;
addr<<=1;
DIN1=CY;
CLK1=1;
_nop_();
_nop_();
CLK1=0;
}
for(i=0;i<8;i++)
{
CLK1=0;
dat<<=1;
DIN1=CY;
CLK1=1;
_nop_();
_nop_();
CLK1=0;
}
CSB1=1;
}
voidinit()
{
write(0x09,0xff);//编码模式地址0x09,0x00-0xff,为1的则位选通
write(0x0a,0x07);//亮度地址0x0a,0x00-0x0f,0x0f时最亮
write(0x0b,0x07);//扫描数码管个数地址0x0c,最多扫描8只数码管
write(0x0c,0x01);//工作模式地址0x0c0x00:
关闭;0x01:
正常
}
voidinit1()
{
write1(0x09,0xff);
write1(0x0a,0x07);
write1(0x0b,0x07);
write1(0x0c,0x01);
}
/*ds18b20.h*/
#ifndef_DS18B20_H
#define_DS18B20_H
#include
#include"delay.h"
#include
#defineNOP(){_nop_(),_nop_(),_nop_(),_nop_()}
sbitDQ=P1^3;//DS18B20控制线,单线模式。
externbitng;//正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
externbitDS18B20_IS_OK; //为1时表示当前读取温度正常,否则读取失败。
externucharDisplay_Digit[4]; //读取的温度值转换后存在这个数组中
externvoidRead_Temperature();//读取当前温度值
externvoidProcess_Temperature(); //处理当前获得的温度值,正数,负数等。
#endif
/*ds18b20.c*/
#include"ds18b20.h"
//温度字符
ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
//温度小数对照表
ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
ucharCurrentT=0;//当前读取的温度整数部分
ucharTemp_Value[]={0x00,0x00};//从DS18B20读取的温度值
bitng=0; //正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
bitDS18B20_IS_OK=1; //为1时表示当前读取温度正常,否则读取失败。
ucharDisplay_Digit[4]={0,0,0,0};//读取的温度值转换后存在这个数组中
//-------------------------------------------------------
//初始化DS18B20
//-------------------------------------------------------
ucharInit_DS18B20()
{
ucharstatus;
DQ=1;delayms(8);DQ=0;delayms(90);DQ=1;delayms(8);
status=DQ;delayms(100);
DQ=1;
returnstatus;
}
//-------------------------------------------------------
//读一字节
//-------------------------------------------------------
ucharReadOneByte()
{
uchari,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
if(DQ)dat|=0x80;
delayms(30);
DQ=1;
}
returndat;
}
//-------------------------------------------------------
//写一字节
//-------------------------------------------------------
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=