搜档网
当前位置:搜档网 › PIC16F877万年历

PIC16F877万年历

PIC16F877万年历
PIC16F877万年历

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

* 标题:DS18B20测温

* 日期:2008年1月13日

* 说明:使用DS18B20芯片测温

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

# define DQ RA3 //定义18B20数据端口

# define DQ_DIR TRISC3 //定义18B20D口方向寄存器uchar Temp;

float f_temp;

void delay_18b20(uint i)

{

while(i--);

}

void init_DS18B20() //系统初始化函数

{

uchar x=0;

ADCON1=0X07; //设置A口为普通数字口

TRISA=0X00; //设置A口方向为输出

TRISC3=0;

DQ = 1; //DQ复位

delay_18b20(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay_18b20(80); //精确延时大于480us--900us

DQ = 1; //拉高总线

delay_18b20(14); //拉高36us

x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败

delay_18b20(20); //设置C口方向为输出

}

reset_DS18B20(void)//复位DS18B20函数

{

char presence=1;

while(presence)

{

DQ=0 ; //主机拉至低电平

delay(2,90); //延时503us

DQ=1; //释放总线等电阻拉高总线,并保持15~60us

delay(2,8); //延时70us

if(DQ==1) presence=1; //没有接收到应答信号,继续复位

else presence=0; //接收到应答信号

delay(2,70); //延时430us

}

} void Wait_DS18B20()//等待程序,等待ds18b20 应答{

uchar i;

while(DQ);

while(!DQ);

i=6;

while(i>0)i--;

}

void write_byte(uchar dat) //写18b20写字节函数{

uchar i,j;

bit temp1;

for(j=8;j>0;j--)

{

temp1=dat&0x01; //最低位移出

dat=dat>>1 //从高拉至低电平,产生写时间隙

if(temp1)

{

DQ=0;

i++;i++;i++;i++;

DQ=1;

i=13;

while(i>0) i--;

DQ=1; //如果写1,拉高电平

i++,i++,i++,i++; //延时63us

}

else

{

DQ=0;

i=13;

while(i>0) i--;

DQ=1;

i++;i++;i++;i++;

}

}

}

bit read_temp_bit() //读取18b20一位数据函数

{

uchar i;

bit dat;

DQ=0;i++;

DQ=1;i++;i++;

dat=DQ;

i=8;

while(i>0) i--;

return (dat);

}

uch read_temp_byte(void) //读取18b20读一字节函数{

uchar i,j,value=0;

for(i=8;i>0;i--)

{

j=read_temp_bit();

value=(j<<7)|(dat>>1);

}

return(value);

}

void temp_Convert(void) //开始转换

{

Reset_DS18B20();

Wait_DS18B20(); //等待应答脉冲

Write_byte(0xcc); //跳过序列号脉冲

Write_byte(0x44); //转换命令

}

uint get_temp()//启动温度转换函数

{

int i;

uchar L_18B20,H_18B20;

init_DS18B20();

delay_DS18B20(1);

reset_DS18B20();

Wait_DS18B20(); //复位等待从机应答

write_byte(0XCC); //忽略ROM匹配

write_byte(0Xbe); //发送温度转化命令

L_18B20=Read_temp_byte(); //读取低八位数据

H_18B20=Read_temp_byte(); //读取高八位数据

temp=H_18B20;

temp<<=8;

temp=temp|L_18B20;

f_temp=temp*0.0625;

temp=f_temp*10+0.5;

return (temp);

}

/************************************************** * 标题:DS1302读写

* 日期:2008年1月14日

* 说明:日历显示范围:2000年--2099年

**************************************************/ #define uchar unsigned char

#define uint unsigned int

#define RST RA5

#define SCLK RA3 #define IO RA4

uchar flag=0;

int Naoling_hour=6;

int Naoling_minute=30;

int Naoling_hour_1;

int Naoling_minute_1;

int Naoling_hour_2;

int Naoling_minute_2;

int Naoling_hour_3;

int Naoling_minute_3;

uchar kk=0;

uchar second=1,minute=1,hour=1,

year=1,month=1,date=1,day=1,

Naohour=1,Naominute=1,kaiguan=1;

uchar clock[]={0};

uchar DisCash[]={0x00,0x30,0x09,0x16,0x01,0x03,0x09};

void RTInputByte(uchar d)//往1302写入1Byte数据{

uchar i;

TRISA=0x00; //A口输出

for(i=8; i>0; i--)

{

IO = d&0x01; //取最低位

SCLK = 1; //上升沿发送

SCLK = 0; //恢复

d = d >> 1;

}

}

uchar RTOutputByte(void) //从1302读取1Byte数据{

uchar i,val=0;

TRISA4=1; //RA4设置为输入

for(i=8; i>0; i--)

{

val = val >>1;

if(IO)val=val|0x80; // 从最低位开始接收

SCLK = 1; //下降沿接收

SCLK = 0;

}

return(val);

}

void W1302(uchar ucAddr, uchar ucDa) //先写地址,后写命令/数据

{

RST = 0;

SCLK = 0;

RST = 1; //打开DS1302

RTInputByte(ucAddr); //地址,命令

RTInputByte(ucDa); //写1Byte数据

RST = 0; //关闭DS1302

SCLK = 1;

}

uchar R1302(uchar ucAddr)//先写地址,后读命令/数据{

uchar ucData;

RST = 0;

SCLK = 0;

RST = 1;

RTInputByte(ucAddr); //地址,命令

ucData = RTOutputByte(); //读1Byte数据

RST = 0;

SCLK = 1;

return(ucData);

}

void Set1302(uchar *pClock)//向1302写入秒分时日月星期年

{

uchar i;

uchar ucAddr = 0x80; //起使地址

W1302(0x8e,0x00); //控制命令,WP=0,允许写操作

for(i =7; i>0; i--)

{

W1302(ucAddr,*pClock); //秒分时日月星期年

pClock++;

ucAddr +=2; //写地址加2

}

W1302(0x8e,0x80); //控制命令,WP=1,写保护}

void v_Get1302(uchar ucCurtime[]) //从1302读出秒分时日月星期年

{

uchar i;

uchar ucAddr = 0x81;

for(i=0;i<7;i++)

{

ucCurtime[i] = R1302(ucAddr); //格式为: 秒分时日月星期年

ucAddr += 2;

}

} /************************************************** * 标题:LCD操作

* 日期:2008年1月12日

* 说明:KS0108系列液晶不带字库

**************************************************/ #include

#define E RA0 //液晶使能端

#define RW RA1 //读写控制端

#define DI RA2 //数据/指令通道

#define CSA RA5 //片选

#define CSB RA3 //片选

#define nop() asm("nop")

void delay(char x,char y) //延时

{

char z;

do{

z=y;

do{;}while(--z);

}while(--x);

}

//其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。则是:14+(3*(Y-1)+7)*(X-1)。

void CheckState()//状态检查

{

unsigned int dat;

RW=1; //读状态

DI=0;

TRISB=0xff; //设置口为输入

while(1)

{

E=1; //高电平读数据

dat=PORTB&0x90; //当4、7位为0时为正常状态

E=0;

if(dat==0x00)break;

}

TRISB=0x00; //恢复口为输出

}

void WriteData(unsigned char dat) /写显示数据

{

CheckState();

DI=1; //写数据

RW=0;

PORTB=dat;

E=1;

E=0;

}

//command:操作LCD的指令//写指令

void WriteCommand(unsigned char dat)

{

CheckState();

RW=0; //写指令

PORTB=dat;

E=1;

E=0;

}

void SetLine(unsigned char line) //设定页地址----X:0--7 {

line=line&0x07; //0<=line<=7

line=line|0xb8;

WriteCommand(line);

}

void SetColumn(unsigned char column) //设定列地址

----Y:0--63

{

column=column&0x3f; //0<=column<=63 column=column|0x40;

WriteCommand(column);

}

void SetStartLine(unsigned char startline) //设定开始行

{

startline=startline&0x3f; //0<=startline<=63

startline=startline|0xc0;

WriteCommand(startline);

}

void SetOnOff(unsigned char state) //开关显示1:开0:关{

state=state|0x3e;

WriteCommand(state);

}

void SlectScreen(unsigned char screen) //选择屏幕

//screen: 1:左屏2:右屏

{

switch(screen)

{

case 1: CSA=0;

CSB=1;//左屏

break;

case 2: CSA=1;

CSB=0;//右屏

break;

}

}

void ClearScreen(unsigned char screen) //清屏

//screen: 1:左屏2:右屏

{

unsigned char i,j;

SlectScreen(screen);

for(i=0;i<8;i++)

{

SetLine(i);

for(j=0;j<64;j++)

{

WriteData(0x00);

WriteData(0x00);

}

}

}

//显示一个16X16的汉字

void Show16X16(unsigned char line,unsigned char column,const unsigned char *pt,uch mode)

{

unsigned char i,column_temp;

uch wei_1,wei_2;

if(mode==0){wei_1=0x00;wei_2=0x00;}

if(mode==1){wei_1=0x01;wei_2=0x00;}

if(mode==2){wei_1=0x00;wei_2=0x80;}

column_temp=column;

SlectScreen(1); //选通左屏

SetColumn(column); //设置起始列

SetLine(line); //设置行

for(i=0;i<16;i++)

{

if(column>=64) //如果列>=64,则选通右屏

{

SlectScreen(2);

column=column%64; //设置右屏起始列

SetColumn(column);

SetLine(line);

}

WriteData(*pt|wei_1); //写数据

*pt++;//

column++;

}

SlectScreen(1);

SetLine(line+1); //设置汉字下半部分显示页column=column_temp;

SetColumn(column);

for(i=0;i<16;i++)

{

if(column>=64)

{

SlectScreen(2);

column=column%64;

SetColumn(column);

SetLine(line+1);

}

WriteData(*pt|wei_2);

*pt++;

column++;

}

}

