文档库 最新最全的文档下载
当前位置:文档库 › 我做的万年历..

我做的万年历..

#include

#define uint unsigned int

#define uchar unsigned char

sbit k1=P3^1;//按键1

sbit k2=P3^2;//按键2

sbit k3=P3^7;//按键2

sbit k4=P3^3;//按键2

sbit Q=P3^6;//蜂鸣器接口

sbit dat=P1^4;//1302的数据端

sbit res=P1^3;//使能端

sbit clk=P1^7;//时钟端

sbit DS=P3^4;//18B20

int temp;

sbit rs=P1^0;//液晶

sbit rw=P1^1;///液晶

sbit e=P1^2; //液晶

uchar code disdata[3];//18B20

void tmpchange(void); //1820

void display_7(tem);//1820

uchar read[7]={0,0,0,0,0,0,0};

uchar write[7]={0x40,0x59,0x23,0x01,0x07,0x05,0x13};//写时间,秒,分,时,日,月,周,年

uchar code table7[]="欢迎使用我的万年";//每个汉字2个字节

uchar code table8[]="历";//每个汉字2个字节

uchar code table9[]= "welcome you";//每个汉字2个字节

uchar code table10[]="My name is ";//每个汉字2个字节

//"12345678

uchar code table11[]=" ";//每个汉字2个字节

uchar code table12[]="学号1001904012 ";//每个汉字2个字节

uchar code table13[]=" ";//每个汉字2个字节

uchar code table14[]="学号1001904045";//每个汉字2个字节

uchar code table15[]="现在进入日历显示";//每个汉字2个字节

uchar code table16[]=" ";//每个汉字2个字节

uchar code table17[]=" ";//每个汉字2个字节

uchar code table18[]="温度检测欢迎使用";//每个汉字2个字节

uchar code table3[]=" 2000年00月00日";//每个汉字2个字节

uchar code table4[]=" 00时00分00秒";//每个汉字2个字节

uchar code table5[]="温度:00 度";//每个汉字2个字节

uchar code table6[]="星期: 00 ";//每个汉字2个字节

void display(uchar);

void display_1(void);

void display_2(void);

void display_3(void);

void display_4(void);

void display_5(void);

void display_6(void);

void display7(uint);

void display_8(void);

void display_9(void);

void display_10(void);

void display_11(void);

void display_12(void);

void display_13(void);

void display_14(void);

void display_15(void);

void display_16(void);

void display_17(void);

void dsreset(void);

int tmp();

uint i,temp1,temp2,tvalue,wed=340,xia=310; //温度上线时35度,下线30度uchar n=0;

void tmpchange(void) ;

void tmpwritebyte(uchar dat);

uchar tmpread(void);

bit tmpreadbit(void) ; //发送温度转换命令

void write_command(uchar com);

void write_data(uchar dat);

void LCD_init();

void fengming();//蜂鸣器

//void baoshi();

void delayms(uint j)

{

uint i,k;

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

for(k=114;k>0;k--);

}

void delayus(uint i)

{

while(i--);

}

void delayb(uchar z)

{

uint i;

while(z)

{

i=200;

while(i>0)i--;

z--;

}

}

