1、万年历c程序#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;un
2、signed char bell_flag;unsigned char set6;unsigned char set_time6;unsigned char disp7;sbit CLK = P34; /*实时时钟时钟线引脚 */sbit IO = P35; /*实时时钟数据线引脚 */sbit RST = P36; /*实时时钟复位线引脚 */sbit dq = P14; /*ds18b20*/sbit ACC0 = ACC0;sbit ACC7 = ACC7;/sbit key1 = P10;/sbit key2 = P11;/sbit key3 = P12;/sbit key4 = P1
3、3;sbit light = P30;sbit bell = P37;/* 延时子函数*/void delay(unsigned char dly) while(dly-); /* 向DS1302写入1Byte数据*/void InputByte(unsigned char ucDa) unsigned char i; ACC = ucDa; for(i=8; i0; i-) IO = ACC0; CLK = 1; CLK = 0; ACC = 1; /* 从DS1302读取1Byte数据*/unsigned char OutputByte(void) unsigned char i; for
4、(i=8; i0; 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 D
5、a; 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=1; dq=1; if(dq=1
6、) dat|=0x80; delay(4); return(dat); /* 向ds18b20写入一个byte 数据*/void write_18b20(unsigned char dat) unsigned char i; for(i=0;i=1; /* 读取温度值 ds18b20*/unsigned int read_T(void) unsigned int t=0; /16 bit unsigned char t0=0,t1=0; float temp=0; /32 bit rst_18b20(); write_18b20(0xcc); write_18b20(0x44); rst_18
7、b20(); write_18b20(0xcc); write_18b20(0xbe); t0=read_18b20(); t1=read_18b20(); t=t1; t=4; /*t = (t01); temp=t*0.0625; t=temp*10+0.5;*/ return(t); void main(void) W_1302(0x8e,0x00);/开保护 W_1302(0x8c,0x09);/year W_1302(0x8a,0x05);/week W_1302(0x88,0x05);/mouth W_1302(0x86,0x29);/date W_1302(0x84,0x15);
8、/hour W_1302(0x82,0x59);/minute W_1302(0x80,0x00);/second W_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
9、_flag=1) display_one(); if(light=1) disp_flag = 0; /* 扫描显示函数*/void display(void) switch(k) case 0:LED = (disp0&0XF0)+(disp44); DIG = 0X80; break; case 1:LED = (disp04); DIG = 0X20; break; case 3:LED = (disp14); DIG = 0X08; break; case 5:LED = (disp24)+(disp6&0X0F); DIG = 0X04;delay(15); break; case
10、6:LED = 0xf0+t/10; DIG = 0X02; break; case 7:LED = (disp34)+t%10; DIG = 0X01;/while(1); break; case 8:DIG = 0X00; if(key_flag=0) t = read_T(); disp0=R_1302(0x8d); /year disp1=R_1302(0x89); /month disp2=R_1302(0x87); /data disp3=R_1302(0x8b); /week disp4=R_1302(0x85); /hour disp5=R_1302(0x83); /minte
11、 disp6=R_1302(0x81); /second if(disp4=set_time0)&(disp5=set_time1) bell = 0; else bell = 1; key_scan(); break; void display_one()key_scan(); switch(disp_num) case 1: DIG = 0x00; LED = (disp0&0XF0)+0x0f; DIG = 0X80;delay(100);DIG = 0x00; LED = (disp04)+0x0F; DIG = 0X40;delay(100); break; case 2: DIG
12、= 0x00; LED = (disp1&0X10)+0x0f; DIG = 0X20;delay(100);DIG = 0x00; LED = (disp14)+0x0F; DIG = 0X10;delay(100); break; case 3: DIG = 0x00; LED = (disp2&0Xf0)+0x0f; DIG = 0X08;delay(100);DIG = 0x00; LED = (disp24)+0x0F; DIG = 0X04;delay(100); break; case 4: DIG = 0x00; LED = 0xff; DIG = 0X00;delay(100
13、);DIG = 0x00; LED = (disp34)+0xF0; DIG = 0X80;delay(100);DIG = 0x00; LED = (disp4&0x0F)+0xF0; DIG = 0X40;delay(100); break; case 6: DIG = 0x00; LED = (disp54)+0xF0; DIG = 0X20;delay(100);DIG = 0x00; LED = (disp5&0x0F)+0xF0; DIG = 0X10;delay(100); break; /* 按键识别程序*/void key_scan(void) unsigned char k
14、ey_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;brea
15、k; 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_1
16、302(0x8c,disp0);/year W_1302(0x8a,disp3);/week W_1302(0x88,disp1);/mouth W_1302(0x86,disp2);/date W_1302(0x84,disp4);/hour W_1302(0x82,disp5);/minute W_1302(0x80,0x00);/second W_1302(0x8e,0x80);/写保护 disp_flag = 0; disp_num = 0; break; case 1: set = (dispdisp_num-14)*10+(dispdisp_num-1&0x0f)-1; if(di
17、sp_num=1&set=-1) set=99; else if(disp_num=2&set=0) set=12; else if(disp_num=3&set=0) if(disp1=2) set = 29; else if(disp1=1|disp1=3|disp1=5|disp1=7|disp1=8|disp1=0x10|disp1=12) set = 31; else if(disp1=4|disp1=6|disp1=9|disp1=0x11) set = 30; else if(disp_num=4&set=0) set=7; else if(disp_num=5&set=-1)
18、set=23; else if(disp_num=6&set=-1) set=59; dispdisp_num-1=(set/10)4)*10+(dispdisp_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&disp1=2) set = 1; else if(set=32&(disp1=1|disp1=3|disp1=5|disp1=7|disp1=8|disp1=0x10|disp1=12) set = 1; else
19、if(set=31&(disp1=4|disp1=6|disp1=9|disp1=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; dispdisp_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_time0 = disp4; set_time1 = disp5; 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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1