//显示一个8X16的字符

void Show8X16(unsigned char line,unsigned char column,const unsigned char *pt,uch mode)

{

unsigned char i,column_temp;

uch wei_1,wei_2;

if(mode==0){wei_1=0x00;wei_2=0x00;}

if(mode==1){wei_1=0x01;wei_2=0x00;}

if(mode==2){wei_1=0x00;wei_2=0x80;}

column_temp=column;

SlectScreen(1); //选通左屏

SetColumn(column); //设置起始列

SetLine(line); //设置行

for(i=0;i<8;i++)

{

if(column>=64) //如果列>=64,则选通右屏

{

SlectScreen(2);

column=column%64; //设置右屏起始列

SetColumn(column);

SetLine(line);

}

WriteData(*pt|wei_1); //写数据

*pt++;

column++;

}

SlectScreen(1);

SetLine(line+1); //设置汉字下半部分显示页column=column_temp;

SetColumn(column);

for(i=0;i<8;i++)

{

if(column>=64)

{

SlectScreen(2);

column=column%64;

SetColumn(column);

SetLine(line+1);

}

WriteData(*pt|wei_2);

*pt++;

column++;

}

}

//显示一个16X32的字符

void Show16X32(unsigned char line,unsigned char column,const unsigned char *pt)

{

Unsigned char i,column_temp1, column_temp2, column_temp3;

column_temp1=column;

column_temp2=column;

column_temp3=column;

SlectScreen(1); //选通左屏

SetColumn(column); //设置起始列

SetLine(line); //设置行

for(i=0;i<16;i++)

{

if(column>=64) //如果列>=64,则选通右屏

{

SlectScreen(2);

column=column%64; //设置右屏起始列

SetColumn(column);

SetLine(line);

}

WriteData(*pt); //写数据

*pt++;

column++;

}

SlectScreen(1);

SetLine(line+1);

column=column_temp1;

SetColumn(column);

for(i=0;i<16;i++)

{

if(column>=64)

{

SlectScreen(2);

column=column%64;

SetColumn(column);

SetLine(line+1);

}

WriteData(*pt);

*pt++;

column++;

}

SlectScreen(1);

SetLine(line+2);

column=column_temp2;

SetColumn(column);

for(i=0;i<16;i++)

{

if(column>=64)

{

SlectScreen(2);

column=column%64;

SetColumn(column);

SetLine(line+2);

}

WriteData(*pt);

*pt++;

column++;

}

SlectScreen(1);

SetLine(line+3);

column=column_temp3;

SetColumn(column);

for(i=0;i<16;i++)

{

if(column>=64)

{

SlectScreen(2);

column=column%64;

SetColumn(column);

SetLine(line+3);

}

WriteData(*pt);

*pt++;

column++;

}

}

void LCDinit() //LCD初始化子程序{

ADCON1=0x06;

TRISA=0x00;

TRISB=0x00;

PORTB=0x00;

SetOnOff(1);

}

//调用LCD显示子程序

void ChangeToLCD(uch line,uch column,uch data,uch mode)

{

int D_ge,D_shi;

D_ge=data%10; //取个位

D_shi=data%100/10; //取十位

switch(D_ge)

{

case 0:{Show8X16(line,column+8,s0,mode);break;}

case 1:{Show8X16(line,column+8,s1,mode);break;}

case 2:{Show8X16(line,column+8,s2,mode);break;}

case 3:{Show8X16(line,column+8,s3,mode);break;}

case 4:{Show8X16(line,column+8,s4,mode);break;}

case 5:{Show8X16(line,column+8,s5,mode);break;}

case 6:{Show8X16(line,column+8,s6,mode);break;}

case 7:{Show8X16(line,column+8,s7,mode);break;}

case 8:{Show8X16(line,column+8,s8,mode);break;}

case 9:{Show8X16(line,column+8,s9,mode);break;}

}

switch(D_shi)

{

case 0:{Show8X16(line,column,s0,mode);break;}

case 1:{Show8X16(line,column,s1,mode);break;}

case 2:{Show8X16(line,column,s2,mode);break;}

case 3:{Show8X16(line,column,s3,mode);break;}

case 4:{Show8X16(line,column,s4,mode);break;}

case 5:{Show8X16(line,column,s5,mode);break;}

case 6:{Show8X16(line,column,s6,mode);break;}

case 7:{Show8X16(line,column,s7,mode);break;}

case 8:{Show8X16(line,column,s8,mode);break;}

case 9:{Show8X16(line,column,s9,mode);break;} }

}

void ChangeToLCD3(uch line,uch column,uch data)

{

int D_ge,D_shi;

D_ge=data%10; //取个位

D_shi=data%100/10; //取十位

switch(D_ge)

{

case 0:{Show16X32(line,column+16,ss0);break;}

case 1:{Show16X32(line,column+16,ss1);break;}

case 2:{Show16X32(line,column+16,ss2);break;}

case 3:{Show16X32(line,column+16,ss3);break;}

case 4:{Show16X32(line,column+16,ss4);break;}

case 5:{Show16X32(line,column+16,ss5);break;}

case 6:{Show16X32(line,column+16,ss6);break;}

case 7:{Show16X32(line,column+16,ss7);break;}

case 8:{Show16X32(line,column+16,ss8);break;}

case 9:{Show16X32(line,column+16,ss9);break;} }

switch(D_shi)

{

case 0:{Show16X32(line,column,ss0);break;}

case 1:{Show16X32(line,column,ss1);break;}

case 2:{Show16X32(line,column,ss2);break;}

case 3:{Show16X32(line,column,ss3);break;}

case 4:{Show16X32(line,column,ss4);break;}

case 5:{Show16X32(line,column,ss5);break;}

case 6:{Show16X32(line,column,ss6);break;}

case 7:{Show16X32(line,column,ss7);break;}

case 8:{Show16X32(line,column,ss8);break;}

case 9:{Show16X32(line,column,ss9);break;} }

}

void ChangeToLCD4(uch line,uch column,uch data)//星期转换

{

switch(data)

{

case 1:{Show16X16(line,column,ri,2);break;}

case 2:{Show16X16(line,column,yi,2);break;}

case 3:{Show16X16(line,column,er,2);break;}

case 4:{Show16X16(line,column,san,2);break;}

case 5:{Show16X16(line,column,si,2);break;}

case 6:{Show16X16(line,column,wu,2);break;}

case 7:{Show16X16(line,column,liu,2);break;} }

}

void ChangeToLCD6(uch line,uch column,uch data)//阴历月转换

{

//data=data%12;

switch(data)

{

case 1:{Show16X16(line,column,zheng,2) ;break;}

case 2:{Show16X16(line,column,er,2) ;break;}

case 3:{Show16X16(line,column,san,2) ;break;}

case 4:{Show16X16(line,column,si,2) ;break;}

case 5:{Show16X16(line,column,wu,2) ;break;}

case 6:{Show16X16(line,column,liu,2) ;break;}

case 7:{Show16X16(line,column,qqi,2) ;break;}

case 8:{Show16X16(line,column,ba,2) ;break;}

case 9:{Show16X16(line,column,jiu,2) ;break;}

case 10:{Show16X16(line,column,shi,2) ;break;}

case 11:{Show16X16(line,column,shiyi,2);break;}

case 0:{Show16X16(line,column,la,2) ;break;} }

}

void ChangeToLCD7(uch line,uch column,uch data)//阴历日

{

uch D_ge,D_shi;

D_shi=data/10;

D_ge=data%10;

if(data==10)

{

D_shi=0;

D_ge=0;

}

switch(D_ge)

{

case 0:{Show16X16(line,column+16,shi,2);break;}

case 1:{Show16X16(line,column+16,yi,2) ;break;}

case 2:{Show16X16(line,column+16,er,2) ;break;}

case 3:{Show16X16(line,column+16,san,2);break;}

case 4:{Show16X16(line,column+16,si,2) ;break;}

case 5:{Show16X16(line,column+16,wu,2) ;break;}

case 6:{Show16X16(line,column+16,liu,2);break;}

case 7:{Show16X16(line,column+16,qqi,2);break;}

case 8:{Show16X16(line,column+16,ba,2) ;break;}

case 9:{Show16X16(line,column+16,jiu,2);break;} }

switch(D_shi)

{

case 0:{Show16X16(line,column,chu,2);break;}

case1:{Show16X16(line,column,shi,2);break;}

case 2:{Show16X16(line,column,ershi,2);break;}

case 3:{Show16X16(line,column,san,2);break;} }

}