void delay_50us(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void delay_50ms(uint t)//延时函数

{

uint j;

for(;t>0;t--)

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

}

void fengming()

{ Q=0;

delay_50ms(1);

Q=1;

}

/********lcd函数×××××***********///////////////////

void write_command(uchar com)//写指令函数void write_data(uchar dat)//写数据函数void LCD_init()

{

rw=0;

rs=0;//rs=0时是写指令;

delay_50us(1);

P2=com;

e=1;

delay_50us(10);

e=0;

delay_50us(2);

}

void write_data(uchar dat)//写数据函数void LCD_init()

{

rw=0;

rs=1;//rs=1时是写指令shu ju;

delay_50us(1);

P2=dat;

e=1;

delay_50us(10);

e=0;

delay_50us(2);

}

void LCD_init()

{//delay_50ms(2);

write_command(0x01);//清除显示

delay_50us(4);

write_command(0x03);//地址归为

delay_50us(4);

write_command(0x0e);//整体显示开,开游标,游标不反白delay_50us(4);

write_command(0x01);//清除显示

delay_50us(240);

write_command(0x06);//模式设计

delay_50us(10);

write_command(0x80);//整板显示

delay_50us(10);

}

/********1864显示函数×××××***********/////////////////// void display(uchar date)

{

uchar ge,shi;

shi=date/16;

ge=date%16;

write_data(shi+0x30);

write_data(ge+0x30);

}

/********1302部分函数×××××***********/////////////////// void write_byte(uchar temp)

{

uchar i;

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

{

clk=0;

delayus(5);

if(temp&0x01)

dat=1;

else

dat=0;

clk=1;

delayus(5);

temp>>=1;

}

}

uchar read_byte()

{

uchar i,temp=0;

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

{

clk=0;

delayus(5);

dat=0;

temp>>=1;

if(dat)

temp|=0x80;//1000 0000

else

temp&=0x7f;//0111 1111 clk=1;

delayus(5);

}

return temp;

}

void write_date(uchar addr,uchar date) {

res=0;

clk=0;

delayus(5);

res=1;

delayus(5);

write_byte(addr);

delayus(1);

write_byte(date);

res=0;

delayus(5);

}

uchar read_date(uchar addr)

{

uchar dat;

res=0;

clk=0;

delayus(5);

res=1;

delayus(5);

write_byte(addr);

delayus(5);

dat=read_byte();

res=0;

delayus(5);

return dat;

}

void ReadTime()

{

write_date(0x8f,0x80);//禁止写入

read[0]=read_date(0x81);//读取秒寄存器的数据

read[1]=read_date(0x83);//读取分钟寄存器的数据

read[2]=read_date(0x85);//读取小时寄存器的数据

read[3]=read_date(0x87);//读取日期寄存器的数据

read[4]=read_date(0x89);//读取月寄存器的数据

read[5]=read_date(0x8b);//读取星期寄存器的数据

read[6]=read_date(0x8d);//读取年寄存器的数据

}

void SetTime()

{ uint shi,ge,shi1,shi3,shi4,shi5,ge1,shi2,ge2,ge3,ge4,ge5,a=13,b;

uint year,yue,ri,n=0,a1=7,b1,a2=1,b3,a4=8,b4,a5=30,b5,a6=30;

uint b7,a7=3,shi6,ge6;

// write_date(0x84,write[2]);//时

//write_date(0x86,write[3]);//日

while(k1!=0)

{ write_date(0x8e,0x00);//可以写入

write_command(0x0e);//整体显示开,开游标,游标不反白

if(k2==0)

{

fengming();

delay_50ms(4);

n++;

}

if(n>9)

{n=1;}

/************************设置年**************************/ if(n==1)

{

write_command(0x0f);//整体显示开,开游标,游标反白

if(k3==0)////////////////

{

fengming();

delay_50ms(4);

a++;

}

if(k4==0)

{

fengming();

delay_50ms(4);

a--;

}

b=a/10*16+a%10;//转变成16进制

write_date(0x8c,b);//nian

ReadTime(); //1302

write_command(0x82);//地址,定在哪显示

shi=a/10;

ge=a%10;

year=20*100+shi*10+ge;

write_data(shi+0x30);

write_data(ge+0x30);; //年}

}

/************************设置月**************************/ if(n==2)

{

write_command(0x0f);//整体显示开,开游标,游标反白

if(k3==0)//设置月

{

fengming();

delay_50ms(4);

a1++;

}

if(k4==0)

{

fengming();

delay_50ms(4);

a1--;

}

b1=a1/10*16+a1%10;//10进制转变成16进制

write_date(0x88,b1);//月

ReadTime(); //1302哦

write_command(0x84);//地址,定在哪显示

shi1=a1/10;

ge1=a1%10;

yue=shi1*10+ge1;

if(yue>12)

{a1=1;}

if(yue==0&&k4==0)

{ fengming();

delay_50ms(4);

a1=a1+12;

}

write_data(shi1+0x30);

write_data(ge1+0x30);; //年}

}

/************************设置日**************************/ if(n==3)

{

if(k4==0&&a2==0)//设置跳变,方便调节

{

fengming();

delay_50ms(4);

a2=a2+27;

}

if(k3==0)//

{

fengming();

delay_50ms(4);

a2++;

}

if(k4==0)

{

fengming();

delay_50ms(4);

a2--;

}

if(yue%2==0)

{

if(ri>30&&yue!=8)

{

a2=1;

}

if(yue==8)

{

if(ri>31)

{a2=1;

}

}

}

else if(yue%2!=0)

{

if(ri>31)

a2=1;

}

if((year%4==0)&&(year%100!=0)||(year%400==0))//闰年是“能被4整除但不能被100整除”,或者“能被400整除”

{

if(yue==2&&ri>29)

{

a2=1;

}

}

else

if(yue==2&&ri>28)

{

a2=1;

}

b3=a2/10*16+a2%10;//10进制转变成16进制

write_date(0x86,b3);//日

ReadTime(); //1302哦

write_command(0x86);//地址,定在哪显示

shi2=a2/10;

ge2=a2%10;

ri=shi2*10+ge2;

write_data(shi2+0x30);

write_data(ge2+0x30);; //年}

}

/************************设置时**************************/

if(n==4)

{

if(k3==0)////////////////

{

fengming();

delay_50ms(4);

a4++;

}

if(k4==0)

{

fengming();

delay_50ms(4);

a4--;

}

b4=a4/10*16+a4%10;//转变成16进制

write_date(0x84,b4);//日

ReadTime(); //1302

write_command(0x91);//地址,定在哪显示

if(a4>24)

{

a4=0;

}

if(a4==0&&k4==0)

{

fengming();

delay_50ms(2);

a4=a4+24;

}

shi3=a4/10;

ge3=a4%10;

write_data(shi3+0x30);

write_data(ge3+0x30); //年}

}

/************************设置分**************************/ if(n==5)

{

if(k3==0)////////////////

{

fengming();

delay_50ms(4);

a5++;

}

if(k4==0)

{

fengming();

delay_50ms(4);

a5--;

}

b5=a5/10*16+a5%10;//转变成16进制

write_date(0x82,b5); //分

ReadTime(); //1302哦

write_command(0x93);//地址,定在哪显示

shi4=a5/10;

ge4=a5%10;

if(a5>60)

{

a5=0;

}

if(a5==0&&k4==0)

{

fengming();

delay_50ms(2);

a5=60+a5;

}

write_data(shi4+0x30);

write_data(ge4+0x30); //年}

}

/************************设置秒**************************/ if(n==6)

{

if(k3==0)////////////////

{

fengming();

//delay_50ms(1);

a6++;

}

if(k4==0)

{

fengming();

//delay_50ms(1);

a6--;

}

b5=a6/10*16+a6%10;//转变成16进制

write_date(0x80,b5);//秒//分

ReadTime(); //1302哦

write_command(0x95);//地址,定在哪显示

shi5=a6/10;

ge5=a6%10;

if(a6>60)

{

a6=0;

}

if(a6==0&&k4==0)

{

a6=60+a6;

}

write_data(shi5+0x30);

write_data(ge5+0x30); //年}

}

/************************设置星期**************************/ if(n==7)

{

if(k3==0)////////////////

{

fengming();

delay_50ms(1);

a7++;

}

if(k4==0)

{

fengming();

delay_50ms(1);

a7--;

}

b7=a7/10*16+a7%10;//转变成16进制

write_date(0x8a,b7);//周

ReadTime(); //1302哦

write_command(0x9b);//地址,定在哪显示

shi6=a7/10;

ge6=a7%10;

if(a7>7)

{

a7=1;

}

if(a7<1)

{

a7=7;

}

//write_data(shi6+0x30);

write_data(ge6+0x30); //年}

}

/************************设置温度上线**************************/ if(n==8)

{ display7(wed);

if(k3==0)

{

fengming();

delay_50ms(1);

wed++;

display7(wed);//1820的哦

}

if(k4==0)

{

fengming();

delay_50ms(1);

wed--;

display7(wed);//1820的哦

}

}

/************************设置温度下线**************************/ if(n==9)

{ display7(xia);

if(k3==0)

{

fengming();

delay_50ms(1);

xia++;

display7(wed);//1820的哦

}

if(k4==0)

{

fengming();

delay_50ms(1);

xia--;

display7(xia);//1820的哦

}

}

}

write_date(0x8e,0x80);//禁止写入//这个必须在while面,不然写不进去的write_command(0x0e);//整体显示开,开游标,游标不反白

}

void main()

{

uint tem;//必须是整型,不然显示的温度不全

LCD_init();

display_5();

display_6();

display_13();

display_8();

delay_50ms(50);

display_9();

display_10();

display_11();

display_12();

delay_50ms(50);

display_14();

display_15();

display_16();

display_17();

delay_50ms(30);

display_1();

display_2();

display_3();

display_4();

SetTime();

write_command(0x0c);//整体显示开,不开游标

while(1)

{

if(tem>wed|tem

{ fengming();

}

// baoshi();

tmpchange(); //1820 的

tem=tmp();//1820的

display7(tem);//1820的哦

ReadTime(); //1302哦

write_command(0x82);

display(read[6]); //年

write_command(0x84);

display(read[4]); //月

write_command(0x86);

display(read[3]); //日

write_command(0x9b);//

display(read[5]); //周

write_command(0x91);

display(read[2]); //时

write_command(0x93);

display(read[1]); //分

write_command(0x95);

display(read[0]);//miao

}

}

/************************18B20部分****************************/

void dsreset(void) //DS18B20初始化

{

uint i;

DS=0;

i=103;

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bit tmpreadbit(void) // 读一位

{

uint i;

bit dat;

DS=0;i++; //小延时一下

DS=1;i++;i++;

dat=DS;

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

return (dat);

}

uchar tmpread(void) //读一个字节

{

uchar i,j,dat;

dat=0;

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

{

j=tmpreadbit();

dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT }

return(dat); //将一个字节数据返回

}

void tmpwritebyte(uchar dat)

{ //写一个字节到DS18B20里

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb) // 写1部分

{

DS=0;

i++;i++;

DS=1;

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

}

else

{

DS=0; //写0部分

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

DS=1;

i++;i++;

}

}

}

void tmpchange(void) //发送温度转换命令

{

dsreset(); //初始化DS18B20

delayb(1); //延时

tmpwritebyte(0xcc); // 跳过序列号命令

tmpwritebyte(0x44); //发送温度转换命令

}

int tmp() //获得温度

{

float tt;

uchar a,b;

dsreset();

delayb(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe); //发送读取数据命令

a=tmpread(); //连续读两个字节数据

b=tmpread();

temp=b;

temp<<=8;

temp=temp|a; //两字节合成一个整型变量。

tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20

//可以精确到0.0625度,所以读回数据的最低位代表的是

temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位

//也转换为可显示数字,同时进行一个四舍五入操作。return temp; //返回温度值

}

void display7(uint num)

{

uchar ge,shi,bai;

bai=num/100;

shi=num%100/10;

ge=num%10;

write_command(0x8b);

write_data(0x30+bai);

write_data(0x30+shi);

write_data(0x2e); //显示小数位

write_data(0x30+ge);

}

/******** 显示函数*********/

void display_1(void)//显示1

{

uchar i;

write_command(0x80);

delay_50us(1);

for(i=0;table3[i]!='\0';i++)

{

write_data(table3[i]);

delay_50us(1);

}

}

void display_2(void)//显示2

{

uchar b;

write_command(0x90);

delay_50us(1);

for(b=0;table4[b]!='\0';b++)

{ w rite_data(table4[b]);

delay_50us(1);

}

}

void display_3(void) //显示3

{

uchar h;

write_command(0x88);

delay_50us(1);

for(h=0;table5[h]!='\0';h++)

{ w rite_data(table5[h]);

delay_50us(1);

}

}

void display_4(void) //显示4 {

uchar h;

write_command(0x98);

delay_50us(1);

for(h=0;table6[h]!='\0';h++)

{ w rite_data(table6[h]);

delay_50us(1);

}

}

