万年历——C++代码
- 格式:ppt
- 大小:6.45 MB
- 文档页数:11


#define uint unsigned int#define uchar unsigned charuchar code tab[]=" 20 - - " ;uchar code table[]=" : : ";uchar code ttable[]={"Now temperature:"} ;sbit RS=P3^0;sbit E=P3^1;sbit button1=P1^0;sbit button2=P1^3;sbit button3=P1^6;sbit RST=P2^5;sbit SCLK=P2^6;sbit IO=P2^7;sbit ACC7=ACC^7;sbit DQ=P3^6;char hour,minute,second,n,k,week,day,month,year1=20 ,year,nn,flag; uchar key=0;uint tem,a;void delay(uint x){while(x--);}void write_zl(uchar zl){E=0;RS=0;P0=zl;E=1;delay(500);E=0;}void write_sj(uchar sj){E=0;RS=1;P0=sj;E=1;delay(500);E=0;}void init_lcd(){write_zl(0x38);//开显示write_zl(0x01);//清屏write_zl(0x06);//整屏不移动write_zl(0x0C);//不开光标}/*18B20*/部分void init_18b20(){ DQ=1;delay(8); //延时DQ=0;delay(80);DQ=1;delay(20);}void write_dat(uchar dat){ uchar i,k;k=dat;for(i=0;i<8;i++){ DQ=0;DQ=k&0x01;//从低位开始delay(5);DQ=1;k>>=1;}delay(4);}int read_sj(){uchar j,date;for(j=0;j<8;j++){DQ=1;delay(1);DQ=0;date=date>>1;DQ=1;if(DQ==1) //date|=0x80;delay(4);}return(date);}void temperaturechange(){ uint tempH,tempL;init_18b20();write_dat(0xcc);//只对一个操作就跳过读序列号操作write_dat(0x44); //启动温度转换delay(60000);delay(33750);//需要93.75msinit_18b20();write_dat(0xcc);write_dat(0xbe);//读温度寄存器tempL=read_sj();//读取温度低位LSBtempH=read_sj();//读取温度高位MSBif(tempH&0x80) //高5位是1为负数{ a=1;tem=tempH;tem<<=8; //共16位tem=tem|tempL; //合并高低位数tem=~tem+1;tem=tem*(0.0625);}else{a=0;tem=((tempH*256)+tempL)*0.0625;//转换实际温度}}void write_temperature(uint temp) //被调用的函数必须在前{ uint bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%10;if(a==1){ if(shi>0){write_zl(0x80+0x50+3);write_sj('-');write_zl(0x80+0x50+4);write_sj(0x30+shi); }else{write_zl(0x80+0x50+3);write_sj(0x00);write_zl(0x80+0x50+4);write_sj('-');}}else{if(bai>0) //若bai显示shi肯定显示{write_zl(0x80+0x50+3);write_sj(0x30+bai);write_zl(0x80+0x50+4);write_sj(0x30+shi);}else{if(shi>0) //否则判断shi是否显示{write_zl(0x80+0x50+4);write_sj(0x30+shi);}else{write_zl(0x80+0x50+4);write_sj(0x00);}write_zl(0x80+0x50+3);write_sj(0x00);}}write_zl(0x80+0x50+5); //个位公用总的显示write_sj(0x30+ge);}/*DS1302部分*/void DS1302_write(uchar shju){ uchar s,j;s=shju;for(j=0;j<8;j++){ IO=s&0x01;SCLK=0;SCLK=1;s=s>>1;}}uchar DS1302_readbyte(){ uchar i,R=0;SCLK=0;delay(10);for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;SCLK=1;SCLK=0;}return(ACC);/*{R=R>>1;if(IO==1)R=R|0x80;SCLK=1;SCLK=0;}return(R); */}void DS1302write(uchar dz,uchar shij)//初始化1302{ RST=1;SCLK=0;DS1302_write(dz);DS1302_write(shij);SCLK=1;RST=0;}void start1302(){ uchar num;for(num=0;num<13;num++){ write_sj(tab[num]);}for(num=13;num<16;num++){ write_sj(tab[num]);}write_zl(0x80+0x40);for(num=0;num<12;num++){ write_sj(table[num]);}}void write_hms(uchar add,uchar sj) //被调用的函数必须在前{ uchar shi,ge;shi=sj/10;ge=sj%10;write_zl(0x80+0x40+add);write_sj(0x30+shi);write_sj(0x30+ge); }void write_nyr(uchar add,uchar sj){ uchar shi,ge;shi=(sj/10);ge=(sj%10);write_zl(0x80+add);write_sj(0x30+shi);write_sj(0x30+ge); }void write_XQ(uchar wk){ write_zl(0x80+13);switch(wk){ case 2: write_sj('M'); write_sj('O');write_sj('N'); break;case 3: write_sj('T'); write_sj('U');write_sj('E'); break;case 4: write_sj('W'); write_sj('E');write_sj('D'); break;case 5: write_sj('T'); write_sj('H');write_sj('U'); break;case 6: write_sj('F'); write_sj('R');write_sj('I'); break;case 7: write_sj('S'); write_sj('A');write_sj('T'); break;case 1: write_sj('S'); write_sj('U');write_sj('N'); break;}}void write_day(uchar rue){switch(rue){case 1: nn=31;break;case 2: if((year%4==0&&year%100!=0)||year%400==0) nn=29;elsenn=28;break;case 3: nn=31;break;case 4: nn=30;break;case 5: nn=31;break;case 6: nn=30;break;case 7: nn=31;break;case 8: nn=31;break;case 9: nn=30;break;case 10: nn=31;break;case 11: nn=30;break;case 12: nn=31;break;}}void keyboard(){if(button1==0){ delay(5);if(button1==0){ while(button1==0);key++; flag=1;switch(key){ case 1: write_zl(0x80+0x40+10);write_zl(0x0f); break;//shan shuocase 2: write_zl(0x80+0x40+7); break;case 3: write_zl(0x80+0x40+4); break;case 4: write_zl(0x80+10); break;case 5: write_zl(0x80+7); break;case 6: write_zl(0x80+4); break;case 7: write_zl(0x80+2); break;case 8: key=0;write_zl(0x0c);flag=0;DS1302write(0x80,second);DS1302write(0x82,minute);DS1302write(0x84,hour);DS1302write(0x86,day);DS1302write(0x88,month);DS1302write(0x8A,week);DS1302write(0x8C,year);break;}}}if(button2==0){ delay(10);if(button2==0){ while(button2==0);switch(key){case 1: second++;if(second==60)second=0;write_hms(10,second); write_zl(0x80+0x40+10); break; case 2: minute++;if(minute==60)minute=0;write_hms(7,minute);write_zl(0x80+0x40+7); break; case 3: hour++;if(hour==24)hour=0;write_hms(4,hour); write_zl(0x80+0x40+4); break; case 4: day++;week++;if(week==8)week=1;write_XQ(week);write_day(month); if(day==nn+1)day=1;write_nyr(10,day);write_zl(0x80+10); break;case 5: month++;if(month==13)month=1;write_nyr(7,month);write_zl(0x80+7); break;case 6: year++ ;if(year==100)year=0;write_nyr(4,year);write_zl(0x80+4); break;case 7: year1++ ;if(year1==100)year1=0;write_nyr(2,year1);write_zl(0x80+2); break;}}}if(button3==0){delay(10);if(button3==0){ while(button3==0);switch(key){case 1: second--;if(second<0)second=59;write_hms(10,second); write_zl(0x80+0x40+10); break;case 2: minute--;if(minute<0)minute=59;write_hms(7,minute);write_zl(0x80+0x40+7); break;case 3: hour--;if(hour<0)hour=23;write_hms(4,hour);write_zl(0x80+0x40+4); break;case 4: week--;if(week==0)week=7;write_XQ(week);day--; write_day(month); if(day==0)day=nn;write_nyr(10,day);write_zl(0x80+10); break;case 5: month--;if(month==0)month=12;write_nyr(7,month);write_zl(0x80+7); break;case 6: year-- ;if(year<0)year=99;write_nyr(4,year);write_zl(0x80+4); break;case 7: year1-- ;if(year1<0)year1=99;write_nyr(2,year1);write_zl(0x80+2); break;}}}}void DS1302_sfm(){ uchar a,b;RST=1; //高电平期间启动一次数据转换DS1302_write(0x81);second=DS1302_readbyte();RST=0;// 结束转换a=second/16;//BCD码转换b=second%16;second=a*10+b;write_hms(10,second);//分RST=1;DS1302_write(0x83);minute= DS1302_readbyte();a=minute/16;b=minute%16;minute=a*10+b;write_hms(7,minute);RST=0;//时RST=1;DS1302_write(0x85);hour= DS1302_readbyte(); RST=0;a=hour/16;b=hour%16;hour=a*10+b;write_hms(4,hour);//日RST=1;DS1302_write(0x87);day= DS1302_readbyte(); RST=0;a=day/16;b=day%16;day=a*10+b;write_nyr(10,day);//月RST=1;DS1302_write(0x89); month= DS1302_readbyte(); RST=0;a=month/16;b=month%16;month=a*10+b;write_nyr(7,month);// 周RST=1;DS1302_write(0x8B);week= DS1302_readbyte(); RST=0;a=week/16;b=week%16;week=a*10+b;write_XQ(week);// 年SCLK=0;delay(5);RST=1;DS1302_write(0x8D);IO=1;year= DS1302_readbyte(); RST=0;delay(5);SCLK=1;a=year/16;b=year%16;year=a*10+b;write_nyr(4,year);}/* 总程序*/#include<reg51.h>#include<init.h>#include<ds1302.h>#include<18b20.h>void main(){init_lcd();start1302();while(1){RST=0;keyboard();if(flag==0) //标志位为0才能读取1302,否则按键无效DS1302_sfm();write_zl(0x80+0x10);for(n=0;n<16;n++)write_sj(ttable[n]);temperaturechange();write_temperature(tem);}}。
#include "reg52.h"#include "absacc.h"#define LED P0#define DIG P2#define key_io P1void display();void key_scan(void);void key_scan_proc(void);void display_one();unsigned char k = 0;unsigned char key_flag;unsigned char key_return;unsigned char t = 0;unsigned char disp_flag;unsigned char disp_num;unsigned char bell_flag;unsigned char set[6];unsigned char set_time[6];unsigned char disp[7];sbit CLK = P3^4; /*实时时钟时钟线引脚*/ sbit IO = P3^5; /*实时时钟数据线引脚*/ sbit RST = P3^6; /*实时时钟复位线引脚*/ sbit dq = P1^4; /*ds18b20*/sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;//sbit key1 = P1^0;//sbit key2 = P1^1;//sbit key3 = P1^2;//sbit key4 = P1^3;sbit light = P3^0;sbit bell = P3^7;/**********************************************************延时子函数**********************************************************/ void delay(unsigned char dly){while(dly--);}/***********************************************************向DS1302写入1Byte数据***********************************************************/ void InputByte(unsigned char ucDa){unsigned char i;ACC = ucDa;for(i=8; i>0; i--){IO = ACC0;CLK = 1;CLK = 0;ACC >>= 1;}}/***********************************************************从DS1302读取1Byte数据***********************************************************/ unsigned char OutputByte(void){unsigned char i;for(i=8; i>0; i--){ACC >>= 1;ACC7 = IO;CLK = 1;CLK = 0;}return(ACC);}/***********************************************************向DS1302指定地址写数据***********************************************************/ void W_1302(unsigned char Addr, unsigned char Da){RST = 0;CLK = 0;RST = 1;InputByte(Addr); //写地址InputByte(Da); //写1Byte数据CLK = 1;RST =0;}/***********************************************************读取DS1302某地址的数据***********************************************************/ unsigned char R_1302(unsigned char Addr){unsigned char Da;CLK = 0;RST = 0;RST = 1;InputByte(Addr); // 地址,命令Da = OutputByte(); //读1Byte数据RST =0;CLK = 1;return(Da);}/*************************************************************初始化ds18b20*************************************************************/ void rst_18b20(void){dq=1;delay(8);dq=0;delay(80);dq=1;delay(35);}/*************************************************************读ds18b20一个byte数据*************************************************************/ unsigned char read_18b20(void){unsigned char i,dat=0;for(i=0;i<=7;i++){dq=0;dat>>=1;dq=1;if(dq==1)dat|=0x80;delay(4);}return(dat);}/*************************************************************向ds18b20写入一个byte 数据**************************************************************/ void write_18b20(unsigned char dat){unsigned char i;for(i=0;i<8;i++){dq=0;dq=dat&0x01;delay(5);dq=1;dat>>=1;}}/**************************************************************读取温度值ds18b20**************************************************************/ unsigned int read_T(void){unsigned int t=0; //16 bitunsigned char t0=0,t1=0;float temp=0; //32 bitrst_18b20();write_18b20(0xcc);write_18b20(0x44);rst_18b20();write_18b20(0xcc);write_18b20(0xbe);t0=read_18b20();t1=read_18b20();t=t1;t<<=8;t=t+t0;t>>=4;/*t = (t0>>1);temp=t*0.0625;t=temp*10+0.5;*/return(t);}void main(void){W_1302(0x8e,0x00);//开保护W_1302(0x8c,0x09);//yearW_1302(0x8a,0x05);//weekW_1302(0x88,0x05);//mouthW_1302(0x86,0x29);//dateW_1302(0x84,0x15);//hourW_1302(0x82,0x59);//minuteW_1302(0x80,0x00);//secondW_1302(0x8e,0x80);//写保护TMOD = 0x01;TH0 = 0xFa;TL0 = 0xFF;EA = 1;ET0 = 1;TR0 = 1;bell = 1;disp_flag = 0;disp_num = 0;key_flag = 0;bell_flag = 0;while(1){while(disp_flag==0){display();if(light==0){DIG = 0X00;disp_flag = 2;}}while(disp_flag==1)display_one();if(light==1)disp_flag = 0;}}/*********************************************************扫描显示函数*********************************************************/ void display(void){switch(k){case 0:LED = (disp[0]&0XF0)+(disp[4]>>4);DIG = 0X80;break;case 1:LED = (disp[0]<<4)+(disp[4]&0X0F);DIG = 0X40;break;case 2:LED = (disp[1]&0X10)+(disp[5]>>4);DIG = 0X20;break;case 3:LED = (disp[1]<<4)+(disp[5]&0X0F);DIG = 0X10;break;case 4:LED = (disp[2]&0X30)+(disp[6]>>4);DIG = 0X08;break;case 5:LED = (disp[2]<<4)+(disp[6]&0X0F);DIG = 0X04;delay(15);break;case 6:LED = 0xf0+t/10;DIG = 0X02;break;case 7:LED = (disp[3]<<4)+t%10;DIG = 0X01;//while(1);break;case 8:DIG = 0X00;if(key_flag==0){t = read_T();disp[0]=R_1302(0x8d); //yeardisp[1]=R_1302(0x89); //monthdisp[2]=R_1302(0x87); //datadisp[3]=R_1302(0x8b); //weekdisp[4]=R_1302(0x85); //hourdisp[5]=R_1302(0x83); //mintedisp[6]=R_1302(0x81); //secondif((disp[4]==set_time[0])&&(disp[5]==set_time[1])){bell = 0;}else bell = 1;}key_scan();break;}}void display_one(){key_scan();switch(disp_num){case 1:{DIG = 0x00;LED = (disp[0]&0XF0)+0x0f;DIG = 0X80;delay(100);DIG = 0x00;LED = (disp[0]<<4)+0x0F;DIG = 0X40;delay(100);break;}case 2:{DIG = 0x00;LED = (disp[1]&0X10)+0x0f;DIG = 0X20;delay(100);DIG = 0x00;LED = (disp[1]<<4)+0x0F;DIG = 0X10;delay(100);break;}case 3:{DIG = 0x00;LED = (disp[2]&0Xf0)+0x0f;DIG = 0X08;delay(100);DIG = 0x00;LED = (disp[2]<<4)+0x0F;DIG = 0X04;delay(100);break;}case 4:{DIG = 0x00;LED = 0xff;DIG = 0X00;delay(100);DIG = 0x00;LED = (disp[3]<<4)+0x0F;DIG = 0X01;delay(100);break;}case 5:{DIG = 0x00;LED = (disp[4]>>4)+0xF0;DIG = 0X80;delay(100);DIG = 0x00;LED = (disp[4]&0x0F)+0xF0;DIG = 0X40;delay(100);break;}case 6:{DIG = 0x00;LED = (disp[5]>>4)+0xF0;DIG = 0X20;delay(100);DIG = 0x00;LED = (disp[5]&0x0F)+0xF0;DIG = 0X10;delay(100);break;}}}/***********************************************************按键识别程序***********************************************************/ void key_scan(void){unsigned char key_data = 0;key_io = 0xff;key_data = key_io&0x0f;if(key_data == 0xff)key_flag = 0;else{delay(30);key_io = 0xff;if(((key_io&0x0f) != 0x0f)&&((key_io&0x0f) == key_data)){while(key_io != 0xff);switch (key_data){case 0x0e : {key_return = 0;key_flag = 1;break;}case 0x0d : {key_return = 1;key_flag = 1;break;}case 0x0b : {key_return = 2;key_flag = 1;break;}case 0x07 : {key_return = 3;key_flag = 1;break;}default : break;}}if(key_flag==1){disp_flag = 1;key_flag = 0;key_scan_proc();}}}/***************************************************************按键函数***************************************************************/ void key_scan_proc(void){ int set;switch (key_return){case 0:{disp_num+=1;if(disp_num==7){W_1302(0x8e,0x00);//开保护W_1302(0x8c,disp[0]);//yearW_1302(0x8a,disp[3]);//weekW_1302(0x88,disp[1]);//mouthW_1302(0x86,disp[2]);//dateW_1302(0x84,disp[4]);//hourW_1302(0x82,disp[5]);//minuteW_1302(0x80,0x00);//secondW_1302(0x8e,0x80);//写保护disp_flag = 0;disp_num = 0;}break;case 1:{set = (disp[disp_num-1]>>4)*10+(disp[disp_num-1]&0x0f)-1;if(disp_num==1&&set==-1)set=99;else if(disp_num==2&&set==0)set=12;else if(disp_num==3&&set==0){if(disp[1]==2)set = 29;elseif(disp[1]==1||disp[1]==3||disp[1]==5||disp[1]==7||disp[1]==8||disp[1]==0x10||disp[1] ==12)set = 31;else if(disp[1]==4||disp[1]==6||disp[1]==9||disp[1]==0x11)set = 30;}else if(disp_num==4&&set==0)set=7;else if(disp_num==5&&set==-1)set=23;else if(disp_num==6&&set==-1)set=59;disp[disp_num-1]=((set/10)<<4)+(set%10);break;}case 2:set = ((disp[disp_num-1]>>4)*10+(disp[disp_num-1]&0x0f))+1;if(disp_num==1&&set==100)set=0;else if(disp_num==2&&set==13)set=1;else if(disp_num==3){if(set==30&&disp[1]==2)set = 1;elseif(set==32&&(disp[1]==1||disp[1]==3||disp[1]==5||disp[1]==7||disp[1]==8||disp[1]== 0x10||disp[1]==12))set = 1;elseif(set==31&&(disp[1]==4||disp[1]==6||disp[1]==9||disp[1]==0x11))set = 1;}else if(disp_num==4&&set==8)set=1;else if(disp_num==5&&set==24)set=0;else if(disp_num==6&&set==60)set=0;disp[disp_num-1]=((set/10)<<4)+(set%10);break;}case 3:{disp_flag = 1;bell_flag = 1;switch(disp_num){case 0: { disp_num = 5;break;}case 5:{ disp_num = 6;break;}case 6: {set_time[0] = disp[4];set_time[1] = disp[5];disp_flag = 0;bell_flag = 0;disp_num = 0;break;}}break;}default :break;}}/*************************************************************定时器中断函数*************************************************************/ void timer0() interrupt 1{TH0 = 0xFC; TL0 = 0xFF; k++;if(k==20){k =0;}}。