/************************************************** * 标题:公历与阴历、星期转换

* 日期:2008年1月18日

* 说明:阴历日期与星期随公历变化

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

const uch year_code[]= {

0x04,0xAe,0x53, //1901 0x0A,0x57,0x48, //1902 0x55,0x26,0xBd, //1903 0x0d,0x26,0x50, //1904 0x0d,0x95,0x44, //1905 0x46,0xAA,0xB9, //1906 0x05,0x6A,0x4d, //1907 0x09,0xAd,0x42, //1908 0x24,0xAe,0xB6, //1909 0x04,0xAe,0x4A, //1910 0x6A,0x4d,0xBe, //1911 0x0A,0x4d,0x52, //1912 0x0d,0x25,0x46, //1913 0x5d,0x52,0xBA, //1914 0x0B,0x54,0x4e, //1915 0x0d,0x6A,0x43, //1916 0x29,0x6d,0x37, //1917 0x09,0x5B,0x4B, //1918 0x74,0x9B,0xC1, //1919 0x04,0x97,0x54, //1920 0x0A,0x4B,0x48, //1921 0x5B,0x25,0xBC, //1922 0x06,0xA5,0x50, //1923 0x06,0xd4,0x45, //1924 0x4A,0xdA,0xB8, //1925 0x02,0xB6,0x4d, //1926 0x09,0x57,0x42, //1927 0x24,0x97,0xB7, //1928 0x04,0x97,0x4A, //1929 0x66,0x4B,0x3e, //1930 0x0d,0x4A,0x51, //1931 0x0e,0xA5,0x46, //1932 0x56,0xd4,0xBA, //1933 0x05,0xAd,0x4e, //1934 0x02,0xB6,0x44, //1935 0x39,0x37,0x38, //1936 0x09,0x2e,0x4B, //1937 0x7C,0x96,0xBf, //1938 0x0C,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, //1981 0x4A,0x4B,0xB9, //1982 0x0A,0x4B,0x4d, //1983 0xAB,0x25,0xC2, //1984 0x06,0xA5,0x54, //1985 0x06,0xd4,0x49, //1986 0x6A,0xdA,0x3d, //1987 0x0A,0xB6,0x51, //1988 0x09,0x37,0x46, //1989 0x54,0x97,0xBB, //1990 0x04,0x97,0x4f, //1991 0x06,0x4B,0x44, //1992 0x36,0xA5,0x37, //1993 0x0e,0xA5,0x4A, //1994 0x86,0xB2,0xBf, //1995 0x05,0xAC,0x53, //1996

0x0A,0xB6,0x47, //1997

0x59,0x36,0xBC, //1998

0x09,0x2e,0x50, //1999 294 0x0C,0x96,0x45, //2000 297 0x4d,0x4A,0xB8, //2001

0x0d,0x4A,0x4C, //2002

0x0d,0xA5,0x41, //2003

0x25,0xAA,0xB6, //2004

0x05,0x6A,0x49, //2005

0x7A,0xAd,0xBd, //2006

0x02,0x5d,0x52, //2007

0x09,0x2d,0x47, //2008

0x5C,0x95,0xBA, //2009

0x0A,0x95,0x4e, //2010

0x0B,0x4A,0x43, //2011

0x4B,0x55,0x37, //2012

0x0A,0xd5,0x4A, //2013

0x95,0x5A,0xBf, //2014

0x04,0xBA,0x53, //2015

0x0A,0x5B,0x48, //2016

0x65,0x2B,0xBC, //2017

0x05,0x2B,0x50, //2018

0x0A,0x93,0x45, //2019

0x47,0x4A,0xB9, //2020

0x06,0xAA,0x4C, //2021

0x0A,0xd5,0x41, //2022

0x24,0xdA,0xB6, //2023

0x04,0xB6,0x4A, //2024

0x69,0x57,0x3d, //2025

0x0A,0x4e,0x51, //2026

0x0d,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, //2069 0x05,0x2d,0x4B, //2070 0x8A,0x95,0xBf, //2071 0x0A,0x95,0x53, //2072 0x0B,0x4A,0x47, //2073 0x6B,0x55,0x3B, //2074 0x0A,0xd5,0x4f, //2075 0x05,0x5A,0x45, //2076 0x4A,0x5d,0x38, //2077 0x0A,0x5B,0x4C, //2078 0x05,0x2B,0x42, //2079 0x3A,0x93,0xB6, //2080 0x06,0x93,0x49, //2081 0x77,0x29,0xBd, //2082 0x06,0xAA,0x51, //2083 0x0A,0xd5,0x46, //2084 0x54,0xdA,0xBA, //2085 0x04,0xB6,0x4e, //2086 0x0A,0x57,0x43, //2087 0x45,0x27,0x38, //2088 0x0d,0x26,0x4A, //2089 0x8e,0x93,0x3e, //2090 0x0d,0x52,0x52, //2091 0x0d,0xAA,0x47, //2092 0x66,0xB5,0x3B, //2093 0x05,0x6d,0x4f, //2094

0x04,0xAe,0x45, //2095

0x4A,0x4e,0xB9, //2096

0x0A,0x4d,0x4C, //2097

0x0d,0x15,0x41, //2098

0x2d,0x92,0xB5, //2099

};

bank1 uch day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,

0xb5,0xd4,0xf3};

bank1 uch day_code2[3]={0x111,0x130,0x14e};

bank1 uch table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表

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

** 函数名称:GetWeek

** 功能描述:输入公历日期得到星期(只允许2000-2099年) ** 输入: year 公历年

** month 公历月

** day 公历日

** 日期: 2008年05月06日

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

void GetWeek(

unsigned int year,

unsigned char month,

unsigned char day

)

{

unsigned char xingqi;

unsigned int temp2;

unsigned char yearH,yearL;

yearH=year/100; yearL=year%100;

// 如果为21世纪,年份数加100

if (yearH>19) yearL+=100;

// 所过闰年数只算1900年之后的

temp2=yearL+yearL/4;

temp2=temp2%7;

temp2=temp2+day+table_week[month-1];

if (yearL%4==0&&month<3) temp2--;

xingqi=(temp2%7+1);

ChangeToLCD4(6,40,xingqi);

}

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

* 子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0

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

unsigned char GetMoonDay(unsigned char

month_p,unsigned short table_addr)

{

switch (month_p) {

case 1:

if((year_code[table_addr]&0x08)==0) return(0);

else

return(1);

case 2:

if((year_code[table_addr]&0x04)==0) return(0);

else

return(1);

case 3:

if((year_code[table_addr]&0x02)==0) return(0);

else

return(1);

case 4:

if((year_code[table_addr]&0x01)==0) return(0);

else

return(1);

case 5:

if((year_code[table_addr+1]&0x80)==0) return(0);

else

return(1);

case 6:

if((year_code[table_addr+1]&0x40)==0) return(0);

else

return(1);

case 7:

if((year_code[table_addr+1]&0x20)==0) return(0);

else

return(1);

case 8:

if((year_code[table_addr+1]&0x10)==0) return(0);

else

return(1);

case 9:

if((year_code[table_addr+1]&0x08)==0) return(0);

else

return(1);

case 10:

if((year_code[table_addr+1]&0x04)==0) return(0);

else

return(1);

case 11:

if((year_code[table_addr+1]&0x02)==0) return(0);

else

return(1);

case 12:

if((year_code[table_addr+1]&0x01)==0) return(0);

else

return(1);

case 13:

if((year_code[table_addr+2]&0x80)==0) return(0);

else

return(1);

}

return(0);

}

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

** 函数名称:GetChinaCalendar

** 功能描述:公农历转换(只允许1901-2099年)

** 输入: year 公历年

** month 公历月

** day 公历日

** 输出: 1 成功

** 0 失败

** 日期: 2007年05月06日

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

unsigned char GetChinaCalendar(

unsigned int year,

unsigned char month,

unsigned char day

)

{

uch NLmonth,NLday;

unsigned char temp1,temp2,temp3,month_p,yearH,yearL;

unsigned char flag_y;

unsigned short temp4,table_addr;

yearH=year/100; yearL=year%100;

if((yearH!=19)&&(yearH!=20)) return(0);

//定位数据表地址

if(yearH==20) table_addr=(yearL+100-1)*3;

else table_addr=(yearL-1)*3;

// 取当年春节所在的公历月份

temp1=year_code[table_addr+2]&0x60;

temp1>>=5;

// 取当年春节所在的公历日

temp2=year_code[table_addr+2]&31;

// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月

if(temp1==1) temp3=temp2-1;

else temp3=temp2+31-1;

//计算公历日离当年元旦的天数

if (month<10) temp4=day_code1[month-1]+day-1;

else

temp4=day_code2[month-10]+day-1;

// 如果公历月大于2月并且该年的2月为闰月,天数加1

if ((month>2)&&(yearL%4==0)) temp4++;

// 判断公历日在春节前还是春节后

if (temp4>=temp3)

{

temp4-=temp3;

month=1;

month_p=1;

flag_y=0;

if(GetMoonDay(month_p,table_addr)==0) temp1=29; //小月29天

else

temp1=30; //大小30天

// 从数据表中取该年的闰月月份,如为0则该年无闰月

temp2=year_code[table_addr]/16;

while(temp4>=temp1)

{

temp4-=temp1;

month_p++;

if(month==temp2)

{

flag_y=~flag_y;

if(flag_y==0)month++;

}

else month++;

if(GetMoonDay(month_p,table_addr)==0)

temp1=29;

else

temp1=30;

}

day=temp4+1;

}

// 公历日在春节前使用下面代码进行运算

else

{

temp3-=temp4;

if (yearL==0)

{

yearL=100-1;

yearH=19;

}

else yearL--;

table_addr-=3;

month=12;

temp2=year_code[table_addr]/16;

if (temp2==0) month_p=12;

else month_p=13;

flag_y=0;

if(GetMoonDay(month_p,table_addr)==0) temp1=29;

else

temp1=30;

while(temp3>temp1)

{

temp3-=temp1;

month_p--;

if(flag_y==0) month--;

if(month==temp2) flag_y=~flag_y;

if(GetMoonDay(month_p,table_addr)==0) temp1=29;

else

temp1=30;

}

day=temp1-temp3+1;

}

NLmonth=month;

NLday=day;

ChangeToLCD6(6,64,NLmonth);

ChangeToLCD7(6,95,NLday);

return(1);

} /************************************************** * 标题:字库

* 作者:Wujieflash

* 日期:2008年1月12日

* 说明:KS0108系列液晶不带字库所用字符全部自己制造。*************************************************** #define uch unsigned char

/*---------------------16X16------------------------------------*/ const uch nian[]=

