AT89S52单片机的多功能电子万年历(8)

2019-04-01 21:55

成都理工大学工程技术学院毕业设计

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


AT89S52单片机的多功能电子万年历(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2011届高三一轮语文卷:扩展语句,压缩语段

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: