第48节:利用DS1302做一个实时时钟
时间:11-22
来源:互联网
点击:
- //临时中间变量
- unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
- unsigned char ucWd=2;//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
- unsigned char ucPart=0;//本程序的核心变量,局部显示变量。类似于二级菜单的变量。代表显示不同的局部。
- unsigned char ucWd1Update=0; //窗口1更新显示标志
- unsigned char ucWd2Update=1; //窗口2更新显示标志
- unsigned char ucWd1Part1Update=0;//在窗口1中,局部1的更新显示标志
- unsigned char ucWd1Part2Update=0; //在窗口1中,局部2的更新显示标志
- unsigned char ucWd1Part3Update=0; //在窗口1中,局部3的更新显示标志
- unsigned char ucWd2Part1Update=0;//在窗口2中,局部1的更新显示标志
- unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新显示标志
- unsigned char ucWd2Part3Update=0; //在窗口2中,局部3的更新显示标志
- unsigned charucYear=0; //原始数据
- unsigned charucMonth=0;
- unsigned charucDate=0;
- unsigned charucHour=0;
- unsigned charucMinute=0;
- unsigned charucSecond=0;
- unsigned charucYearBCD=0; //BCD码的数据
- unsigned charucMonthBCD=0;
- unsigned charucDateBCD=0;
- unsigned charucHourBCD=0;
- unsigned charucMinuteBCD=0;
- unsigned charucSecondBCD=0;
- unsigned char ucTemp1=0;//中间过渡变量
- unsigned char ucTemp2=0;//中间过渡变量
- unsigned char ucTemp4=0;//中间过渡变量
- unsigned char ucTemp5=0;//中间过渡变量
- unsigned char ucTemp7=0;//中间过渡变量
- unsigned char ucTemp8=0;//中间过渡变量
- unsigned char ucDelayTimerLock=0; //原子锁
- unsigned intuiDelayTimer=0;
- unsigned char ucCheckDs1302=0;//检查Ds1302芯片是否正常
- unsigned char ucDs1302Error=0; //Ds1302芯片的备用电池是否用完了的报警标志
- unsigned char ucDs1302Lock=0;//原子锁
- unsigned intuiDs1302Cnt=0; //间歇性蜂鸣器报警的计时器
- unsigned char ucDpyTimeLock=0; //原子锁
- unsigned intuiDpyTimeCnt=0;//数码管的闪烁计时器,放在定时中断里不断累加
- //根据原理图得出的共阴数码管字模表
- code unsigned char dig_table[]=
- {
- 0x3f,//0 序号0
- 0x06,//1 序号1
- 0x5b,//2 序号2
- 0x4f,//3 序号3
- 0x66,//4 序号4
- 0x6d,//5 序号5
- 0x7d,//6 序号6
- 0x07,//7 序号7
- 0x7f,//8 序号8
- 0x6f,//9 序号9
- 0x00,//无 序号10
- 0x40,//- 序号11
- 0x73,//P 序号12
- };
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- key_service(); //按键服务的应用程序
- ds1302_sampling(); //ds1302采样程序,内部每秒钟采集更新一次
- display_service(); //显示的窗口菜单服务程序
- ds1302_alarm_service(); //ds1302出错报警
- }
- }
- /* 注释一:
- * 系统不用时时刻刻采集ds1302的内部数据,每隔一段时间更新采集一次就可以了。
- * 这个间隔时间应该小于或者等于1秒钟的时间,否则在数码管上看不到每秒钟的时间变化。
- */
- void ds1302_sampling(void) //ds1302采样程序,内部每秒钟采集更新一次
- {
- if(ucPart==0)//当系统不是处于设置日期和时间的情况下
- {
- ++uiSampingCnt;//累计主循环次数的时间
- if(uiSampingCnt>const_ds1302_sampling_time)//每隔一段时间就更新采集一次Ds1302数据
- {
- uiSampingCnt=0;
- ucYearBCD=Read1302(READ_YEAR); //读取年
- ucMonthBCD=Read1302(READ_MONTH); //读取月
- ucDateBCD=Read1302(READ_DATE); //读取日
- ucHourBCD=Read1302(READ_HOUR); //读取时
- ucMinuteBCD=Read1302(READ_MINUTE); //读取分
- ucSecondBCD=Read1302(READ_SECOND); //读取秒
- ucYear=bcd_to_number(ucYearBCD);//BCD转原始数值
- ucMonth=bcd_to_number(ucMonthBCD);//BCD转原始数值
- ucDate=bcd_to_number(ucDateBCD);//BCD转原始数值
- ucHour=bcd_to_number(ucHourBCD);//BCD转原始数值
- ucMinute=bcd_to_number(ucMinuteBCD);//BCD转原始数值
- ucSecond=bcd_to_number(ucSecondBCD);//BCD转原始数值
- ucWd2Update=1; //窗口2更新显示时间
- }
- }
- }
- //修改ds1302时间的驱动 ,注意,此处写入的是BCD码,
- void Write1302 ( unsigned char addr, unsigned char dat )
- {
- unsigned char i,temp; //单片机驱动DS1302属于SPI通讯方式,根据我的经验,不用关闭中断
- DS1302_CE_dr=0; //CE引脚为低,数据传送中止
- dela
DS1302实时时 相关文章:
- 如何实现DS1302实时时钟表显示在1602LCD液晶(11-18)
- LCD1602液晶显示DS1302实时时钟Proteus仿真(11-13)
- AT89C2051+LCD1602+DS1302实时时钟设计(c51)(11-10)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)