{0x80,0x40,0x20,0x18,0xC6,0x44,0x44,0x44,0xFC,0x44,0x44 ,0x44,0x44,0x04,0x00,0x00,

0x08,0x08,0x08,0x08,0x0F,0x08,0x08,0x08,0xFF,0x08,0x08,0 x08,0x08,0x08,0x08,0x00};/*"年",0*/

const uch yue[]=

{0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0 xFF,0x00,0x00,0x00,0x00,

0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0 x3F,0x00,0x00,0x00,0x00};/*"月",1*/

const uch ri[]=

{0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0xFE,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0 x3F,0x00,0x00,0x00,0x00};/*"日",2*/

const uch xing[]=

{0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0 x2A,0x2A,0x3E,0x00,0x00,0x00,

0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0 x49,0x49,0x41,0x40,0x00};/*"星",3*/

const uch qi[]=

{0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22, 0x22,0x22,0xFE,0x00,0x00,

0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02, 0x22,0x42,0x3F,0x00,0x00};/*"期",4*/

const uch danwei1[]=

{0x00,0x02,0x05,0xE2,0x18,0x04,0x02,0x02,0x02,0x02,0x02, 0x02,0x04,0x1E,0x00,0x00,

0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x40,0x40,0x40,0x40,0 x40,0x20,0x18,0x00,0x00};/*"℃",5*/

const uch yi[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0

x03,0x03,0x03,0x03,0x00};/*"一",0*/

const uch er[]=

{0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x00,0x00,0x00,

0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0 x08,0x18,0x18,0x18,0x08};/*"二",1*/

const uch san[]=

{0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x00,0x00,0x00,

0x10,0x18,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0 x19,0x18,0x18,0x18,0x00};/*"三",2*/

const uch si[]=

{0x00,0x00,0xE0,0x20,0x20,0x20,0xE0,0x20,0xE0,0x20,0x20, 0x20,0xE0,0xE0,0x00,0x00,

0x00,0x00,0x1F,0x1C,0x1A,0x0B,0x09,0x08,0x0B,0x0A,0x0E ,0x1A,0x1F,0x0F,0x00,0x00};/*"四",3*/

const uch wu[]=

{0x00,0x00,0x20,0x20,0xA0,0x20,0x20,0xE0,0x20,0x20,0x20, 0x20,0x20,0x00,0x00,0x00,

0x00,0x18,0x18,0x08,0x09,0x09,0x0F,0x0B,0x09,0x09,0x1D, 0x1F,0x18,0x18,0x18,0x00};/*"五",4*/

const uch liu[]=

{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0xE0,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,

0x01,0x01,0x20,0x10,0x08,0x0C,0x06,0x00,0x00,0x06,0x0C,0 x08,0x10,0x21,0x01,0x00};/*"六",5*/

const uch qqi[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,

0x00,0x03,0x01,0x01,0x01,0x01,0x0F,0x1D,0x19,0x31,0x31,0 x31,0x11,0x19,0x01,0x00};/*"七",6*/

const uch ba[]=

{0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x40,0xC0,0x80, 0x00,0x00,0x00,0x00,0x00,

0x00,0x04,0x06,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0 x03,0x06,0x0E,0x0C,0x00};/*"八",7*/

const uch jiu[]=

{0x00,0x00,0x00,0xC0,0x40,0x40,0xF0,0x70,0x40,0xC0,0x40 ,0x00,0x00,0x00,0x00,0x00,

0x10,0x10,0x10,0x18,0x18,0x0C,0x07,0x00,0x00,0x0F,0x18,0 x18,0x30,0x38,0x18,0x08};/*"九",8*/ const uch shi[]=

{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0xE0,0x80,0x80, 0x80,0x80,0x80,0x80,0x00,

0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x3F,0x1F,0x00,0x00,0 x01,0x01,0x01,0x01,0x00};/*"十",0*/

const uch shiyi[]=

{0x00,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

0x01,0x00,0x00,0x3F,0x00,0x01,0x01,0x00,0x02,0x01,0x01,0 x01,0x01,0x01,0x03,0x01};//十一

const uch chu[]=

{0x00,0x00,0x80,0x70,0x70,0x60,0xE0,0x00,0x40,0x60,0x40, 0xC0,0x40,0xC0,0xC0,0x00,

0x00,0x04,0x06,0x06,0x02,0x3F,0x12,0x0D,0x08,0x14,0x23,0 x10,0x1C,0x07,0x01,0x00};/*"初",9*/

const uch la[]=

{0x00,0x00,0xF0,0xB0,0x90,0xF0,0x00,0xC0,0xC0,0xF0,0xC 0,0xF0,0xC0,0xC0,0x80,0x80,

0x10,0x18,0x0F,0x02,0x02,0x3F,0x01,0x01,0x3E,0x1A,0x1A, 0x1A,0x3F,0x01,0x01,0x00};/*"腊",10*/

const uch zheng[]=

{0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0x02,0xFE,0x82,0x82, 0x82,0x82,0x82,0x02,0x00,

0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0 x20,0x20,0x20,0x20,0x00};/*"正",0*/

const uch noshu3[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00};

const uch ershi[]=

{0x00,0x80,0x80,0x80,0xE0,0xF0,0x80,0x80,0x80,0xF0,0xF0, 0x80,0x80,0x80,0x80,0x80,

0x00,0x01,0x00,0x00,0x00,0x1F,0x10,0x10,0x10,0x1F,0x1F,0 x00,0x01,0x01,0x01,0x00};/*"廿",0*/

const uch kai[]=

{0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xE0,0xA0,0xA0,0xE0,0x E0,0xA0,0x20,0x00,0x00,0x00,

0x00,0x01,0x11,0x19,0x18,0x0F,0x03,0x00,0x00,0x3F,0x1F,0 x01,0x01,0x01,0x01,0x00};/*"开",0*/

const uch guan[]=

{0x00,0x00,0x00,0x40,0x40,0x70,0x60,0xC0,0xC0,0x60,0x70, 0x40,0x40,0x00,0x00,0x00,

0x00,0x02,0x12,0x32,0x32,0x12,0x1E,0x0F,0x03,0x0F,0x0B,0 x13,0x13,0x22,0x02,0x00};/*"关",1*/

/*-------------------8X16----------------------------------*/

const uch s0[]=

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10, 0x20,0x20,0x10,0x0F,0x00};/*"0",0*/

const uch s1[]=

{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20, 0x3F,0x20,0x20,0x00,0x00};/*"1",1*/

const uch s2[]=

{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28, 0x24,0x22,0x21,0x30,0x00};/*"2",2*/

const uch s3[]=

{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20, 0x20,0x20,0x11,0x0E,0x00};/*"3",3*/

const uch s4[]=

{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04, 0x24,0x24,0x3F,0x24,0x00};/*"4",4*/

const uch s5[]=

{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21, 0x20,0x20,0x11,0x0E,0x00};/*"5",5*/

const uch s6[]=

{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11, 0x20,0x20,0x11,0x0E,0x00};/*"6",6*/

const uch s7[]=

{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00, 0x3F,0x00,0x00,0x00,0x00};/*"7",7*/

const uch s8[]=

{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22, 0x21,0x21,0x22,0x1C,0x00};/*"8",8*/

const uch s9[]=

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31, 0x22,0x22,0x11,0x0F,0x00};/*"9",9*/

const uch maohao[]=

{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, 0x30,0x30,0x00,0x00,0x00};/*":",10*/

const uch noshu[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00};//没有数

/*--------------------32X16-----------------------------------------*/ const uch ss0[]=

{0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC 0,0x80,0x00,0x00,0x00,0x00,

0x00,0xF0,0xFE,0xFF,0x0F,0x01,0x00,0x00,0x00,0x00,0x01,0x0F,0xFF,0xFE,0xF0,0x00,

0x00,0x1F,0x7F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0 xE0,0xFF,0xFF,0x1F,0x00,

0x00,0x00,0x00,0x01,0x03,0x07,0x06,0x06,0x06,0x06,0x07,0 x03,0x01,0x00,0x00,0x00};/*"0",0*/

const uch ss1[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00, 0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x0C,0x0C,0x0C,0x0E,0xFF,0xFF,0xFF,0x00, 0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0 x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x00,0 x00,0x00,0x00,0x00,0x00};/*"1",1*/

const uch ss2[]=

{0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC 0,0x80,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x3C,0x3F,0x3F,0x03,0x00,0x00,0x00,0xC1,0 xFF,0xFF,0x7E,0x00,0x00,

0x00,0x00,0x00,0xC0,0xE0,0xF0,0x78,0x1C,0x0E,0x07,0x03, 0x01,0x00,0x00,0x00,0x00,

0x00,0x00,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0 x06,0x06,0x06,0x00,0x00};/*"2",2*/

const uch ss3[]=

{0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0x8 0,0x80,0x00,0x00,0x00,0x00,

0x00,0x00,0x0C,0x0F,0x0F,0x03,0x00,0x80,0x80,0xC1,0xFF,0 x7F,0x3E,0x00,0x00,0x00,

0x00,0x70,0xF0,0xF0,0x80,0x00,0x00,0x01,0x01,0x03,0x87,0 xFF,0xFE,0xFC,0x00,0x00,

0x00,0x00,0x01,0x03,0x03,0x07,0x06,0x06,0x06,0x06,0x03,0 x03,0x01,0x00,0x00,0x00};/*"3",3*/

const uch ss4[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0, 0xC0,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x80,0xE0,0xF0,0x3C,0x0E,0x07,0xFF,0xFF, 0xFF,0x00,0x00,0x00,0x00,

0x00,0x1C,0x1E,0x1F,0x19,0x18,0x18,0x18,0x18,0xFF,0xFF,0 xFF,0x18,0x18,0x18,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0 x07,0x00,0x00,0x00,0x00};/*"4",4*/

