实时时钟芯片HT1380读写c程序
昊旻 HYM1380 1381 串行实时时钟 日历芯片 说明书
特 点■基于32.768 kHz的石英晶体,可对秒,分,时,日,月,周以及带闰年补偿的年进行计数■工作电压范围:2.0V~5.5V■串行时钟输入最大值:V CC=2V时为500kHz,V CC=5V时为2MHz 。
■工作电流:2V时小于400nA ■ TTL兼容(V CC=5V)■双通道数据传输方式:单字节或多字节数据传送方式■串行I/O口传输■寄存器以BCD格式编码■封装形式:DIP8(HYM1380),SOP8(HYM1381)应 用■微型机串行时钟■时钟和日历■传真机■便携仪器■电视机■复费率电度表、IC卡水表、IC卡煤气表概 述HYM1380/HYM1381是一款低功耗串行实时时钟芯片,可对秒,分,时,星期,日期,月,年进行计数。
对于小于31天的月,月末的日期自动进行调整和具有闰年校正的功能。
HYM1380/HYM1381具有两种工作方式:时钟可以采用带AM(上午)/PM(下午)的12小时格式或24小时格式。
HYM1380/HYM1381有多个寄存器用来存储8位数据格式的通信信息。
可准确计时基于32.768KHz的晶振。
为了减少管脚的数目,HYM1380/HYM1381使用串行I/O口传输方式与微处理器通信。
仅需3根通信线:(1)RST(复位)(2)SCLK(串行时钟)和(3)I/O(数据线)。
数据可以以单字节形式或多达8字节的多字节方式传输。
订购信息型号温度范围封装HYM1380 0°C to +70°C 8 DIPHYM1381 0°C to +70°C 8 SOP方框图和管脚功能方框图管脚图HYM1380 —8DIP, HYM1381 —8SOP 管脚说明绝对最大额定值参数名称 符号 额定值 单位 电源电压 V CC -0.3~5.5 V 工作温度 T A 0~70 ℃ 贮存温度 T S -50~125 ℃ 焊接温度T H260(10 秒)℃注:这里要调的是额定值。
HT1380串行时序电路的课程设计
前言随着电子工业发展的日新月异,大规模集成电路的应用已越来越普遍。
电子设计自动化EDA如今已成为不可逆转的潮流。
Protel就是一套建立在PC环境下的EDA电路集成系统。
事实上,protel是世界上第一个将EDA环境引入Windows 开发环境的EDA开发工具。
自从1991年protel公司推出了Windows平台下的设计软件protel forwndows1.0版本以来,几乎立即成为广大电路设计人员的首选设计软件,从而奠定了protel软件在桌面EDA系统的领先地位。
Protel 99 SE是Protel公司于2000年最新推出的基于Windows平带的第六代产品,它具有强大的自动设计能力、高速有效的编辑功能、简洁方便的设计过程管理PDM,可完整地实现电子产品从电学概念设计到生成物理成产数据全过程,以及这中间的所有分析、仿真和验证。
Protel 99 SE 凭借其强大的功能,极大地提高了产品的可靠性,缩短了设计周期,降低设计成本。
今后必然成为广大电子线路设计工作者首选地计算机辅助电子线路设计软件。
课程设计任务书目录一.综述 (4)二.工作原理 (5)三.仿真结果及分析 (11)四.总结 (12)五.参考文献 (13)一综述随着电子信息技术的飞速发展, 电子计时牌已成为电子设备发展的一个标志性功能。
顾名思义, 计时牌主要用来完成计时功能, 即显示实时时钟的时间, 这是计时牌的首要任务。
但是, 现代的电子计时牌也可以集成多种功能于一身, 它不仅可以实时显示当前的具体时间, 而且还可以显示年、月、日、星期。
此外, 还有许多特殊的计时牌, 它们可以把安全生产天数、倒计时天数、工作环境温度、万年历等等都设计到其中,从而大大扩展了计时牌的应用范围。
二工作原理1 原理说明:HT1380是HOLTEK公司生产的一款带秒分时日星期月年的串行时钟芯片,每个月有多少天以及闰年均能自动调节。
HT1380具有低功耗工作方式,采用寄存器保存相关信息,用一个32..768kHz的晶振来校准时钟。
我的电子钟c程序完整代码
我的电子钟c程序完整代码真的很感谢问问的朋友帮我解决了定时器的问题。
今天是拿到单片机的第五天了,经过五天的挑灯学习,单片机的基础也算了解的三三两两了。
解决了定时器问题,早上逃课,趁热打铁,把电子钟的程序写完。
有一年没有写复杂的程序了,今天的过程也是磕磕碰碰,问题颇多。
废话不说了,想玩wow 了。
有图有真相。
#include#define unchar unsigned char//sbit beep=P1 ;unchar temp=0;unsigned char code shuzi[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};unsigned char count[]={0,0,10,5,5,10,3,2};void delay(void){int i=100;while(--i);}unchar time(unchar j){if (temp==20){ temp=0 ;++count[0];if (count[0]==10){ count[0]=0;++count[1];}if(count[1]==6){count[1]=0;++count[3];} if (count[3]==10){count[3]=0;++count[4];}if (count[4]==6){count[4]=0;++count[6];}if (count[6]==10){count[6]=0;++count[7];}if (count[7]==3)count[7]=0;if (count[7]==2&&count[6]==4)count[7]=count[6]=0;}return count[j];}void main(){uncharnum,i,j;EA=1;ET0=1;TMOD=0x01;TL0=15535%256;TH0=15535/256;TR0=1;while (1){P2=0xff;i=1;for (j=0;jtips:感谢大家的阅读,本文由我司收集整编。
HT1380的读写控制
HT1380的读写控制文件编码:HA0049sHT1380/HT1381是一款用硬件来实现日历及时钟功能的标准品,在与其它MCU配套使用时外部只需挂一颗32K的晶振。
用户使用时只需将初始时间日期写入其相应的寄存器内即可,随后从HT1380/HT1381内读出的数据即为当前时间日期值。
它精度高,而且应用非常简单方便。
DRIVER的使用说明:一,driver的使用针对HT1380的读写,共提供了二个driver,实现对HT1380进行读出和写入的功能。
使用时将该子程序中要用到的变量加入到你的定义中,将汇编源文件rw_ht1380.asm加入到你的程序中即可。
要修改I/O的定义可以直接在 .section‘data’中修改equ的定义。
二,各个driver的详细说明1,driver名称: READ_1380实现功能:从HT1380中读出一个数据入口参数:none出口参数:acc中间变量:time_temp, time_count堆栈使用:无2,driver名称: WRITE_1380实现功能:向HT1380中写入一个数据入口参数:acc出口参数:none中间变量:time_temp, time_count堆栈使用:无#include ht48r10a-1.incrw_ht1380_data .section 'data'?time_temp db?dbtime_countequpa.4ht1380_clkpac.4ht1380_clk_ctrl equpa.5ht1380_io equht1380_io_ctrl equ pac.5ht1380_restpa.6equpac.6ht1380_rest_ctrl equrw_ht1380_code1 .section ‘code’;==================================================================== read_ht1380:time_tempclra,8movtime_count,amovht1380_io_ctrlsetread_ht1380_loop:cclrsetht1380_clkht1380_ioszcsettime_temprrcht1380_clkclrtime_countsdzjmpread_ht1380_loopa,time_tempmovret;==================================================================== write_ht1380:mov time_temp,amov a,8mov time_count,aclr ht1380_io_ctrlclr ht1380_iowrite_ht1380_loop:rrc time_tempsz cset ht1380_ioset ht1380_clknopclr ht1380_clkclr ht1380_iosdz time_countjmp write_ht1380_loopret硬件电路图如下:下面用实例来说明该怎样使用此driver程序。
电子驱鼠器的介绍
电子驱鼠器-利用超声波等物理方法驱除老鼠等害虫,让其难以适应,效果长久/忠诚驱鼠器编辑---忠诚驱鼠器、忠诚超声波电子驱鼠器整理,技术属专利申请人所有.技术领域本电子驱鼠器属于家庭日常生活用电子产品,涉及到一种利用物理方法驱除老鼠等害虫的数字式自动定时变频电子驱鼠器。
背景技术鼠害是一个很严重的世界性问题,老鼠的一举一动都可能给人类带来危害。
目前比较常用的消灭老鼠的方法有:(l)机械灭鼠法,门)化学灭鼠法,(3)生物灭鼠法,(4)生态灭鼠法。
以上几种灭鼠方法都存在着比较明显的缺点,机械灭鼠方法的失效性在于研究表明老鼠有很强的学习能力和信息沟通能力,一个老鼠受到这种器械伤害之后,会向同类发出警报并对这些器械有着很深的记忆,使得机械方法失效。
化学灭鼠法会产生严重的二次环境污裂,而生物和生态防治方法则控制力度和采用方法的难度较高,故而效果不太理想。
用毒饵(即鼠药)或捕鼠器灭鼠,特点是只能治标,收效期短暂。
已有研究和实践证明超声波、极低频电磁波和次声波在不同层次上都会对老鼠等害虫产生损伤,使得老鼠等害虫在这些能量照射下的生长、发育、行为以及生理功能产生不同程度的变化。
因此这种无毒、无臭,而且也不会造成二次污染的电子驱虫方法现在越来越深受老百姓的喜爱。
尤其是采用变频技术,则降低了害虫对这些信号的“适应性”,达到对驱除老鼠更有效的结果。
目前市面上已经出现了这种利用电磁波或者超声波的电子驱虫器,主要有以下几种,一是能发出固定频率的电磁波和超声波的电子驱虫器,这种电子驱虫器已经被证明驱除效果不佳,基本上被淘汰,另外一种是能发出多种有限频率的电磁波和超声波的电子驱虫器,由于该方法循环不断地发出多种频率,能部分有效地消除老鼠等害虫的“适应性”,但这种多频段信号的产生基本上是基于计数器的方法,因此频率点有限,在长期的使用过程中,仍然会让老鼠等害虫产生一定的“适应性”。
使得在一段时间使用之后,效果大大降低。
电子驱鼠器内容本电子驱鼠器的目的在于提供一种利用物理方法驱除老鼠等害虫的数字式自动定时变频电子驱鼠器。
实时时钟SD2400读写C51演示程序
if(!I2CStart())return false; I2CSendByte(0x65); if(!I2CWaitAck()){I2CStop(); return false;}
for(n=0;n<7;n++) {
date[n]=I2CReceiveByte(); if (n!=6) //最后一个数据不应答 {
sbit
SDA=P3^4;
sbit
SCL=P3^5;
uchar data1[7]; // EEPROM数据
uchar date[7]; //日期数组
/*date[6]=year,date[5]=month,date[4]=day,date[3]=week,
date[2]=hour,date[1]=minute,date[0]=second*/
/************MCU向SD2400发送一个字节*************/ void I2CSen到低位//
{
uchar i=8;
while(i--) {
SCL=0; _nop_(); SDA=(bit)(demand&0x80); demand<<=1; I2CWait(); SCL=1; I2CWait(); } SCL=0; }
SDA=0; SCL=0; I2CWait(); SCL=1; I2CWait(); SCL=0; }
/*********发送NO ACK*********/ void I2CNoAck(void) {
SDA=1; SCL=0; I2CWait(); SCL=1; I2CWait(); SCL=0; }
I2CStart(); I2CSendByte(0x64); I2CWaitAck(); I2CSendByte(0x09); I2CWaitAck(); I2CSendByte(0x08); I2CWaitAck(); I2CStop();
HT1380时钟芯片C语言源代码
#ifndef _HT1380_H_#define _HT1380_H_//#include "ht1380.h"//读数据长度#define Long_ReadData (uint8)3//7//读取的数据转换成显示数据#define ClockSwitch_TSEC(x) ((x>>4)&0X07)*10 + (x&0x0f) #define ClockSwitch_TMIN(x) ((x>>4)&0X07)*10 + (x&0x0f) #define ClockSwitch_THOR(x) ((x>>4)&0x03)*10 + (x&0x0f)//显示数据转换成读取的数据-- 设置时间时#define ClockSwitchB_TSEC(x) (((x/10)<<4) + (x%10))#define ClockSwitchB_TMIN(x) (((x/10)<<4) + (x%10))#define ClockSwitchB_THOR(x) (((x/10)<<4) + (x%10))/*//----HT1381----DS1302#define P_SLK1380 PB2_OUT#define P_DA T1380Out PB3_OUT#define P_DA T1380In PB3_IN#define P_RST1380 PB4_OUT*///====================================extern void HT1380SetTime(uint8 *pSecDa) ;extern void HT1380ReadTime(uint8 *ucCurtime) ;extern void Init_TH1380(void) ;extern void ClockSwitchMCU(uint8 *ClockDat,uint8 *McuDat ) ; extern void MCUSwitchClock(uint8 *McuDat,uint8 *ClockDat) ;#endif#include "global.h"#include "ht1380.h"#define HT1380OSC_ENB (uint8)0X00 //振荡使能#define HT1380OSC_DIS (uint8)0X80#define MCLOCK24H (uint8)0x00 //24H制#define MCLOCK12H (uint8)0x80//-----------------------------#define HT1380SLK_HIGH P_SLK1380 = 1#define HT1380SLK_LOW P_SLK1380 = 0#define HT1380DA T_HIGH P_DA T1380Out = 1#define HT1380DA T_LOW P_DA T1380Out = 0#define HT1380RST_HIGH P_RST1380 = 1#define HT1380RST_LOW P_RST1380 = 0//读数据端口#define HT1380DatIn P_DA T1380In//-----------------------------------------void delay1380(void){uint8 i = 0 ;for(i=10;i>0;i--){_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");_asm("nop");}}/******************************************************************** ** 名称: HT1380WriteByte* 说明:* 功能: 往HT1381写入1Byte数据* 调用:* 输入: ucDa 写入的数据* 返回值: 无***********************************************************************/ void HT1380WriteByte(uint8 Dat){uint8 i = 0 ;HT1380SLK_LOW ;for(i=0;i<8;i++){if(Dat & 0x01){HT1380DA T_HIGH ;}else{HT1380DA T_LOW ;}Dat >>= 1 ;HT1380SLK_HIGH ;delay1380();HT1380SLK_LOW ;delay1380();}}/********************************************************************** 名称: uint8 HT1380ReadByte* 说明:* 功能: 从HT1381读取1Byte数据* 调用:* 输入:* 返回值: ACC***********************************************************************/ uint8 HT1380ReadByte(void){uint8 i = 0 ;uint8 Dat=0 ;HT1380DA T_HIGH ; //数据置高后再读双向口delay1380();if(HT1380DatIn){Dat |= 0x80 ;}for(i=0;i<7;i++){HT1380SLK_HIGH ;delay1380();HT1380SLK_LOW ;delay1380();Dat >>= 1 ;if(HT1380DatIn){Dat |= 0x80 ;}}return Dat ;}/********************************************************************** 名称: HT1380WriteByteAddr* 说明: 先写地址,后写命令/数据* 功能: 往HT1381写入数据* 调用: HT1380WriteByte()* 输入: ucAddr: HT1381地址, ucDa: 要写的数据* 返回值: 无***********************************************************************/ void HT1380WriteByteAddr(uint8 ucAddr, uint8 ucDa){HT1380RST_LOW;HT1380SLK_LOW;HT1380RST_HIGH;HT1380WriteByte(ucAddr); /* 地址,命令*/HT1380WriteByte(ucDa); /* 写1Byte数据*/HT1380SLK_HIGH;HT1380RST_LOW;}/********************************************************************** 名称: HT1380ReadByteAddr* 说明: 先写地址,后读命令/数据* 功能: 读取HT1381某地址的数据* 调用: HT1380WriteByte() , HT1380ReadByte()* 输入: ucAddr: HT1381地址* 返回值: ucDa :读取的数据***********************************************************************/uint8 HT1380ReadByteAddr(uint8 ucAddr){uint8 ucDa;HT1380RST_LOW;HT1380SLK_LOW;HT1380RST_HIGH;HT1380WriteByte(ucAddr); /* 地址,命令*/ucDa = HT1380ReadByte(); /* 读1Byte数据*/HT1380SLK_HIGH;HT1380RST_LOW;return(ucDa);}/********************************************************************** 名称: HT1380SetTime* 说明:* 功能: 设置初始时间* 调用: HT1380WriteByteAddr()* 输入: pSecDa: 初始时间地址。
基于单片机控制的实时时钟HT1380的软件设计
Huaqiao university基于单片机控制的实时时钟HT1380的软件设计院(系):机电及自动化学院专业:测控技术与仪器(信息)学号:姓名:级别:指导老师:2012年12月目录摘要 (1)1系统的硬件设计框图与原理概述 (2)1.1 电路设计框图 (2)1.2 系统硬件概述 (2)1..3 电路原理及说明 (2)2 系统的软件设计 (4)2.1 程序流程框图 (4)3 测试与结果分析 (6)3.1 软件测试 (6)3.2 测试结果分析 (6)3.3 测试结论 (6)4 课设总结 (7)5致谢 (8)6 参考文献 (9)附录一:系统程序清单 (10)附录二:系统硬件图 (20)附录三:硬件实物图 (21)摘要随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
实时时钟电路HT1380,它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且HT1380的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
关键词:时钟电路,HT1380,单片机89S521.系统的硬件设计框图与原理概述1.1 电路设计框图图1系统原理图1.2 系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由HT1380提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
16进制转换算成10进制程序
STC 单片机中的eeprom写入和读取6位的10进制数需要进行数据类型转换吗?具体是怎样现的呢?2013-06-04 10:24满意回答提问者采纳2013-06-04 10:276位10进制数,转换为16进制,再写入EEPROM.long x;分4个字节写入uchar c1;c1= x>>24; //最高字节c1=x>>16; //次高字节c1=x>>8; //次低字节c1=x&0xff; //最低字节分别写入就可以了。
追问我用的是stc12C5A60S2单片机,我将转化轩16进制的数保存在一个数组,然后整个数组写进去,当需要的时候再读出来还原成十进制数可否呢?回答当然可以。
追问想了一下,不知应该如何用单片机C语言去实现啊,可以指导下不?提问者评价谢谢哈评论| ningling_21 知道达人| 来自团队单片机学习| 十级采纳率26%擅长:其他编程语言汇编语言C/C++16进制转换算成10进制程序来源:本站整理作者:佚名2009年01月14日 23:33分享[导读] 16进制转换算成10进制程序unsigned char d[10]; //用于显示的10位显示缓存//======================关键词:进制16进制转换算成10进制程序unsigned char d[10]; //用于显示的10位显示缓存//============================================== ==========//16进制to10进制输出子程序:显示数据,起始位,结束位,有无小数点//============================================== ==========void output(unsigned long dd,unsigned char s,unsigned chare,unsigned char dip) {unsigned long div;unsigned char tm[8],i,j;div=10000000;for (i=0;i<8;i++) {tm[i]=dd/div;dd%=div;div/=10;}for (i=0;i<6;i++) {if (tm[i]!=0) break;tm[i]=nul;}tm[5]|=dip; //小数点控制,请看“串行LED数码管显示驱动程序”j=7;for (i=s;i<e;i++) {d[i]=tm[j];j--;}}//把显示位5-9位的10进制数转换成为16进制数 unsigned int input(void) {unsigned int dd,dat;dd=10000;dat=0;for (i=5;i<10;i++) {dat+=dd*temp;dd/=10;}return(dat);}/* 89C51系列CPU编程器接收CPU程序*/ #i nclude <reg51.h>#i nclude <intrins.h>#i nclude <absacc.h>#define e 8#define p 9#define l 10sbit led=P3^2;sbit p27=P2^7;sbit p26=P2^6;sbit p36=P3^6;sbit p37=P3^7;sbit rst=P3^3;sbit ale=P3^5;sbit vpp=P3^4;bit b_break;unsigned int adds;// 13.8mSvoid int_t0(void) interrupt 1 {TH0=-100;b_break=1;}void wait(unsigned char w) {unsigned int t=w*184;b_break=0;TL0=-t%256-1;TH0=-t/256;while (b_break==0) {}}void nop(void) {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}unsigned char command(void) {TH0=-100;b_break=0;while (RI==0) {if (b_break==1) return(0);}RI=0;return(SBUF);}void earsure(unsigned char cpu) {switch (cpu) {case 1: //89C51case 2:rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop();ale=0;wait(110);ale=1;nop();break;case 3:case 4:break;case 5:case 6:break;}}void program(unsigned char cpu) {unsigned int bdata adds=0;unsigned char d;switch (cpu) {case 1: //89C51case 2:p36=p37=1;rst=1;while (1) {TH0=-100;b_break=0;while (RI==0) {if (b_break==1) return;}RI=0;d=SBUF;//addressP0=adds%256;P2=adds/256;p27=1;//dataP1=d;nop(); //48clcl//vppvpp=1;nop(); //48clcl//aleale=0;wait(1);//100uSale=1;nop(); //10uSvpp=0;nop(); //48clclp27=0;nop(); //48clclP1=0xff;TH0=-100;b_break=0;while (d!=P1) {if (b_break==1) return;} //data pollingSBUF=d;adds++;}break;case 3:case 4:case 5:case 6:break;}}void lock(unsigned char cpu) {unsigned char i;switch (cpu) {case 1: //89c51case 2://lock 1rst=p26=p36=p27=p37=1;nop();vpp=1;nop();ale=0;// for (i=0;i<6;i++) wait(100);wait(1);ale=1;nop();vpp=0;nop();//lock 2rst=p26=p27=1;p36=p37=0;nop();vpp=1;nop();ale=0;// for (i=0;i<6;i++) wait(100);wait(1);ale=1;nop();vpp=0;nop();//lock 3rst=p26=p36=1;p27=p37=0;nop();vpp=1;nop();ale=0;// for (i=0;i<6;i++) wait(100);wait(1);ale=1;nop();vpp=0;nop();break;case 3:case 4:case 5:case 6:break;}}void main(void) {unsigned char disp,flash,temp,cpu;EA=1;SCON=0xd8;PCON=0x80;TMOD=0x21;TL1=TH1=0xff;TR1=1;TH0=-100;ET0=TR0=1;flash=0x80;while (1) {temp=command();switch (temp) {case 0:case 1: //89c51case 2: //89C52case 3: //80f51case 4: //80F52case 5: //87F51case 6:cpu=temp;SBUF=temp;break;//87f52case e:SBUF=temp;earsure(cpu);break; //erasurecase p:SBUF=temp;program(cpu);break; //programcase l:lock(cpu);SBUF=temp;break; //lockdefault:SBUF=temp;break;}b_break=0;if ((++disp)>flash) {disp=0;led=!led;}}}//HT1380实时时钟驱动程序sbit clock_dat=P0^1;sbit clock_clk=P0^2;sbit clock_rst=P0^3;sbit a0=ACC^0;sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7;void clock_out(unsigned char dd) {ACC=dd;clock_dat=a0;clock_clk=1;clock_clk=0;clock_dat=a1;clock_clk=1;clock_clk=0;clock_dat=a2;clock_clk=1;clock_clk=0;clock_dat=a3;clock_clk=1;clock_clk=0;clock_dat=a4;clock_clk=1;clock_clk=0;clock_dat=a5;clock_clk=1;clock_clk=0;clock_dat=a6;clock_clk=1;clock_clk=0;clock_dat=a7;clock_clk=1;clock_clk=0;}unsigned char clock_in(void) {clock_dat=1;a0=clock_dat;clock_clk=1;clock_clk=0;a1=clock_dat;clock_clk=1;clock_clk=0;a2=clock_dat;clock_clk=1;clock_clk=0;a3=clock_dat;clock_clk=1;clock_clk=0;a4=clock_dat;clock_clk=1;clock_clk=0;a5=clock_dat;clock_clk=1;clock_clk=0;a6=clock_dat;clock_clk=1;clock_clk=0;a7=clock_dat;return(ACC);}unsigned char read_clock(unsigned char ord) { unsigned char dd=0;clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);dd=clock_in();clock_rst=0;clock_clk=1;return(dd);}void write_clock(unsigned char ord,unsigned char dd) { clock_clk=0;clock_rst=0;clock_rst=1;clock_out(ord);clock_out(dd);clock_rst=0;clock_clk=1;}/*单个汉字库字摸提取程序,tc2.0编译*/#i nclude "stdio.h"#i nclude "dos.h"#i nclude "process.h"#i nclude "string.h"void main(void) {long int num_bytes,qm,wm;unsigned char d,i,j,k,a[132],b[132];unsigned char * data;unsigned char * hz;static unsigned char dd[103];FILE *fp;if ((fp=fopen("hzk16f","rb"))==NULL) {printf("can't open hzk16\n");exit(1);}clrscr();while (1) {data=(unsigned char *) malloc(33);printf("please input:\n");scanf("%s",dd); /*输入一个汉字*/qm=* dd; /*通过区位码计算其在hzk16f文件中的偏移地址*/qm=qm-161;if (qm>87) exit(0);wm=* (dd+1);wm=wm-161;if (wm>94) exit(0);num_bytes=((long)qm*94+wm)*32;fseek(fp,num_bytes,SEEK_SET);fgets(data,33,fp);for (i=0;i<32;i++) b[i]=* data++;for (i=0;i<32;i+=2) a[i/2]=b[i];for (i=0;i<32;i+=2) a[i/2+16]=b[i+1];for (i=8;i<16;i++) b[i]=a[i];for (i=8;i<16;i++) a[i]=a[i+8];for (i=8;i<16;i++) a[i+8]=b[i];/*转换,hzf16f在电脑的储存格式是以行为字节计算的,一般的lcd都采用以列为字节计算*/for (k=0;k<32;k+=8) {for (j=0;j<8;j++) {d=0;for (i=0;i<8;i++) {if (a[i+k]>=0x80) {switch (i) {case 0:d+=1;break;case 1:d+=2;break;case 2:d+=4;break;case 3:d+=8;break;case 4:d+=0x10;break;case 5:d+=0x20;break;case 6:d+=0x40;break;case 7:d+=0x80;break;}}}for (i=0;i<8;i++) a[i+k]<<=1;b[j+k]=d;}}clrscr();printf("/*%s:*/\n",dd); /*输出0x00格式的16进制数*/ for (k=0;k<32;k+=8) {for (j=0;j<8;j++) printf("0x%x,",b[j+k]);printf("\n");}getch();}}//按键扫描驱动程序unsigned char key,key_h,kpush;unsigned int key_l;//按键连接到p1.0、p1.1、p1.2void int_t0(void) interrupt 1 {unsigned char dd,i;TL0=TL0+30;TH0=0xfb; //800/* 按键判别*/if ((P1&0x7)==0x7) {if ((key_l>30)&&(key_l<800)&&(key_h>30)) {//释放按键,如果之前按键时间少于1秒,读入键值key=kpush;}if ((++key_h)>200) key_h=200;key_l=0;if (key>=0x80) key=0;//如果之前的按键为长按1秒,清除键值} else {kpush=P1&0x7;key_l++;if ((key_l>800)&&(key_h>30)) {//如果按键超过1秒,键值加0x80标志长按键key=kpush|0x80;key_h=0;key_l=0;}}}void main(void) {TMOD=0x1;TR0=1;ET0=1;EA=1;while (1) {while (!key) {}switch (key) {case 1:break;case 2:break;}}//串行驱动led显示,//一个74hc595位移寄存器驱动三极管驱动led位,//两个74hc595驱动led段,方式位5位x8段x2=10个数码管 //5分频,每次扫描时间位1.25ms//定义特殊符号#define nul 0xf#define qc 0xc#define qb 0xb#define q_ 0xa#define q__ 0xd#define q___ 0xe#define qp 0x10#define qe 0x11#define qj 0x12#define qn 0x13#define qf 0x14#define qa 0x15#define qr 0x16#define qd 0x17#define qu 0x18#define ql 0x19#define qh 0x1a#define qwen 0x1b#define qt 0x1c#define qla 0x1d#define qlb 0x1e#define qlc 0x1f#define qld 0x20#define qle 0x21#define qlf 0x22#define qlg 0x23#define qldp 0x24//显示段信息,不同led排列组合的段信息只需更改8个数值即可。
单片机教程
wela=0;
பைடு நூலகம் delay(1);
P0=table[a6]; //第6个数码管显示
dula=1;
dula=0;
P0=0x20;
wela=1;
wela=0;
delay(1);
}
void set_mdw() //设置月日星期函数
{
if(set_5==4)
{
if(set_2==1)
{
mon=incone(mon);
if(mon==13)
{mon=1;}
}
}
}
void set_clock() //设置闹钟函数
{
if(set_5==6)
{
if(set_2==1)
{
n_hour=incone(n_hour);
if(n_hour==24)
while(!s3);
}
}
return(n);
}
uchar decone(uchar m) //减1函数
{
if(s4==0)
{
delay(200);
if(s4==0)
{
m--;
dula=1;
dula=0;
wela=0;
P0=0x04;
wela=1;
wela=0;
delay(1);
P0=table[a4]; //第4个数码管显示,带小数点
dula=1;
dula=0;
{
fm=0;
delay(20);
fm=1;
delay(20);
c语言单片机数字钟程序
#include<reg52.h>sbit ksec=P3^0; //定义端口,秒的调整按键对应p3.0sbit kmin=P3^1; //分的调整按键对应p3.1sbit khour=P3^2; //时的调整按键对应p3.2unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;unsigned int num=0,sec=0,min=0,hour=0;unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义数码管显示的0-9的代码void delay(unsigned int z){ //延时程序unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);//如果是12MHz晶振,就是110us对应z=1}void keyscan();void display();void main(){TMOD=0x01;//T0定时器,模式1定时,13位定时TH0=(65536-50000)/256; //定时1S的数据设置,定时50000个机器周期后中断一次TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;//开启总中断,允许T0中断,开启T0中断while(1){display();//显示keyscan();//读取按键}}void time0() interrupt 1{num++;//T0中断服务程序,定时中断一次后num加一TH0=(65536-50000)/256;TL0=(65536-50000)%256;//重装计数值,因为模式1是非自动重装的}void display(){if(num==20){num=0; //定时20次后sec加一,那应该是6MHz的晶振,机器周期为2us,50000*2us*20=1ssec++;if(sec==60){sec=0;min++;//到60s,min加一,sec清零if(min==60){min=0;hour++;//到60分,hour加一,分清零if(hour==24){hour=0;min=0;//到24小时则所有时间清零,新的一天从零时开始计时sec=0;}}}}secge=sec%10;//秒的个位,秒除以10的余数secshi=sec/10;//十位,秒整除10的商minge=min%10;minshi=min/10;hourge=hour%10;hourshi=hour/10;P2=0xfe;//1111 1110,0选通一位数码管,P0=table[secge];//送秒的各位显示delay(5);//延时一会儿P2=0xfd;//选通下一位数码管,1111 1101P0=table[secshi];//送秒的十位显示delay(5);P2=0xfb;//1111 1011,选通再下一位P0=0x40;//显示分与秒之间的那个点delay(5);P2=0xf7;//1111 0111,再下一位P0=table[minge];//分的个位delay(5);P2=0xef;//1110 1111P0=table[minshi];//分的十位delay(5);P2=0xdf;//1101 1111P0=0x40;//分与时间的点delay(5);P2=0xbf;//1011 1111P0=table[hourge];//小时的个位delay(5);P2=0x7f;//0111 1111P0=table[hourshi];//小时的十位delay(5);}void keyscan(){if(ksec==0){delay(10);//延时防抖动if(ksec==0)//这里应该按键上接地的,有按键按下就是0{sec++;//有秒对应的按键按下,则秒加一if(sec>=60)//秒数到60则清零sec=0;}while(ksec==0)//等待按键释放,display();}//不做别的操作,就一直显示,等待按键释放,防止一次按键多次操作if(kmin==0){delay(10);//分对应的按键if(kmin==0){min++;if(min>=60)min=0;}while(kmin==0)display();}if(khour==0){delay(10);//小时对应的按键if(khour==0){hour++;if(hour>=24)hour=0;}while(khour==0)display();}}。
HT1380串行时钟芯片的原理跟应用资料精
1 写保护寄存器操作
当写保护寄存器的最高位为 0 时 允许数据写入寄存器 写保护寄存器可以通过命令字节 8E 8F 来
规定禁止写入/读出 写保护位不能在多字节传送模式下写入
Write_Enable:
MOV Command,#8Eh
;命令字节为 8E
MOV MOV
ByteCnt,#1 R0,#XmtDat
单位 微米
Pad NO. 1 2 3 4
X -1060.5 -1060.5 -1060.5 1050.62
Y 1000 683.13 -236.14 -710
Pad NO. 5 6 7
二 HT1380 的基本组成和工作原理
X 1050.6 1050.8 1050.4
Y 54.15 472.16 770.21
1
HOLTEK代理商:深圳市东诚信电子科技有限公司 http://www.singsun.com.cn 销售经理:庞泽华 TEL:13760362256 QQ:764873661 E-mail(MSN):pang520123@126.com
2. HT1380 内部寄存器
寄存器地址 特征 命令 读写 数据
寄存器定义
A0 A2 0
地址 控制 (BCD)
7
65
4
秒
80 写 00 59 CH
10 秒
3
2
1
0
秒
81 读
1
分
82 写 00 59
0
10 分
分
83 读
2
12 小时 84 写 01 12 12/24 0 AP HR
ቤተ መጻሕፍቲ ባይዱ
24 小时 85 读 00 23
0 10 HR
c51高精准时钟c语言实用程序
//年误差2分钟#include<reg52.h>#include <string.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit D0=P2^0; //** P0口sbit D1=P2^1; //** P0口sbit D2=P2^2; //** P0口sbit D3=P3^2;sbit D4=P3^4;sbit d0=P2^4;sbit d1=P2^5;sbit d2=P2^6;sbit d3=P2^7;sbit key0=P3^5;sbit key1=P3^6;sbit key2=P3^7;sbit key3=P1^3; //启动备用电源sbit clk1_164 = P3^2;sbit data_164 = P3^1; //数据线sbit clk_164 = P3^0; //时钟线sbit baoshi=P3^0;sbit led=P2^3;sbit led1=P0^3;sbit DQ = P3^3;//ds18B20温度传感器定义#define jump_ROM 0xCC //跳过ROM命令#define start 0x44#define read_EEROM 0xBE //读存储器命令uchar TMPH,TMPL,shi,shi1,shi2,fen,fen1,fen2,miao,miao1,miao2,ymonth,yday,m0,m1,m2,m3, sweek,ylmonth,ylmonth1,ylmonth2,ylday,ylday1,ylday2,num,week,temp,tt,tt1,b;uint yyear,ttm,mn,n;uchar code table[]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};uchar code tableweek[]={0,0,3,3,6,1,4,6,2,5,0,3,5};uchar code led_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code led_chardain1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar nbai,nshi,nge,m,mbai,mshi,mge,a,b;uchar code table1[]={0x28,0xf9,0x4c,0x58,0x99,0x1a,0x0a,0xf8,0x08,0x18};uchar code table2[]={0x20,0xf1,0x44,0x50,0x91,0x12,0x02,0xf0,0x00,0x10};//点小数点uchar code temp_table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//数据最高位为1时数据表void delay3(uint s){uchar k;while(s--){for(k=0; k<125; k++);}}void init(){TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;TH1=(65536-51182)/256;TL1=(65536-51182)%256;ET1=1;TR1=1;yyear=11;ymonth=12;yday=13;shi=18;fen=20;miao=0;P0 = 0xff;P1 = 0xff;clk_164 =0;// delay3(400);mn=50000;}void delay(uint z){uint x,y,n;if(shi<21){if(shi>5)n=20;}elsen=1;for(x=n;x>0;x--)for(y=z;y>0;y--);}void Conversion(bit c,uchar year,uchar month,uchar day);uchar code table_monthdate[]="0.31,59,90,120,151,181,212,243,273,304,334";//当前年每月前的总天数void delay1(uchar z){uchar x,y;for(x=80;x>0;x--)for(y=z;y>0;y--);}//21, 4, 19, 6, 21, 5, 21, 6,22, 6,22, 8, 23, 8, 24, 8, 24, 8, 24, 8,23, 8, 22///9, 6, 11,4, 9, 6, 10,6, 9,7, 9,7, 7, 8, 7, 9, 7, 9, 7, 9, 7,8, 7, 15///上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行///这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数位存放///第二个节气的数据,可得下表uchar code table_jq[]={0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1901 00x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1902 120x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78, ///1903 240x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87, ///1904 360x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1905 480x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///19060x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78, ///19070x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19080x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///19090x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///19100x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78, ///19110x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19120x95, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///19130x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///19140x96, 0xA5, 0x97, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78, ///19150x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///19160x95, 0xB4, 0x96, 0xA6, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87, ///19170x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77, ///19180x96, 0xA5, 0x97, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78, ///19190x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///19200x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77, ///1922 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78, ///1923 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///1924 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87, ///1925 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1926 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1927 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///1928 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///1929 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1930 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1931 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///1932 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///1933 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1934 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1935 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///1936 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///1937 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1938 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1939 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///1940 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///1941 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1942 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1943 0x96, 0xA5, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///1944 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///1945 0x95, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, ///1946 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1947 0x96, 0xA5, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///1948 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x79, 0x78, 0x79, 0x77, 0x87, ///1949 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, ///1950 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, ///1951 0x96, 0xA5, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///1952 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///1953 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x68, 0x78, 0x87, ///1954 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1955 0x96, 0xA5, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///1956 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///1957 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///1958 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1959 0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///1960 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///1961 0x96, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///1962 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///1963 0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19640x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19660x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///19670x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19680xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///19690x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19700x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, ///19710x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19720xA5, 0xB5, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///19730x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19740x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, ///19750x96, 0xA4, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x89, 0x88, 0x78, 0x87, 0x87, ///19760xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///19770x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87, ///19780x96, 0xB4, 0x96, 0xA6, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, ///19790x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19800xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x77, 0x87, ///19810xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///1982 ********* 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, ///1983 ********* 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, ///19840xA5, 0xB4, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///19850xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///19860x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x79, 0x78, 0x69, 0x78, 0x87, ///19870x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///19880xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19890xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///19900x95, 0xB4, 0x96, 0xA5, 0x86, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19910x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///19920xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19930xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///19940x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x76, 0x78, 0x69, 0x78, 0x87, ///19950x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///19960xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///19970xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///19980x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///19990x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///20000xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///20010xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///20020x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///20030x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///20040xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///20050xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///20060x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, ///20070x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, ///20080xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///20100x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87, ///20110x96, 0xB4, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, ///2012 ******* 0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, ///2013*******0xA5, 0xB4, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///2014 ******** 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///2015 ******** 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x96, ///2016 ******* 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x86, ///2017*******0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///2018 ******* 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, ///2019 ******* 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x87, 0x87, 0x78, 0x87, 0x96, ///2020 ******* 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///2021*******0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///2022 ******0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///2023 ******* 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x88, 0x87, 0x78, 0x87, 0x96, ///2024 ******** 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///2025********0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///2026 ******* 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///2027 ******0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, ///2028 ******0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///2029******0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///2030 ****** 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, ///2031 *****0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, ///2032 *****0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///2033******0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x78, 0x88, 0x78, 0x87, 0x87, ///20340xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///20350x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, ///20360xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, ///20370xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///20380xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///20390x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, ///20400xA5, 0xC3, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, ///20410xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, ///20420xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, ///20430x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x88, 0x87, 0x96, ///20440xA5, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, ///20450xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, ///20460x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96, ///2048 0xA4, 0xC3, 0xA5, 0xA5, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86, ///2049 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x78, 0x78, 0x87, 0x87 ///2050};code uchar year_code[597]={0x04,0xAe,0x53, //1901 00x0A,0x57,0x48, //1902 30x55,0x26,0xBd, //1903 60x0d,0x26,0x50, //1904 90x0d,0x95,0x44, //1905 120x46,0xAA,0xB9, //1906 150x05,0x6A,0x4d, //1907 180x09,0xAd,0x42, //1908 210x24,0xAe,0xB6, //19090x04,0xAe,0x4A, //19100x6A,0x4d,0xBe, //19110x0A,0x4d,0x52, //19120x0d,0x25,0x46, //19130x5d,0x52,0xBA, //19140x0B,0x54,0x4e, //19150x0d,0x6A,0x43, //19160x29,0x6d,0x37, //19170x09,0x5B,0x4B, //19180x74,0x9B,0xC1, //19190x04,0x97,0x54, //19200x0A,0x4B,0x48, //19210x5B,0x25,0xBC, //19220x06,0xA5,0x50, //19230x06,0xd4,0x45, //19240x4A,0xdA,0xB8, //19250x02,0xB6,0x4d, //19260x09,0x57,0x42, //19270x24,0x97,0xB7, //19280x04,0x97,0x4A, //19290x66,0x4B,0x3e, //19300x0d,0x4A,0x51, //19310x0e,0xA5,0x46, //19320x56,0xd4,0xBA, //19330x05,0xAd,0x4e, //19340x02,0xB6,0x44, //19350x39,0x37,0x38, //19360x09,0x2e,0x4B, //19370x0C,0x95,0x53, //1939 0x0d,0x4A,0x48, //1940 0x6d,0xA5,0x3B, //1941 0x0B,0x55,0x4f, //1942 0x05,0x6A,0x45, //1943 0x4A,0xAd,0xB9, //1944 0x02,0x5d,0x4d, //1945 0x09,0x2d,0x42, //1946 0x2C,0x95,0xB6, //1947 0x0A,0x95,0x4A, //1948 0x7B,0x4A,0xBd, //1949 0x06,0xCA,0x51, //1950 0x0B,0x55,0x46, //1951 0x55,0x5A,0xBB, //1952 0x04,0xdA,0x4e, //1953 0x0A,0x5B,0x43, //1954 0x35,0x2B,0xB8, //1955 0x05,0x2B,0x4C, //1956 0x8A,0x95,0x3f, //1957 0x0e,0x95,0x52, //1958 0x06,0xAA,0x48, //1959 0x7A,0xd5,0x3C, //1960 0x0A,0xB5,0x4f, //1961 0x04,0xB6,0x45, //1962 0x4A,0x57,0x39, //1963 0x0A,0x57,0x4d, //1964 0x05,0x26,0x42, //1965 0x3e,0x93,0x35, //1966 0x0d,0x95,0x49, //1967 0x75,0xAA,0xBe, //1968 0x05,0x6A,0x51, //1969 0x09,0x6d,0x46, //1970 0x54,0xAe,0xBB, //1971 0x04,0xAd,0x4f, //1972 0x0A,0x4d,0x43, //1973 0x4d,0x26,0xB7, //1974 0x0d,0x25,0x4B, //1975 0x8d,0x52,0xBf, //1976 0x0B,0x54,0x52, //1977 0x0B,0x6A,0x47, //1978 0x69,0x6d,0x3C, //1979 0x09,0x5B,0x50, //1980 0x04,0x9B,0x45, //19810x0A,0x4B,0x4d, //19830xAB,0x25,0xC2, //19840x06,0xA5,0x54, //19850x06,0xd4,0x49, //19860x6A,0xdA,0x3d, //19870x0A,0xB6,0x51, //19880x09,0x37,0x46, //19890x54,0x97,0xBB, //19900x04,0x97,0x4f, //19910x06,0x4B,0x44, //19920x36,0xA5,0x37, //19930x0e,0xA5,0x4A, //19940x86,0xB2,0xBf, //19950x05,0xAC,0x53, //19960x0A,0xB6,0x47, //19970x59,0x36,0xBC, //19980x09,0x2e,0x50, //1999 294 0x0C,0x96,0x45, //2000 297 0x4d,0x4A,0xB8, //20010x0d,0x4A,0x4C, //20020x0d,0xA5,0x41, //20030x25,0xAA,0xB6, //20040x05,0x6A,0x49, //20050x7A,0xAd,0xBd, //20060x02,0x5d,0x52, //20070x09,0x2d,0x47, //20080x5C,0x95,0xBA, //20090x0A,0x95,0x4e, //20100x0B,0x4A,0x43, //20110x4B,0x55,0x37, //20120x0A,0xd5,0x4A, //20130x95,0x5A,0xBf, //20140x04,0xBA,0x53, //20150x0A,0x5B,0x48, //20160x65,0x2B,0xBC, //20170x05,0x2B,0x50, //20180x0A,0x93,0x45, //20190x47,0x4A,0xB9, //20200x06,0xAA,0x4C, //20210x0A,0xd5,0x41, //20220x24,0xdA,0xB6, //20230x04,0xB6,0x4A, //20240x69,0x57,0x3d, //20250x0d,0x26,0x46, //2027 0x5e,0x93,0x3A, //2028 0x0d,0x53,0x4d, //2029 0x05,0xAA,0x43, //2030 0x36,0xB5,0x37, //2031 0x09,0x6d,0x4B, //2032 0xB4,0xAe,0xBf, //2033 0x04,0xAd,0x53, //2034 0x0A,0x4d,0x48, //2035 0x6d,0x25,0xBC, //2036 0x0d,0x25,0x4f, //2037 0x0d,0x52,0x44, //2038 0x5d,0xAA,0x38, //2039 0x0B,0x5A,0x4C, //2040 0x05,0x6d,0x41, //2041 0x24,0xAd,0xB6, //2042 0x04,0x9B,0x4A, //2043 0x7A,0x4B,0xBe, //2044 0x0A,0x4B,0x51, //2045 0x0A,0xA5,0x46, //2046 0x5B,0x52,0xBA, //2047 0x06,0xd2,0x4e, //2048 0x0A,0xdA,0x42, //2049 0x35,0x5B,0x37, //2050 0x09,0x37,0x4B, //2051 0x84,0x97,0xC1, //2052 0x04,0x97,0x53, //2053 0x06,0x4B,0x48, //2054 0x66,0xA5,0x3C, //2055 0x0e,0xA5,0x4f, //2056 0x06,0xB2,0x44, //2057 0x4A,0xB6,0x38, //2058 0x0A,0xAe,0x4C, //2059 0x09,0x2e,0x42, //2060 0x3C,0x97,0x35, //2061 0x0C,0x96,0x49, //2062 0x7d,0x4A,0xBd, //2063 0x0d,0x4A,0x51, //2064 0x0d,0xA5,0x45, //2065 0x55,0xAA,0xBA, //2066 0x05,0x6A,0x4e, //2067 0x0A,0x6d,0x43, //2068 0x45,0x2e,0xB7, //20690x05,0x2d,0x4B, //20700x8A,0x95,0xBf, //20710x0A,0x95,0x53, //20720x0B,0x4A,0x47, //20730x6B,0x55,0x3B, //20740x0A,0xd5,0x4f, //20750x05,0x5A,0x45, //20760x4A,0x5d,0x38, //20770x0A,0x5B,0x4C, //20780x05,0x2B,0x42, //20790x3A,0x93,0xB6, //20800x06,0x93,0x49, //20810x77,0x29,0xBd, //20820x06,0xAA,0x51, //20830x0A,0xd5,0x46, //20840x54,0xdA,0xBA, //20850x04,0xB6,0x4e, //20860x0A,0x57,0x43, //20870x45,0x27,0x38, //20880x0d,0x26,0x4A, //20890x8e,0x93,0x3e, //20900x0d,0x52,0x52, //20910x0d,0xAA,0x47, //20920x66,0xB5,0x3B, //20930x05,0x6d,0x4f, //20940x04,0xAe,0x45, //20950x4A,0x4e,0xB9, //20960x0A,0x4d,0x4C, //20970x0d,0x15,0x41, //20980x2d,0x92,0xB5, //2099};code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};code uint day_code2[3]={0x111,0x130,0x14e};bit c_moon;data uchar year_moon,month_moon,day_moon;bit get_moon_day(uchar month_p,uint table_addr)//函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年){/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/uchar temp;switch (month_p){case 1:{temp=year_code[table_addr]&0x08;if (temp==0)return(0);else return(1);}case 2:{temp=year_code[table_addr]&0x04;if (temp==0)return(0);else return(1);}case 3:{temp=year_code[table_addr]&0x02;if (temp==0)return(0);else return(1);}case 4:{temp=year_code[table_addr]&0x01;if (temp==0)return(0);else return(1);}case 5:{temp=year_code[table_addr+1]&0x80;if (temp==0) return(0);else return(1);}case 6:{temp=year_code[table_addr+1]&0x40;if (temp==0)return(0);else return(1);}case 7:{temp=year_code[table_addr+1]&0x20;if (temp==0)return(0);else return(1);}case 8:{temp=year_code[table_addr+1]&0x10;if (temp==0)return(0);else return(1);}case 9:{temp=year_code[table_addr+1]&0x08;if (temp==0)return(0);else return(1);}case 10:{temp=year_code[table_addr+1]&0x04;if (temp==0)return(0);else return(1);}case 11:{temp=year_code[table_addr+1]&0x02;if (temp==0)return(0);else return(1);}case 12:{temp=year_code[table_addr+1]&0x01;if (temp==0)return(0);else return(1);}case 13:{temp=year_code[table_addr+2]&0x80;if (temp==0)return(0);else return(1);}}}void Conversion(bit c,uchar year,uchar month,uchar day){ //c=0 为21世纪,c=1 为19世纪输入输出数据均为BCD数据uchar temp1,temp2,temp3,month_p;uint temp4,table_addr;bit flag2,flag_y;/* temp1=year/16; //BCD->hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;temp1=day/16;temp2=day%16;day=temp1*10+temp2; *///定位数据表地址if(c==0){table_addr=(year+0x64-1)*0x3;}else {table_addr=(year-1)*0x3;}//定位数据表地址完成//取当年春节所在的公历月份temp1=year_code[table_addr+2]&0x60;temp1=_cror_(temp1,5);//取当年春节所在的公历月份完成//取当年春节所在的公历日temp2=year_code[table_addr+2]&0x1f;//取当年春节所在的公历日完成// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月if(temp1==0x1){temp3=temp2-1;}else{temp3=temp2+0x1f-1;}// 计算当年春年离当年元旦的天数完成//计算公历日离当年元旦的天数,为了减少运算,用了两个表//day_code1[9],day_code2[3]//如果公历月在九月或前,天数会少于0xff,用表day_code1[9],//在九月后,天数大于0xff,用表day_code2[3]//如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1//如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1if (month<10){temp4=day_code1[month-1]+day-1;}else{temp4=day_code2[month-10]+day-1;}if ((month>0x2)&&(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1temp4+=1;}//计算公历日离当年元旦的天数完成//判断公历日在春节前还是春节后if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算temp4-=temp3;month=0x1;month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0flag_y=0;if(flag2==0)temp1=0x1d; //小月29天else temp1=0x1e; //大月30天temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月while(temp4>=temp1){temp4-=temp1;month_p+=1;if(month==temp2){flag_y=~flag_y;if(flag_y==0)month+=1;}else month+=1;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp4+1;}else{ //公历日在春节前使用下面代码进行运算temp3-=temp4;if (year==0x0){year=0x63;c=1;}else year-=1;table_addr-=0x3;month=0xc;temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4);if (temp2==0)month_p=0xc;else month_p=0xd; ///*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/flag_y=0;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;while(temp3>temp1){temp3-=temp1;month_p-=1;if(flag_y==0)month-=1;if(month==temp2)flag_y=~flag_y;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp1-temp3+1;}c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;year_moon=temp1|temp2;temp1=month/10;temp1=_crol_(temp1,4);temp2=month%10;month_moon=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;day_moon=temp1|temp2;year_moon=year;month_moon=month;day_moon=day;}void delay2(uint N){int i;for(i=0;i<N;i++);}uchar Reset(void){uchar deceive_ready;delay2(10);DQ=0; //拉低DQ线delay2(29); //延时至少480us~960usDQ=1; //将DQ线设置位逻辑高delay2(3); //延时等待deceive_ready响应deceive_ready=DQ; //采样deceive_ready信号delay2(25); //等待时序结束return(deceive_ready); //有deceive_ready信号时返回0,否则返回1}uchar read_bit(void){uchar i;DQ=0; //拉低DQ线开始时序DQ=1; //升高DQ线for(i=0;i<3;i++); //延时至时序开始15usreturn(DQ); //返回DQ值}void write_bit(uchar bitval){DQ=0; //拉低DQ线开始时序if(bitval==1)DQ=1; //如果写逻辑为高delay2(5); //延时DQ=1; //升高DQ线}/****************************************************************************** /void write_byte(uchar val){uchar i,temp;for(i=0;i<8;i++){temp=val>>i; //将val位右移i位赋值给比temptemp=temp&0x01; //取temp最低位write_bit(temp);delay2(5); //延时至时序结束}}/****************************************************************************** /uchar read_byte(void){uchar i,m,receive_data;m=1;receive_data=0; //初始化for(i=0;i<8;i++){if(read_bit()){receive_data=receive_data+(m<<i);} //每读一位数据据,左移一位delay2(6); //延时至时序结束}return(receive_data); //返回value}void wr_byte(data_temp,n){ uchar i,m;m=temp_table1[n];for(i=0;i<8;i++){if((m&0x80)==0x80)data_164 =1; //164数据线elsedata_164 =0;m<<=1;clk_164 =0; //164时钟线clk_164 =1; //164时钟线}for(i=0;i<8;i++){if(data_temp&0x80)data_164 =1; //164数据线elsedata_164 =0;data_temp<<=1; //clk_164 =0; //164时钟线clk_164 =1; //164时钟线}clk1_164=0;// delay(3);clk1_164=1;}void Get_temp(void){Reset();write_byte(jump_ROM); //发跳过ROM命令write_byte(start); //发启动转换命令Reset();write_byte(jump_ROM); //发跳过ROM命令write_byte(read_EEROM); //发跳过ROM命令TMPL=read_byte(); //读低8位温度值TMPH=read_byte(); //读高8位温度值}void keyskan(){if(m0>0){if(key0==1){temp++;if(temp>8)temp=0;m0=0;tt1=0;}}if(temp==1){if(m1>0){if(key1==1){miao++;if(miao==60)miao=0;m1=0;tt1=0;}}if(m2>0){if(key2==1){miao--;if(miao==(-1))miao=60;m2=0;tt1=0;}}}if(temp==2){if(m1>0){if(key1==1){fen++;if(fen==60)fen=0;m1=0;tt1=0;}}if(m2>0){if(key2==1){fen--;if(fen==(-1))fen=60;m2=0;tt1=0;}}}if(temp==3){if(m1>0){if(key1==1){shi++;if(shi==24)shi=0;m1=0;tt1=0;}}if(m2>0){if(key2==1){shi--;if(shi==(-1))shi=23;m2=0;tt1=0;}}}if(temp==4){if(m1>0){if(key1==1){yyear++;if(yyear>99)yyear=0;m1=0;tt1=0;}}if(m2>0){if(key2==1){yyear--;if(yyear==(-1))yyear=99;m2=0;tt1=0;}}}if(temp==5){if(m1>0){if(key1==1){ymonth++;if(ymonth>12)ymonth=1;m1=0;tt1=0;}}if(m2>0){if(key2==1){ymonth--;if(ymonth<1)ymonth=12;m2=0;tt1=0;}}}if(temp==6){if(m1>0){if(key1==1){yday++;if(ymonth==1){if(yday>31)yday=1;}if(ymonth==2){if(yyear%4==0){if(yday>29)yday=1;}if(yyear%4!=0){if(yday>28)yday=1;}}if(ymonth==3){if(yday>31)yday=1;}if(ymonth==4) {if(yday>30)yday=1;}if(ymonth==5) {if(yday>31)yday=1;}if(ymonth==6) {if(yday>30)yday=1;}if(ymonth==7) {if(yday>31)yday=1;}if(ymonth==8) {if(yday>31)yday=1;}if(ymonth==9) {if(yday>30)yday=1;}if(ymonth==10) {if(yday>31)yday=1;}if(ymonth==11) {if(yday>30)yday=1;}if(ymonth==12) {。
实时时钟芯片RTC_4513与AT89C51的接口设计
北京航空航天大学出版社 ,2002. 6. [2 ] 李广弟. 单片机基础 (第一版) [ M ] . 北京 :北京航空航
天大学出版社 ,1999. 2. [ 3 ] http :/ / www. dzsc. com/ 中国电子市场.
50
写数据保持时间
TDH
50
读数据延迟时间
TRD
250
读数据失效延迟
TRZ
100
CL K 上升/ 下降时间
TRF
20
2. 2 R TC24513 写数据的操作流程
R TC24513 写数据操作以 1 比特数据为单位 ,完成一个
图 3 写数据流程图 2. 3 R TC24513 读数据的操作流程
表 1 RTC24513 引脚说明
序号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
地 址
A3 A2 A1
0
0
0
0
0
0
0
0
1
0
0
1
0
1
0
0
1
0
0
1
1
0
1
1
1
0
0
1
0
0
1
0
1
1
0
1
1
1
0
1
1
0
1
1
1
1
1
1
寄存器符号 A0
0
S1
1
S10
0
M I1
1
M I10
0
H1
实时时钟SD2200读写C51演示程序
//实时时钟SD2200读写C51演示程序#pragma code#include <reg51.h>#include <intrins.h>//*********变量及IO口定义*********typedef unsigned char uchar;typedef unsigned int uint;sbit SDA=P3^4;sbit SCL=P3^5;uchar data1,data2,data3,data4;uchar date[7]; //日期数组/*date[0]=year,date[1]=month,date[2]=day,date[3]=week,date[4]=hour,date[5]=minute,date[6]=second*/#define true 1#define false 0/********SD2200函数名********/void I2CWait(void);bit I2CStart(void);void I2CStop(void);void I2CAck(void);void I2CNoAck(void);bit I2CWaitAck(void);void I2CSendByte(uchar demand,bit order);uchar I2CReceiveByte(bit order);void I2CReadDate(void);void I2CWriteStatus(void);void Delay(uint nn);uchar I2CReadEEram(uchar sramadd_hi,uchar sramadd_lo);void I2CWriteEEram(uchar sramadd_hi,uchar sramadd_lo,uchar sramdata);/*********I2C延时***********/void I2CWait(void){_nop_();_nop_();_nop_();_nop_();}/********开启SD2200的I2C总线********/bit I2CStart(void){SDA=1;I2CWait();if(!SDA)return false;//SDA线为低电平则总线忙,退出SDA=0;I2CWait();while(SDA)return false;//SDA线为高电平则总线出错,退出SCL=0;I2CWait();return true;}/********关闭SD2200的I2C总线*******/void I2CStop(void){SDA=0;SCL=0;I2CWait();SCL=1;I2CWait();SDA=1;}/*********发送ACK*********/void I2CAck(void){SDA=0;SCL=0;I2CWait();SCL=1;I2CWait();SCL=0;}/*********发送NO ACK*********/void I2CNoAck(void){SDA=1;SCL=0;I2CWait();SCL=1;I2CWait();SCL=0;/*********读取ACK信号*********/bit I2CWaitAck(void) //返回为:1=有ACK,0=无ACK{uchar errtime=255;SCL=0;SDA=1;I2CWait();SCL=1;I2CWait();while(SDA){errtime--;if(!errtime)SCL=0;return false;}SCL=0;return true;}/************从SD2200发送一个字节*************/void I2CSendByte(uchar demand,bit order) //order=1,H_L;order=0,L_H{uchar i=8; //order=1,从HI-->LO发送8bit数据//order=0,从LO-->HI发送8bit数据if(order){while(i--){SCL=0;_nop_();SDA=(bit)(demand&0x80);demand<<=1;I2CWait();SCL=1;I2CWait();}SCL=0;}else{SCL=0;_nop_();SDA=(bit)(demand&0x01);demand>>=1;I2CWait();SCL=1;I2CWait();}SCL=0;}}/*********MCU从SD2200读入一字节*********/uchar I2CReceiveByte(bit order)//order=1,H_L;order=0,L_H{uchar i=8;uchar ddata=0;SDA=1;if(order){while(i--){ddata<<=1; //数据从高位开始读取SCL=0;I2CWait();SCL=1;I2CWait(); //从高位开始ddata|=SDA;ddata<<=1if(SDA){ddata|=0x01;}}}else{while(i--){ddata>>=1; //数据从低位开始读取SCL=0;I2CWait();SCL=1;I2CWait(); //从低位开始ddata|=SDA;ddata>>=1ddata|=0x80;}}}SCL=0;return ddata;}/******读SD2200实时数据寄存器******/void I2CReadDate(void){uchar n;if(!I2CStart())return;I2CSendByte(0x65,1);//从年开始读取数据if(!I2CWaitAck()){I2CStop();return;}for(n=0;n<7;n++){date[n]=I2CReceiveByte(0);if (n!=6) //最后一个数据不应答{I2CAck();}}I2CNoAck();I2CStop();}/*写SD2200状态寄存器命令*/void I2CWriteStatus(void){if(!I2CStart())return;I2CSendByte(0x60,1); //发送SD2200状态寄存器_1命令if(!I2CWaitAck()){I2CStop();return;}I2CSendByte(0x03,0); //IC进行复位初始化,24小时制I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0x62,1); //发送SD2200状态寄存器_2命令I2CWaitAck();I2CSendByte(0x00,0); //清TEST位,禁止中断输出I2CStop();}/*写SD2200时间寄存器命令*/void I2CWriteTime(void){uchar n;date[0]=0x06;//year;2006/03/03/05/13/14/50date[1]=0x03;//monthdate[2]=0x03;//daydate[3]=0x05;//weekdate[4]=0x13;//hourdate[5]=0x14;//minutedate[6]=0x50;//secondI2CStart();I2CSendByte(0x64,1); //发送SD2200写时间寄存器命令,I2CWaitAck();for(n=0;n<7;n++){I2CSendByte(date[n],0);I2CWaitAck();}I2CStop();}/******读SD2200EEsram数据寄存器-单字节******/uchar I2CReadEEram(uchar sramadd_hi,uchar sramadd_lo){uchar ddata=0xFF;I2CStart();I2CSendByte(0x0A0,1);I2CWaitAck();I2CSendByte(sramadd_hi,1);I2CWaitAck();I2CSendByte(sramadd_lo,1);I2CWaitAck();I2CStart();I2CSendByte(0x0A1,1);I2CWaitAck();ddata=I2CReceiveByte(1);I2CNoAck();I2CStop();}/******写SD2200EEsram数据寄存器-单字节******/void I2CWriteEEram(uchar sramadd_hi,uchar sramadd_lo,uchar sramdata) {I2CStart();I2CSendByte(0x0A0,1);I2CWaitAck();I2CSendByte(sramadd_hi,1);I2CWaitAck();I2CSendByte(sramadd_lo,1);I2CWaitAck();I2CSendByte(sramdata,1);I2CWaitAck();I2CStop();Delay(250);Delay(250);Delay(250);Delay(250);Delay(250);Delay(250);Delay(250);Delay(250);Delay(250);Delay(250);/*总延时10ms,SRAM中不用此延时*/}。
测控系统中实时时钟的捕捉与C语言中断接口
测控系统中实时时钟的捕捉与C语言中断接口
黄菊生;张旭;彭庚新
【期刊名称】《计算机技术与发展》
【年(卷),期】2003(013)006
【摘要】介绍了在测控系统的开发中实时时钟的获得方法,详细讨论了硬件定时器中断的结构原理及用C语言捕获定时器控制的0x1c中断、编写用户定时器中断服务程序的技术,给出了在温度控制系统中实现实时时钟定时及报警功能的编程思想及程序设计流程图.
【总页数】3页(P37-39)
【作者】黄菊生;张旭;彭庚新
【作者单位】湖南工程学院,机械电子工程系,湖南,湘潭,411101;湖南工程学院,机械电子工程系,湖南,湘潭,411101;湖南工程学院,机械电子工程系,湖南,湘潭,411101【正文语种】中文
【中图分类】TP273
【相关文献】
1.串行接口实时时钟芯片DS1302在复费率电能表中的应用 [J], 徐爱钧
2.基于ARM的嵌入式系统中DS1337实时时钟接口电路及Linux驱动程序设计[J], 张桦;傅丰林
3.实时测控系统中的多中断管理 [J], 周亦敏;王庆祥;陈家琪
4.测控系统设计中的实时时钟研究 [J], 高培先;王涛;任文;王佳琳
5.数字化仪中断型接口程序设计及环形队裂缓冲器的C语言实现 [J], 胡坤华;王一举;等
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <w78e58b.h>
#include "ht1380.h"
#include "intrins.h"
#define uchar unsigned char
/********************************************************************
{
T_IO=1;
ACC0=T_IO;
T_CLK=1;delay();T_CLK=0;delay();ACC1=T_IO;
T_CLK=1;delay();T_CLK=0;delay();ACC2=T_IO;
T_CLK=1;delay();T_CLK=0;delay();ACC3=T_IO;
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************************
*
* 名称: v_Set1381
* 说明:
* 功能: 设置初始时间
T_IO=ACC3;T_CLK=1;delay();T_CLK=0;delay();
T_IO=ACC4;T_CLK=1;delay();T_CLK=0;delay();
T_IO=ACC5;T_CLK=1;delay();T_CLK=0;delay();
T_IO=ACC6;T_CLK=1;delay();T_CLK=0;delay();
ucCurtime ++;
ucAddr += 2;
}
}
void delay()
{
_nop_();
_nop_();
}
#ifndef HT1380_h
#define HT1380_h
#define uchar unsigned char
void v_RTInputByte(uchar ucDa)
{
ACC= ucDa;
T_IO=ACC0;T_CLK=1;delay();T_CLK=0;delay();
T_IO=ACC1;T_CLK=1;delay();T_CLK=0;delay();
T_IO=ACC2;T_CLK=1;delay();T_CLK=0;delay();
* 说明:
* 功能: 从HT1381读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/********************************************************************
//define HT1380
#define T_CLK P13
#define T_IO P12
#define T_RST P10
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往HT1381写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
* 输入: ucAddr: HT1381地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1381(uchar ucAddr, uchar ucDa)
T_CLK=1;delay();T_CLK=0;delay();ACC4=T_IO;
T_CLK=1;delay();T_CLK=0;delay();ACC5=T_IO;
T_CLK=1;delay();T_CLK=0;delay();ACC6=T_IO;
T_CLK=1;delay();T_CLK=0;delay();ACC7=T_IO;
void v_RTInputByte(uchar ucDa);
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从HT1381读取1Byte数据
* 调用: v_W1381()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
return(ACC);
}
/********************************************************************
*
* 名称: v_W1381
* 说明: 先写地址,后写命令/数据
* 功能: 往HT1381写入数据
* 调用: v_RTInputByte()
T_IO=ACC7;T_CLK=1;delay();T_CLK=0;delay();
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往HT1381写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
pSecDa++;
ucAddr +=2;
}
v_W1381(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1381
*
* 名称: uc_R1381
* 说明: 先写地址,后读命令/数据
* 功能: 读取HT1381某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: HT1381地址
* 返回值: ucDa :读取的数据
***********************************************************************/
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: HT1381地址
* 返回值: ucDa :读取的数据
***********************************************************************/
void v_Get1381(uchar *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
*ucCurtime = uc_R1381(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
uchar uc_R1381(uchar ucAddr);
/********************************************************************
*
* 名称: v_Set1381
* 说明:
* 功能: 设置初始时间
* 调用: v_W1381()
void v_Set1381(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1381(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)