成都理工大学工程技术学院毕业设计
year=temp1*16+temp2; temp1=month/16; temp2=month;
//month=temp1*10+temp2; month=temp1*16+temp2; temp1=day/16; temp2=day;
//day=temp1*10+temp2; day=temp1*16+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-1 if (month<10){
temp4=day_code1[month-1]+day-1; } else{
temp4=day_code2[month-10]+day-1; }
27
成都理工大学工程技术学院毕业设计
if ((month>0x2)&&(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1
temp4+=1; }
//计算公历日离当年元旦的天数完成 //判断公历日在春节前还是春节后
if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算 temp4-=temp3; month=0x1;
month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0 flag_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
27
成都理工大学工程技术学院毕业设计
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;
year_moon=temp1|temp2; temp1=month/10;
temp1=_crol_(temp1,4); temp2=month;
month_moon=temp1|temp2; temp1=day/10;
temp1=_crol_(temp1,4); temp2=day;
day_moon=temp1|temp2; } /*
函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年) 调用函数示例:Conver_week(c_sun,year_sun,month_sun,day_sun) 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
纪,c_sun=1为19世纪
调用函数后,原有数据不变,读week得出阴历BCD数据
27
成都理工大学工程技术学院毕业设计
*/
code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表 /*
算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在 闰年又不到3 月份上述之和要减一天再除7 星期数为0 */
void Conver_week(uchar year,uchar month,uchar day)
{//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据 uchar p1,p2;
year+=0x64; //如果为21世纪,年份数加100 p1=year/0x4; //所过闰年数只算1900年之后的 p2=year+p1;
p2=p2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
p2=p2+day+table_week[month-1]; if (year%0x4==0&&month<3)p2-=1; week=p2%0x7; }
/**************************************************************/
uchar code tab1[]={\//年显示的固定字符 uchar code tab2[]={\ //时间显示的固定字符 uchar code nlp[]={\//农历平年显示 uchar code nlr[]={\//农历润年显示 uchar code NZd[]={\//显示闹钟固定点 uchar code qk[]= {\//清空显示 uchar code tm[]= {\
//=====================DS18B20=============================================
//******************************************************************************
void Delayns(int num)//延时函数 {
while(num--); }
//***********************************************************************
27
成都理工大学工程技术学院毕业设计
*******
void Init_DS18B20(void)//初始化ds1820 {
unsigned char x=0; DQ = 1; //DQ复位 Delayns(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delayns(80); //精确延时 大于 480us DQ = 1; //拉高总线 Delayns(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 Delayns(20); }
//******************************************************************************
unsigned char ReadOneChar(void)//读一个字节 {
unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {
DQ = 0; // 给脉冲信号 dat>>=1;
DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delayns(4); }
return(dat); }
//******************************************************************************
void WriteOneChar(unsigned char dat)//写一个字节 {
unsigned char i=0; for (i=8; i>0; i--) {
DQ = 0;
DQ = dat&0x01; Delayns(5); DQ = 1; dat>>=1; }
27