const uch ss5[]=

{0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x C0,0xC0,0xC0,0x00,0x00,0x00,

0x00,0x00,0xF8,0xFF,0xCF,0xC0,0x60,0x60,0x60,0xE0,0xE0, 0xC0,0x80,0x00,0x00,0x00,

0x00,0xE0,0xE1,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0 xFF,0xFF,0x7E,0x00,0x00,

0x00,0x00,0x03,0x07,0x07,0x0E,0x0C,0x0C,0x0C,0x0E,0x07, 0x07,0x01,0x00,0x00,0x00};/*"5",5*/

const uch ss6[]=

{0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xC 0,0xC0,0x80,0x00,0x00,0x00,

0x00,0x00,0xF0,0xFC,0xFF,0x8F,0xC1,0x60,0x60,0x60,0xE0, 0xE1,0xC7,0x87,0x06,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0x81,0x00,0x00,0x00,0x00,0x00,0 x81,0xFF,0xFF,0x7E,0x00,

0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x06,0x06,0x06,0x07,0 x07,0x03,0x01,0x00,0x00};/*"6",6*/

const uch ss7[]=

{0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x C0,0xC0,0xC0,0xC0,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFE,0 xFF,0x1F,0x03,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF8,0xFF,0x3F,0x07,0 x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x07,0x01,0x00,0x00,0 x00,0x00,0x00,0x00,0x00};/*"7",7*/

const uch ss8[]=

{0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0x8 0,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3E,0x7F,0xFF,0xC1,0x80,0x80,0x80,0xC1,0xFF, 0x7F,0x3E,0x00,0x00,0x00, 0x00,0xF8,0xFE,0xFE,0x87,0x03,0x01,0x01,0x01,0x03,0x87, 0xFE,0xFE,0xF8,0x00,0x00,

0x00,0x00,0x01,0x03,0x03,0x07,0x06,0x06,0x06,0x07,0x03,0 x03,0x01,0x00,0x00,0x00};/*"8",8*/

const uch ss9[]=

{0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC 0,0x80,0x00,0x00,0x00,0x00,

0x00,0x00,0xFC,0xFF,0xFF,0x83,0x01,0x00,0x00,0x00,0x01,0 x83,0xFF,0xFE,0xF8,0x00,

0x00,0x00,0xC0,0xC1,0xC3,0x07,0x06,0x06,0x06,0x06,0x83, 0xE1,0xFF,0x7F,0x1F,0x00,

0x00,0x00,0x00,0x01,0x03,0x07,0x06,0x06,0x06,0x07,0x03,0 x03,0x01,0x00,0x00,0x00};/*"9",9*/

const uch noshu2[]=

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00};

/************************************************** * 标题:按键扫描和服务

* 作者:Wujieflash

* 日期:2008年1月17日

* 说明:当按键按下,选中的单元就会闪烁

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

uch k=0;

//键盘初始化子程序

void keyinit()

{

TRISD=0xff;

PORTD=0x00;

}

//键盘扫描子程序

void KeyScan()

{

int d;

if(RD0==0) //设置键按下

{

k++; //选定入口值

k=k%10;

}

while(1)

{

if(RD0==1)break;//等待按键松开

}

switch(k)//键盘服务入口

{

case 1://设置秒

{

d=R1302(0x81); //读取秒

d=d/16*10+d%16;//转换为16进制

second=flag; //设置秒的闪烁标志

minute=1; //其余变量不闪烁

hour=1;

kaiguan=1;

year=1;

month=1;

date=1;

Naohour=1;

Naominute=1;

if(second==0) //闪烁

{

Show8X16(0,111,noshu,1);

Show8X16(0,119,noshu,1);

}

if(RD1==0) //秒数值加1

{

d++;

if(d>0x3b)d=0;// 大于59就为0

d=d/10*16+d%10;

W1302(0x80,d);//写入DS1302

while(1)

{

if(RD1==1)break;//等待键松开

}

}

if(RD2==0)//数值减1

{

d--;

if(d<0)d=0x3b;//小于0就写59

d=d/10*16+d%10;

W1302(0x80,d);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 2://设置分

{

d=R1302(0x83);

d=d/16*10+d%16;

minute=flag;

kaiguan=1;

second=1;

hour=1;

year=1;

month=1;

date=1;

Naohour=1;

Naominute=1;

if(minute==0)

{

Show8X16(0,96,noshu,1);

Show8X16(0,88,noshu,1);

}

if(RD1==0)

{

d++;

if(d>0x3b)d=0;

d=d/10*16+d%10;

W1302(0x82,d);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

d--;

if(d<0)d=0x3b;

d=d/10*16+d%10;

W1302(0x82,d);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 3://设置时

{

d=R1302(0x85);

d=d/16*10+d%16;

hour=flag;

kaiguan=1;

second=1;

minute=1;

year=1;

month=1;

date=1;

Naohour=1;

Naominute=1;

if(hour==0)

{

Show8X16(0,64,noshu,1);

Show8X16(0,72,noshu,1);

}

if(RD1==0)

{

d++;

if(d>0x17)d=0;

d=d/10*16+d%10;

W1302(0x84,d);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

d--;

if(d<0)d=0x17;

d=d/10*16+d%10;

W1302(0x84,d);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 4://设置日期

{

d=R1302(0x87);

d=d/16*10+d%16;

date=flag;

kaiguan=1;

second=1;

minute=1;

year=1;

month=1;

hour=1;

Naohour=1;

Naominute=1;

if(date==0)

{

Show16X32(2,24,noshu2);

Show16X32(2,40,noshu2);

}

if(RD1==0)

{

d++;

if(d>0x1f)d=1;

d=d/10*16+d%10;

W1302(0x86,d);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

d--;

if(d<1)d=0x1f;

d=d/10*16+d%10;

W1302(0x86,d);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 5://设置月

{

d=R1302(0x89);

d=d/16*10+d%16;

month=flag;

second=1;

kaiguan=1;

minute=1;

year=1;

hour=1;

date=1;

Naohour=1;

Naominute=1;

if(month==0)

{

Show8X16(2,2,noshu,0);

Show8X16(2,10,noshu,0);

}

if(RD1==0)

{

d++;

if(d>0x0c)d=1;

d=d/10*16+d%10;

W1302(0x88,d);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

d--;

if(d<1)d=0x0c;

d=d/10*16+d%10;

W1302(0x88,d);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 6://设置年

{

d=R1302(0x8d);

d=d/16*10+d%16;

year=flag;

kaiguan=1;

second=1;

minute=1;

month=1;

hour=1;

date=1;

Naohour=1;

Naominute=1;

if(year==0)

{

Show8X16(0,24,noshu,1);

Show8X16(0,32,noshu,1);

}

if(RD1==0)

{

d++;

if(d>0x63)d=0;

d=d/10*16+d%10;

W1302(0x8c,d);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

d--;

if(d<0)d=0x63;

d=d/10*16+d%10;

W1302(0x8c,d);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 7://

{

kaiguan=flag;

second=1;

minute=1;

year=1;

hour=1;

date=1;

month=1;

Naominute=1;

Naohour=1;

if(kaiguan==0)

{

Show8X16(4,111,noshu,1);

Show8X16(4,119,noshu,1);

}

if(RD1==0)

{

kk++;

kk=kk%2;

if(kk==0)Show16X16(4,111,guan,1);

if(kk==1)Show16X16(4,111,kai,1);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

kk--;

kk=kk%2;

if(kk==0)Show16X16(4,111,guan,1);

if(kk==1)Show16X16(4,111,kai,1);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 8://设置闹钟的小时数

{

Naohour=flag;

kaiguan=1;

second=1;

minute=1;

year=1;

hour=1;

date=1;

month=1;

Naominute=1;

if(Naohour==0)

{

Show8X16(4,64,noshu,1);

Show8X16(4,72,noshu,1);

}

if(RD1==0)

{

Naoling_hour++;

if(Naoling_hour>0x17)Naoling_hour=0;

ChangeToLCD(4,64,Naoling_hour,1);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

Naoling_hour--;

if(Naoling_hour<0)Naoling_hour=23;

ChangeToLCD(4,64,Naoling_hour,1);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 9://设置闹钟的分钟数

{

Naominute=flag;

kaiguan=1;

second=1;

minute=1;

year=1;

hour=1;

date=1;

month=1;

Naohour=1;

if(Naominute==0)

{

Show8X16(4,88,noshu,1);

Show8X16(4,96,noshu,1);

}

if(RD1==0)

{

Naoling_minute++;

if(Naoling_minute>0x3b)Naoling_minute=0;

ChangeToLCD(4,88,Naoling_minute,1);

while(1)

{

if(RD1==1)break;

}

}

if(RD2==0)

{

Naoling_minute--;

if(Naoling_minute<0)Naoling_minute=0x3b;

ChangeToLCD(4,88,Naoling_minute,1);

while(1)

{

if(RD2==1)break;

}

}

break;

}

case 0://设置完毕,不闪烁

{

second=1;

minute=1;

month=1;

hour=1;

date=1;

Naohour=1;

Naominute=1;

year=1;

kaiguan=1;

break;

}

}

}

/************************************************** * 标题:万年历

* 作者:Wujieflash

* 日期:2008年1月13日

* 说明:包含文件,

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

#include

//#include "ziku.h"

//#include "lcd_init.h"

#include "ds1302.h"

#include "ds18b20.h"

#include "keyscan.h"

//#include "yinli.h"

uchar jj,ii;

//子程序

//LCD显示空白边框子程序

void LCDShowTable()

{

uch i;

SlectScreen(1); //写左半屏

SetLine(0); //起使页

SetColumn(0); //起使列

for(i=0;i<64;i++)

{

if((i==0)||(i==63))WriteData(0xff);//第1、63列竖线

else WriteData(0x01); //最上面一行线

}

for(i=1;i<7;i++)

{

SetLine(i);

SetColumn(0);

WriteData(0xff); //竖线

SetColumn(63);

WriteData(0xff); //竖线

}

SetLine(7);

SetColumn(0);

for(i=0;i<64;i++)

{

if((i==0)||(i==63))WriteData(0xff);

else WriteData(0x80); //最下面的横线}

SlectScreen(2);//写右半屏

SetLine(0);

SetColumn(0);

for(i=0;i<64;i++)

{

if(i==63)WriteData(0xff);

else WriteData(0x01);

}

SetLine(4);

SetColumn(0);

for(i=0;i<64;i++)

{

if(i==63)WriteData(0xff);

else WriteData(0x01);

}

for(i=1;i<7;i++)

{

SetLine(i);

SetColumn(63);

WriteData(0xff);

}

SetLine(7);

SetColumn(0);

for(i=0;i<64;i++)

{

if(i==63)WriteData(0xff);

else WriteData(0x80);

}

}

/*----------------------------------------------------------*/

