程序(3)

2019-08-30 17:48

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数据 */

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[]={\ - - PING\//农历平年显示 uchar code nlr[]={\ - - RUN \//农历润年显示 uchar code NZd[]={\ - - \//显示闹钟固定点 uchar code qk[]= {\ \//清空显示 uchar code tm[]= {\

//=====================DS18B20=============================================

//******************************************************************************

void Delayns(int num)//延时函数 { while(num--); }

//******************************************************************************

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; } }

//******************************************************************************

unsigned int ReadTemperature(void)//读取温度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; //放大10倍输出并四舍五入 return(t); }

//*****************************************************************************

//延时函数,后面经常调用

void delay(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); }

/********液晶写入指令函数与写入数据函数,以后可调用**************/

/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/

write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令 }

write_1602dat(uchar dat)//***液晶写入数据函数**** {

rs=1;//数据/指令选择置为数据 rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1); en=1; //en置高电平,为制造下降沿做准备 delay(1); en=0; //en由高变低,产生下降沿,液晶执行命令 }

lcd_init()//***液晶初始化函数**** { write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<14;a++) { write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分 //delay(3); } write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 //delay(3); } }

/*********************over***********************/

/***************DS1302有关子函数********************/ void write_byte(uchar dat)//写一个字节 { ACC=dat; RST=1; for(a=8;a>0;a--) { IO=ACC0; SCLK=0;


程序(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:AutoCAD三维建模系列教程 - 图文

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

马上注册会员

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