void display_5(void) //显示5 {

uchar h;

write_command(0x80);

delay_50us(1);

for(h=0;table7[h]!='\0';h++)

{ w rite_data(table7[h]);

delay_50us(1);

}

}

void display_6(void) //显示6 {

uchar h;

write_command(0x90);

delay_50us(1);

for(h=0;table8[h]!='\0';h++)

{ w rite_data(table8[h]);

delay_50us(1);

}

}

void display_13(void) //显示7 {

uint h;

write_command(0x88);

delay_50us(1);

for(h=0;table9[h]!='\0';h++)

{ w rite_data(table9[h]);

delay_50us(1);

}

}

void display_8(void) //显示8 {

uchar h;

write_command(0x98);

delay_50us(1);

for(h=0;table10[h]!='\0';h++)

{ w rite_data(table10[h]);

delay_50us(1);

}

}

void display_9(void) //显示9 {

uchar h;

write_command(0x80);

delay_50us(1);

for(h=0;table11[h]!='\0';h++)

{ w rite_data(table11[h]);

delay_50us(1);

}

}

void display_10(void) //显示10 {

uchar h;

write_command(0x90);

delay_50us(1);

for(h=0;table12[h]!='\0';h++)

{ w rite_data(table12[h]);

delay_50us(1);

}

}

void display_11(void) //显示11 {

uchar h;

write_command(0x88);

delay_50us(1);

for(h=0;table13[h]!='\0';h++)

{ w rite_data(table13[h]);

delay_50us(1);

}

}

void display_12(void) //显示12 {

uchar h;

write_command(0x98);

delay_50us(1);

for(h=0;table14[h]!='\0';h++)

{ w rite_data(table14[h]);

delay_50us(1);

}

}

void display_14(void)//显示13

{

uchar i;

write_command(0x80);

delay_50us(1);

for(i=0;table15[i]!='\0';i++)

{

write_data(table15[i]);

delay_50us(1);

}

}

void display_15(void)//显示14 {

相关文档
相关文档 最新文档