//显示固定字符子程序

void LCDShowGudingWord()

{

Show8X16(0,80,maohao,1);

Show8X16(0,104,maohao,1);

Show16X16(6,80,yue,2);

Show16X16(0,40,nian,1);

Show16X16(4,2,yue,0);

Show16X16(6,8,xing,2);

Show16X16(6,24,qi,2);

Show16X16(2,96,danwei1,0);

用java实现简单的万年历输出的代码

package clock; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Lunar { private int year; private int month; private int day; private boolean leap; final static String chineseNumber[] = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"}; static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy年MM月dd 日"); final static long[] lunarInfo = new long[] {0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520,

#基于单片机的多功能电子万年历设计

引言 随着生活节奏的日益加快,人们的时间观也越来越重,同时对电子钟表、日历的需求也随之提高。因此,研究实用电子时钟及其扩展使用,有着非常现实的意义,具有很大的实用价值。 本系统程序由主程序、中断服务函数和多个子函数构成。主函数主要完成各子函数和中断函数的初始化。定时中断函数主要完成时钟芯片的定时扫描及键盘扫描。时钟芯片的读写函数主要是将时间、日历信息读出来,并把要修改具体值写入时钟芯片内部。 系统的硬件设计和电路原理 电路设计框图 系统硬件概述 本电路是由AT89S52单片机为控制核心,具有在线编程功能、低功耗、能在3V的超低压工作。时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V~5.5V。采用三线接口和CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长、精度高和低功耗等特点,同时具有掉电自动保存功能。 主控制模块 单片机主控制模块的设计 AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。 时钟电路模块 时钟电路模块的设计 DS1302的引脚排列如图3所示,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

简单万年历设计

信电学院 电子信息工程专业CDIO一级项目项目设计说明书(2013/2014学年第一学期) 项目名称:简单万年历的设计 专业班级:电子信息工程 学生姓名: 学号: 指导教师: 设计周数:一周 设计成绩: 2013 年12 月29 日

目录 1项目设计目的及任务--------------------------------------------------------------2 2 设计方案--------------------------------------------------------------2 3 电路仿真与分析--------------------------------------------------------------9 4项目设计心得-------------------------------------------------------------17 5参考文献-------------------------------------------------------------17

1.项目设计目的及任务 用51单片机或52单片机为主体,设计并制作一台数字万年历。基本要求有时钟显示(时/分/秒);日期、星期显示,可设定月份;上电即可显示当前系统的时间该系统的设计电路是以 AT89C51单片机为核心控制器,其外围电路主要包括时钟模块,液晶模块,和与电脑主机通信模块等。通过 PC 机在 Internet 上同步时间,整个系统使用C语言进行编程,实现其设计的各种功能。输出方式灵活、功耗低、计时准确、性能稳定、维护方便等优点。实用电子时钟是一个时间控制系统,既能作为一般的时间显示器,同时可以根据需要扩展其功能。系统上电自检后,实时实现小时、分钟、秒以及日历的显示等指示信息的显示,通过按键可实现校对时间等功能。 2 设计方案 2.1总方案设计:设计简单万年历一般有三个可行方案,方案一:纯硬件电路系统,各功能采用分离的硬件电路模块实现。用时序逻辑电路实现时钟功能,用555定时器实现闹钟的设定。但这种实现方法可靠性差、控制精度低,灵活性小、线路复杂、安装调试不方便,而且不方便实现对系统的扩展。方案二:用可编程逻辑器件(PLD)实现。这种方案与前一种相比,可靠性增加,同时可以很好的完成时钟的功能。同时这种方案只能选用数码管显示,显示的效果不够理想,无法很好的完成扩展功能的要求。同时,系统的灵活性不够。方案三:采用单片机作为系统的控制核心。随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。集成技术的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行I/O口、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机。而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元、PWM控制输出单元、PWM输出时的死区可编程控制功能等。因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统,如工业流水线控制系统、作为家用电器的主控制器、分布式控制系统的终端节点或作为其主控制节点起中继的作用、数据采集系统、自动测试系统等。我们选用的是方案三。因为单片机的出现,并在各技术领域中得到如此迅猛的发展,与单片机构成计算机应用系统所形成的下述特点有关:

C语言课程设计万年历 完整版

目录 一引言 (2) 二系统功能和数据说明 (3) 一)功能简介 (3) 二)程序中的数据说明 (3) 三程序总体设计及流程图 (4) 一)应用到的c语言 (4) 二)程序的总框架 (5) 四功能模块设计及调试 (5) 一)算法说明 (5) 1.总天数的算法 (5) 2.计算输入日期是星期几 (6) 3.对输入信息的汇总 (8) 4..界面的控制 (10) 二)调试结果 (11) 五程序清单 (12) 六结束语 (17)

一引言 通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。 C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。 在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。通过这个小小的日历可以实现很多功能。在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的C 语言课程设计的具体内容来了

