《单片机C语言模块化编程之数码管显示电子万年历篇》由会员分享,可在线阅读,更多相关《单片机C语言模块化编程之数码管显示电子万年历篇(13页珍藏版)》请在金锄头文库上搜索。
1、数码管显示模块化显示电子万年历数码管 共阳极7407驱动 共阴极max7221/7419驱动Ds1302 实时时间显示Ds18b20 温度显示芯片/*delay.h*/#ifndef _DELAY_H#define _DELAY_H_#define uint unsigned int #define uchar unsigned char void delay(uint xms); /秒级延时void delayms(uint xms); /毫秒级延时,不可以更改,若更改,DS18B20将显示异常#endif/*delay.c*/#include delay.hvoid delay(uint
2、xms)uint i;uchar j;for(i=xms;i0;i-)for(j=110;j0;j-);void delayms(uint xms) /毫秒级别延时while(xms-);/*ds1302.h*/#ifndef _DS1302_H_#define _DS1302_H_#include #define uint unsigned int #define uchar unsigned charsbit IO=P10; /ds1302跟单片机接口sbit SCLK=P11;sbit RST=P12;extern unsigned char datetime7; /存储获得的时间值ex
3、tern void gettime();/读取时间值函数#endif/*ds1302.c*/#include #include ds1302.h uchar datetime7=0,0,0,0,0,0,0; /用来接收获得的时间值 void write_a_byte_to_ds1302(uchar X) uchar i; for(i=0;i=1; uchar get_a_byte_from_ds1302() uchar i,b=0x00; for(i=0;i4)*10+(b&0x0f); /注意运算的优先级 uchar read_data(uchar add) uchar dat; RST=0
4、; SCLK=0; RST=1; write_a_byte_to_ds1302(add); dat=get_a_byte_from_ds1302(); SCLK=1; RST=0; return dat; void gettime() /ds1302读取当前时间存储在datetime中 uchar i,add=0x81; for(i=0;i7;i+) datetimei=read_data(add); add+=2; /*max7221.h*/#ifndef _MAX7221_H_ /注:Max7221只能用来驱动共阴数码管,对共阳的没效#define _MAX7221_H_#include
5、#define uint unsigned int #define uchar unsigned charsbit DIN=P20;/max7221与单片机接口 DIN.CSB.CLK.sbit CSB=P21;sbit CLK=P22;sbit DIN1=P23;sbit CSB1=P24;sbit CLK1=P25;extern void write(unsigned char addr , unsigned char dat);/max7221写数据,转换数据函数 ,num的值为1,或者2,当num为1时,片选的是第一块Max7221,同理亦然。extern void write1(uc
6、har addr,uchar dat);extern void init(); /max7221初始化extern void init1();#endif/*max7221.c*/#include max7221.h#include void write(uchar addr,uchar dat) /写数据,写地址函数uchar i;CSB=0;for(i=0;i8;i+)CLK=0;addr=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;for(i=0;i8;i+)CLK=0;dat=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;CSB
7、=1;void write1(uchar addr,uchar dat)uchar i;CSB1=0;for(i=0;i8;i+)CLK1=0;addr=1;DIN1=CY;CLK1=1;_nop_();_nop_();CLK1=0;for(i=0;i8;i+)CLK1=0;dat=1;DIN1=CY;CLK1=1;_nop_();_nop_();CLK1=0;CSB1=1;void init() write(0x09,0xff); /编码模式地址0x09 , 0x00-0xff,为1的则位选通write(0x0a,0x07); /亮度地址0x0a ,0x00-0x0f,0x0f时最亮writ
8、e(0x0b,0x07); /扫描数码管个数地址0x0c,最多扫描8只数码管write(0x0c,0x01); /工作模式地址0x0c 0x00:关闭;0x01:正常void init1()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 #define NOP() _nop_(),_nop_(),_nop_(),_nop_()sbit
9、DQ=P13; /DS18B20控制线,单线模式。extern bit ng; /正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,extern bit DS18B20_IS_OK;/为1时表示当前读取温度正常,否则读取失败。extern uchar Display_Digit4; /读取的温度值转换后存在这个数组中extern void Read_Temperature(); /读取当前温度值extern void Process_Temperature(); /处理当前获得的温度值,正数,负数等。#endif/*ds18b20.c*/#include ds18b20.h/
10、温度字符uchar code Temperature_Char8 = 0x0c,0x12,0x12,0x0c,0x00,0x00, 0x00,0x00;/温度小数对照表uchar code df_Table = 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 ;uchar CurrentT = 0 ; /当前读取的温度整数部分uchar Temp_Value = 0x00,0x00; /从DS18B20读取的温度值bit ng=0; /正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,bit DS18B20_IS_OK=1; /为1时表示当前读取温度正常,否则
11、读取失败。uchar Display_Digit4=0,0,0,0; /读取的温度值转换后存在这个数组中/-/ 初始化DS18B20/-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;/-/读一字节/-uchar ReadOneByte() uchar i, dat = 0; DQ = 1; _nop_(); for (i = 0; i = 1; DQ = 1; _nop_();_nop_(); if(DQ) dat |= 0x80; delayms(30); DQ = 1; return dat;/-/ 写一字节/-void WriteOneByte(uchar dat) uchar i ; for (i = 0; i 8; i+) DQ =