二系统功能和数据说明 (一)功能简介 在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。下面是它要实现的一些基本功能:用C语言编写万年历 1、输入年份,判断是否为闰年 2、输入年月日,判断改日为星期几 3、输入年份,打出12个月历,输入月份,打出该月的日历 4、要求用多个函数实现 [名称]万年历 [修改]1、对输入的日期进行容错处理 2、增加和修改为英文的月份和星期显示 3、采用指针形式的weeks和month数组 (二)程序中的数据说明 ①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。其中days[1]=28,是将闰年二月的天数28天作为初始元素存入。在经过theWeek函数后就可以给days[1]中存入正确的月天数。 ②char *weeks[7] ={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; char *months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November",

多功能电子万年历课程设计

课程设计(论文) 题目名称多功能电子万年历课程设计 课程名称单片机原理及应用 2012年6月18 日

摘要 本设计基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。 关键词:AT89C51;电子万年历; DS1302

目录 1 绪论 (1) 1.1课题研究的背景 (1) 1.2课题的研究目的与意义 (1) 1.3课题解决的主要内容 (1) 2 系统的总体设计 (1) 2.1系统方案构思 (2) 2.2系统硬件框图 (2) 3 系统硬件的设计 (3) 3.1.1 器件的选用 (3) 3.1.2 AT89C51单片机 (3) 3.1.3单片机的选择 (6) 3.1.4 显示电路 (7) 3.1.5 ds1302时钟电路 (11) 4 系统软件的设计 (14) 4.1 算法设计、流程图、主程序 (14) 4.2 从1302读取日期和时间程序 (15) 5 系统仿真 (16) 5.1仿真环境PROTEUS (16) 5.2用PROTEUS ISIS对电子万年历的硬件电路设计 (16) 5.3用PROTEUS ISIS进行电子万年历的仿真测试 (20) 结论 (23) 致谢 (24) 参考文献 (25) 附录 (26) 附录1 (26)

一个计算万年历的简单程序

一个计算万年历的简单程序 通常我们只知道生活当天的前后几天是星期几,即便是翻日历,也只能知道有限日期的星期数。那么有没有一种方法可以让我们知道任何一天是星期几呢?有,下面我将向大家介绍一种方法,用以编写万年历的程序。 首先我们必须约定一些法则,我们用Y、M、D分别表示年、月、日,用数字0-6分别表示星期日-星期六,这样我们就可以开始推导我们的公式了。 我们知道2002年9月1号为星期日,如果我们要想知道2002年9月10号为星期几,可以这样算:(0+(10-1))%7=(0+9)%7=2,即星期二。同样可算得2002年9月20号为:(0+(20-1))%7=(0+19)%7=5,即星期五。但是这样算需要把日期减1,不太方便,为了解决这个问题,我们可以假设每个月有一个0号,由于2002年9月1号为星期日,那么2002年9月0号为星期六,这样算9月10号,只需代入10既(6+10)%7=2。事实上,9月0号也就是8月31号,每个月0号的星期数实际上就是每个月1号的前一天的星期数。我把这个星期数称之为每个月的代码。有了这个代码,要算这个月任一天的星期数都好办了。 以上讨论的是一年中每个月的代码,事实上对于每年也有一个代码,这个代码就是每年1月0号(即1月1号的前一天)的星期数,也就是一月份的代码。如果我们能够找到每年的代码之间的关系,那么要计算万年历就易如反掌了。 (一)推算年的代码公式 我们都知道,平年一年有365天,即52周多1天。闰年为366天即52周多2天。我们先只考虑平年的情况。 假设第N年的代码为W,则第N+1年的代码为(W+1)%7,而第N+K年的代码则为(W+K)%7。这是因为从第N年到第N+K年共经过了K年,每过一年也就是过了52周余1天,经过K年也就是过了52*K周余K天,将多余的天数K加上第N年的代码W再对7取模,所得也就是第N+K年的代码了。 下面我们把闰年也考虑进来。判断闰年的规则是,能被4整除,并能被100和400同时整除的年份就是闰年。所以从第N年到第N+K年间共有K/4 -K/100+K/400个闰年,而每个闰年有52周余2天,要比平年多余了1天,即共多余了K/4-K/100+K/400天。我们应该把这些天也加进去,所以第N+K年的代码应为(W+K+K/4-K/100+K/400)%7。 这样子是不是就考虑完全了呢?并非如此,我们还有两点没考虑到。第一点是第N年是不是闰年。如果第N年是闰年的话,它本身就是52周余2天,而我们在上面却是把它当作平年来计算的,少算了1天,应加上。所以在第N年为闰年的时候上式应为 (W+(K+1)+K/4-K/100+K/400)%7。第二点是第N+K年是不是闰年。如果第N+K年是闰年,虽然它有52周余2天,但只有在算第N+(K+1)年的时候,才需要多加它那一天,而在算第N+K年的时候不需要多加这1天,因此我们必须将上式改为 (W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7(注意千万不能改为 (W+(K+1)+(K/4-K/100+K/400-1))%7=(W+K+K/4-K/100+K/400)%7)。 由此我们可以得出当第N年为闰年时,第N+K年的代码计算式为: A=(W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7 为了方便计算,我们可以取N为0,也就是假设公元元年的代码为W。因为公元元年也是闰年,符合上式,那么当我们输入的年份为Y时,此时就有K=Y,也就是说第Y年的代码为 A=(W+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7

c语言基础代码编写的简单的万年历程序

#include void print(int x,int y); //打印程序x表示这个月的总天数y表示这个月的1号的星期int month_day(int x,int y); //计算该月的天数x表示年份y表示月份 int run(int y); //判断闰年y表示年份 int month_cha(int x,int y); //每月一号的星期x表示年份y表示月份 int year_cha(int x); //每年的一月一号的星期x表示年份 void main() { int year,month,day,cha; char key='y'; while(key=='y') { printf("请输入年月:"); scanf("%d%d",&year,&month); day=month_day(year,month); cha=month_cha(year,month); print(day,cha); printf("是否继续输入(y/n):"); scanf("%c",&key); scanf("%c",&key); } } void print(int x,int y) { int i,j; printf("Sun Mon Tue Wed Thu Fri Sat\n"); for(i=0;i

} int run(int y) { int r; if(y%4!=0) r=0; else if((y%100==0)&&(y%400)!=0) r=0; else r=1; return r; } int month_day(int x,int y) { int day; switch(y) { case 1: day=31; break; case 2: day=28+run(x); break; case 3: day=31; break; case 4: day=30; break; case 5: day=31; break; case 6: day=30; break; case 7: day=31; break; case 8: day=31; break; case 9: day=30; break; case 10: day=31; break; case 11: day=30; break; case 12: day=31; break; } return day; } int month_cha(int x,int y) { int day; switch(y) { case 1: day=0; break; case 2: day=3; break; case 3: day=3+run(x); break; case 4: day=6+run(x); break;

电子万年历设计

课程论文论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级 2014级自动化3班 学生姓名孙宏远贾腾飞 学号 2016年12 月3 日

摘要: 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。。 关键词:AT89C51单片机,DS1602时钟芯片,LCD1602显示屏。串口通信。 一:引言 本设计的基于单片机控制的电子万年历,具有年、月、日、星期、时、分、秒的显示等功能,实现过程就是由主控制发送信息给DS1302时钟芯片再由时钟芯片反馈给单片机,再由主控制器传送给LCD1602显示屏显示信息。并且可以在键盘设置模块输入修改时间,当键盘设置时间、日期时,单片机主控制根据输入信息,通过串口通信传送给DS1302时钟芯片,DS1302芯片读取当前新信息产生反馈传送给单片机,然后单片机根据控制最后输送显示信息到LCD1602液晶显示屏模块上显示。 二:硬件设计: 2.0.硬件的设计总框图 2.1 DS1032时钟电路 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。芯片如图。 DS1302的内部主要由移位寄存器、指令和控制逻辑、振荡分频电路、实时时钟以及RAM组成。每次操作时,必须首先把CE置为高电平。再把提供地址和命令信息的8位装入移位寄存器。数据在SCLK的上升沿串行输入。无论是读周期还是写周期发生,也无论传送方式是单字节还是多字节,开始8位将指定内部何处被进行访问。在开始 8个时钟周期把含有地址信息的命令字装入移位寄存器之后。紧随其后的时钟在读操作时输出数据。 2.2 LCD1602与AT89C52的引脚接线 LCD1602采用总线式与单片机相连,AT89c52的P1口直接与液晶模块的数据总线D0~D7相连;P2 口的0,1,2脚分别与液晶模块的RS、RW、E脚相连。滑动变阻器用于调整液晶显示的亮度。电路如图

基于单片机C51的简单万年历设计

第十届学生科技节 -----单片机设计大赛 作品名称:万年历 专业:物联网 班级:1 指导老师:郑旭丹 组长:邓清兰学号:3112113111 组员:黄孟秋学号:3112113101

目录 一、绪论........................................... 0矚慫润厲钐瘗睞枥庑赖。 二、系统功能....................................... 0聞創沟燴鐺險爱氇谴净。 三、硬件电路....................................... 0残骛楼諍锩瀨濟溆塹籟。 3.1. 电路设计框图............................... 0酽锕极額閉镇桧猪訣锥。 3.2. 系统硬件概述............................... 1彈贸摄尔霁毙攬砖卤庑。 四、各模块功能及工作原理........................... 1謀荞抟箧飆鐸怼类蒋薔。 4.1. 单片机主控制模块的设计..................... 1厦礴恳蹒骈時盡继價骚。 4.2. LCD1602显示模块........................... 2茕桢广鳓鯡选块网羈泪。 4.3. 键盘模块................................... 5鹅娅尽損鹌惨歷茏鴛賴。 五、实现结果....................................... 8籟丛妈羥为贍偾蛏练淨。 六、系统的实用性及创新性........................... 9預頌圣鉉儐歲龈讶骅籴。 七、调节中遇到的问题及心得体会..................... 9渗釤呛俨匀谔鱉调硯錦。 八、程序设计...................................... 10铙誅卧泻噦圣骋贶頂廡。 8.1. 流程图.................................... 10擁締凤袜备訊顎轮烂蔷。 8.2. 源代码.................................... 11贓熱俣阃歲匱阊邺镓騷。 九、总结及感谢.................................... 23坛摶乡囂忏蒌鍥铃氈淚。

基于AT89C51单片机的多功能电子万年历的设计

. . .. . . 单片机应用系统设计 课题:基于AT89C51单片机的多功能电子万年 历的设计 姓名: 班级: 学号: 指导老师: 日期: .. .专

目录 一.绪言 (3) 二.系统总体方案设计 (3) 三.硬件系统设计: (4) 四.系统软件设计 (5) 五.设计总结 (8) 六.参考文献 (8) 七.附录 (9)

一.绪论 随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。 本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。 万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。 本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。 二.系统总体方案设计 1.系统设计硬件框图 2.实现的基本原理 在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给

多功能电子万年历课程设计报告

重庆三峡学院 课程设计报告书题目:基于可调的电子万年历与温度显示 学院(系): 年级专业: 学号: 学生姓名: 指导教师: 教师职称: 完成日期年月日

目录 摘要 (3) 第一章引言 (4) 1.1 设计任务 (4) 1.2 设计目的 (4) 1.3 设计思路 (4) 1.3.1 方案论证 (4) 1.3.2 芯片的选择 (5) 1.3.3 显示模块选择方案和论证 (5) 1.3.4 时钟信号的选择方案和论证 (5) 1.3.5 最终方案 (6) 第二章硬件系统的设计 2.1原理图设计 (6) 2.2温度感应电路 (7) 2.3 复位电路部分 (7) 2.4液晶显示电路 (7) 2.5时钟信号电路 (8) 2.6 AT89C52原理及说明 (8) 2.6.1引脚功能 (9) 第三章软件系统的设计. 3.1系统程序流程图 (9) 3.2系统具体程序代码 (10) 第四章系统调试 (23) 4.1 软件调试 (23) 4.2 硬件调试 (23) 第五章设计心得 (23) 元件清单表 (24) 致谢 (24) 参考文献 (24)

基于可调式电子万年历与温度显示的设计 重庆三峡学院应用技术学院 5人 摘要:本文介绍了一种基于单片机的可调的电子万年历和温度显示。该设计主要由五个模块组成:微处理器(单片机),温度传感器,控制调节按键,实时时钟模块及显示模块。温传感器器主要由DS18B20来完成,它负责把采集到的温度传给单片机。实时时钟模块主要由DS1302构成,它负责产生始终数据送给单片机,微处理器芯片AT89C52来完成DS18B20,DS1302,按键传来的数据进行处理,并送与显示模块(LCD1602)进行显示。 该系统的电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。可以测量-55°到+125°的温度和显示年,月,日,星期,时,分,秒,并且可通过按键调节时间。 关键词单片机;万年历;温度;AT89C52;LCD1602,DS1302,DS18B20

简易万年历的设计设计

漳州师范学院 简易万年历的设计 系别:物理与电子信息工程系 专业:电子信息科学与技术 2013年6月

目录 1. 设计任务 (4) 1.1设计任务 (4) 1.2设计要求 (4) 2.设计方案 (4) 2.1设计思路 (4) 2.2方案比较与论证 (4) 2.2.1 数码管显示模块 (4) 2.2.2 温度传感器的选择 (5) 2.2.3 时钟计时的选择 (5) 2.3系统结构框图 (6) 3.各功能模块设计 (6) 3.1显示模块原理 (6) 3.2参数计算 (7) 3.3独立式按键模块 (7) 3.4时钟模块 (8) 3.4.1 DS1302特性介绍 (8) 3.4.2 DS1302引脚介绍 (8) 3.4.3 DS1302有关日历、时间的寄存器 (9) 3.4.4 DS1302控制字介绍 (9) 3.4.5 DS1302单字节读写时序介绍 (10) 3.4.6 DS1302操作指令介绍 (11) 3.4.7 DS1302与单片机接口电路 (11) 3.5温测模块 (11) 3.5.1 单总线介绍 (11) 3.5.2 DS18B20特性介绍 (12) 3.5.3 DS18B20管脚介绍 (12) 3.5.4 DS18B20内部结构 (12) 3.5.5 DS18B20温度转化示例 (13) 3.5.6 DS18B20时序介绍 (13) 3.5.7 DS18B20操作步骤 (15) 3.5.8 DS18B20与单片机的接口电路 (16) 3.6总系统原理图 (16) 4.软件设计 (16) 4.1I/O口分配 (17) 4.2按键扫描 (17)

5.流程图 (17) 5.1主程序流程图 (17) 5.2 WORK0模块流程图 (18) 5.3 WORK1模块流程图 (18) 5.4 WORK2模块流程图 (19) 5.5获取温度子程序流程图 (19) 5.6按键扫描 (20) 5.7中断服务子程序 (21) 5.8显示方式1 (21) 5.9初始化DS1302子程序流图 (22) 5.10温显模块子程序流图 (22) 5.11读取时间模块子程序流图 (23) 6.程序代码 (23) 6.1主程序部分 (23) 6.2包含文件部分 (31) 6.3包含文件部分 (33) 7.调试要点 (41) 7.1硬件调试 (41) 7.2软件调试 (41) 7.3结果分析及设计工作总结 (41) 8.参考文献及附件 (42) 8.1参考文献 (42) 8.2元器件清单 (42) 8.3PCB版图 (42) 8.4实物图正面 (43) 8.5实物图背面 (44)

电子万年历设计

课程论文 论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级2014级自动化3班 学生姓名孙宏远贾腾飞 学号 2014485420144848 2016年12 月3 日

摘要: 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。。 关键词:AT89C51单片机,DS1602时钟芯片,LCD1602显示屏。串口通信。一:引言 本设计的基于单片机控制的电子万年历,具有年、月、日、星期、时、分、秒的显示等功能,实现过程就是由主控制发送信息给DS1302时钟芯片再由时钟芯片反馈给单片机,再由主控制器传送给LCD1602显示屏显示信息。并且可以在键盘设置模块输入修改时间,当键盘设置时间、日期时,单片机主控制根据输入信息,通过串口通信传送给DS1302时钟芯片,DS1302芯片读取当前新信息产生反馈传送给单片机,然后单片机根据控制最后输送显示信息到LCD1602液晶显示屏模块上显示。 二:硬件设计: 2.0.硬件的设计总框图 2.1 DS1032时钟电路 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。芯片如图。 DS1302的内部主要由移位寄存器、指令和控制逻辑、振荡分频电路、实时时钟以及RAM组成。每次操作时,必须首先把CE置为高电平。再把提供地址和命令信息的8位装入移位寄存器。数据在SCLK的上升沿串行输入。无论是读周期还是写周期发生,也无论传送方式是单字节还是多字节,开始8位将指定内部何处被进行访问。在开始 8个时钟周期把含有地址信息的命令字装入移位寄存

电子万年历

河北科技师范学院课程设计说明书 题目: 学院(系): 年级专业: 学号: 学生姓名: 指导教师:

摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机8052来实现电子万年历的功能。该电子万年历能够成功实现时钟运行,调整,显示年月日时分秒及星期,温度等信息。 该电子万年历使用12MHZ晶振与单片机8052相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。所以在该设计与制作中我选用了单片机8052,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, 单片机8052的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。 因此,采用单片机8052原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要,对我们大学生来说也更加有用。

利用单片机制作简单万年历

国家职业资格全国统一鉴定 (国家职业资格二级) 家用电子产品维修工 论文题目:利用单片机制作简单万年历编号:13

利用单片机制作简单万年历 摘要:随着时代科技的发展,从摆钟到电子时钟,时代在进步,科技在不断地创新,本文设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在硬件设计方面,该电路采用AT89C52单片机作为核心,功耗小,计时模块采用DS1302d时钟电路,它的特点是寿命长,误差小,在显示方面,采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见;在软件设计方面,应用c语言编写程序,它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。在设计同时对单片机的理论基础和外围扩展知识进行了很好的实现。 关键词:AT89C52 DS1302 LCD1602

目录 1、前言 (4) 2、方案设计 (4) 2.21 主控模块设计 (5) 2.22 时钟电路模块设计 (6) 2.23 按键电路模块设计 (6) 2.24 显示模块设计 (7) 2.31 主程序设计 (7) 2.32 LCD1602显示软件设计 (8) 2.33 按键程序设计 (9) 2.34 DS1302时钟程序模块设计 (9) 3、测试与结果分析 (10) 4、软件仿真 (10) 5、结束语 (11) 参考文献 (13)

1、前言 据了解,目前市场上的电子万年历并不是采用51单片机作为主控制器的,基于单片机的万年历一般是学生和单片机爱好者在进行设计,谈不上占有市场。也许就是这样,研究单片机万年历的人不在少数,并且都在努力。努力不是单方面的,单片机的功能也应该要提高,STC89C52单片机就是这样的例子,其功能虽然没有大幅度提高,但使用起来更方便了。我相信,在不久的将来肯定会有功能更强大成本更低的单片机出现,给我们的设计带来更多的便利。 本设计采用的是AT89S52单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP 在系统烧写功能,使得烧写程序更加方便。 计时芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。总体来说,本设计成本消耗不高,功能设计也比较简单实现。 2、方案设计 2.1 总体设计思路 本设计包括硬件和软件设计两个部分。模块划分为主控模块、时钟电路模块、显示模块等子模块。软件方面可划分为:液晶显示程序、时钟调节程序、按键控制程序等管理软件组成。用户终端对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能。它们之间的构成框图系统设计框图如图1所示。

电子万年历

Tianjin University of Technology and Education 课程设计 学院:电子工程学院 班级:应电1211班 学生姓名:马登桂(01) 张婵(20) 李春鹏(22) 指导教师:马宁梁彩凤 2015年7月

天津职业技术师范大学 应电专业课程设计任务书 电子工程学院应电1211 班学生: 课程设计课题: 一、课程设计工作日自 2015 年 7 月 6 日至 2015 年 7 月 24日 二、同组学生: 三、课程设计任务要求: 要求全班同学每3人一组自由分组,每组在下列题目中任选2题,完成电路设计仿真、硬件焊接以及软件的编程与调试(统一采用AT89系列单片机): 题目1:基于单片机的多功能计算器设计题目(显示设备采用1602液晶模块) 基本要求:以4×4键盘作为输入,通过软件设计实现加减乘除计算功能,并显示; 扩展功能:进一步实现乘方、开方、对数、阶乘等科学计算功能。 题目2:基于单片机的电子万年历设计(显示设备采用1602液晶模块) 基本要求:通过软件设计实现年月日时间显示及时间设定等功能; 扩展要求:进一步实现定时闹钟功能。 题目3:基于单片机的温度采集显示电路设计(显示设备采用4位数码管) 基本要求:实现用DS18B20采集温度,并实时显示; 扩展要求:进一步实现预设温度告警功能。 指导教师:梁彩凤、马宁

目录

1基于单片机的电子万年历设计 1.1设计任务 基本要求:通过软件设计实现年月日时间显示及时间设定等功能; 扩展要求:进一步实现定时闹钟功能。 1.2 设计方案 1.2.1总体方框图 图1.1总体方框图 1.2.2整体功能说明: 本论文一主要研究基于单片机的万年历设计。当程序执行后,LCD显示即时时间、年月日、星期、温度。设置3个操作键:K1:设置键;K2:上调键;K3:下调键。本设计的主要内容:1、了解单片机技术的发展现状,熟悉万年历各模块的工作原理;2、选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;3、熟悉单片机使用方法和C语言的编程规则,编写出相应模块的应用程序;4、分别在各自的模块中调试出对应的功能,在Proteus软件上进行仿真。 1.3电路设计与分析

java万年历制作

一、设计内容和要求 1、简单万年历的基本要求 本程序的要求为:1.使用图形用户界面;2.本程序能够实现日期与星期的查 询。 2、需要实现的主要功能 (1). 能够显示实现1800-2100年的日期,包括公历、农历、星期、二十四节气。 (2). 能够按照月份格式显示,或按照星期格式显示。 (3). 能够显示系统时间。 (4). 能够设置闹钟。 (5). 能够查询若干国际大城市(分布在不同时区)的时间。 二、系统分析与概要设计 1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否 为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。 2. 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为 星期几,若是7,则为星期日。 3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几 后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。 4. 如果年份小于1900年则程序不予判断 5.公历与农历的换算。公历年对应的农历数据,每年三字节,格式第一字 节BIT7-4 位表示闰月月份,值为0 为无闰月,算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在闰年又不到3 月份上述之和要减一天再除7星期数为0。 6、系统时间的设置。直接从系统得到时间,设置字体,背景,显示框架

相关主题