|
單片機(jī)萬(wàn)年歷1602仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
58547A3Z)[`W87T2Y]%SJ%U.png (60.75 KB, 下載次數(shù): 153)
下載附件
仿真
2018-8-7 08:42 上傳
L}TYT%$RG{CY0[)WNFNY.png (54.79 KB, 下載次數(shù): 142)
下載附件
2018-8-7 08:42 上傳
單片機(jī)源程序如下:
- //此為主程序,查看完成下載附件,包含仿真,可運(yùn)行
- #include "reg52.h"
- #include "main.h"
- #include "LCD1602.h" //顯示模塊函數(shù)在LCD1602.c文件中
- //屏幕中第一行和第二行顯示的框架
- code char lcd_line[2][16]={
- "Date 20__-__-__ ", //顯示日期
- "Time __:__:__ ", //顯示時(shí)間
- };
- //按鍵
- sbit S1 = P3^1; //設(shè)置
- sbit S2 = P3^5; //加
- sbit S3 = P3^6; //減
- //當(dāng)前時(shí)間
- char time_hour=23;
- char time_min=59;
- char time_sec=55;
- char time_year=18;
- char time_month=6;
- char time_day=30;
- uchar mode = 0; //當(dāng)前模式
- //STC89系列單片機(jī)延時(shí)1ms
- void delay_ms(unsigned int x)
- {
- char j=0;
- while(x--)
- for(j=0;j<125;j++)
- ;
- }
- //讀取時(shí)間數(shù)據(jù)
- void read_ds1302_all()
- {
- time_hour = ds1302_read_hour();//讀取小時(shí)
- time_min = ds1302_read_min();//分鐘
- time_sec = ds1302_read_sec(); //秒鐘
- time_year = ds1302_read_year();
- time_month = ds1302_read_month();
- time_day = ds1302_read_day();
- }
- //顯示
- void display_time()
- {
- //時(shí)分秒
- lcd_write_char(6,1,time_hour/10+'0');
- lcd_write_char(7,1,time_hour%10+'0');
- lcd_write_char(9,1,time_min/10+'0');
- lcd_write_char(10,1,time_min%10+'0');
- lcd_write_char(12,1,time_sec/10+'0');
- lcd_write_char(13,1,time_sec%10+'0');
- //年月日
- lcd_write_char(7,0,time_year/10+'0');
- lcd_write_char(8,0,time_year%10+'0');
- lcd_write_char(10,0,time_month/10+'0');
- lcd_write_char(11,0,time_month%10+'0');
- lcd_write_char(13,0,time_day/10+'0');
- lcd_write_char(14,0,time_day%10+'0');
- }
- //按鍵掃描
- char key_scan()
- {
- if(S1==0 || S2==0 || S3==0) // 如果按下了
- {
- delay_ms(5); //去抖動(dòng)
- if(S1==0 || S2==0 || S3==0) //確實(shí)按下了
- {
- if(S1==0){while(S1==0); return 1;} //按鍵1確實(shí)按下了。依此類推。
- if(S2==0){while(S2==0); return 2;} //
- if(S3==0){while(S3==0); return 3;} //
- }
- }
- return 0; //沒有按鍵按下
- }
- //按鍵動(dòng)作
- void key_action()
- {
- char key=0;
- key=key_scan();
- if(key == 0) return;
- if(key==1)
- {
- mode++;
- if(mode > 6)
- {
- mode = 0;
- lcd_write(0,0x0c);//顯示器開,光標(biāo)關(guān),字符不閃爍
- }
- }
- switch(mode)
- {
- case 1: //秒
- {
-
- lcd_write(0,0x0f); //光標(biāo)閃爍
- lcd_write(0,0x80+0x40+13); //位置
- if(key==2){time_sec++;} //秒++
- if(key==3){time_sec--;} //秒--
- if(time_sec>=60){time_sec=0;}
- if(time_sec<0){time_sec=59;}
- lcd_write_char(12,1,time_sec/10+'0'); //顯示
- lcd_write_char(13,1,time_sec%10+'0');
- lcd_write(0,0x80+0x40+13); //回到原位
- ds1302_set_sec(time_sec );
-
- }
- break;
- case 2: //分
- {
-
- lcd_write(0,0x0f); //光標(biāo)閃爍
- lcd_write(0,0x80+0x40+10); //定位
- if(key==2){time_min++;} //分++
- if(key==3){time_min--;} //分--
- if(time_min>=60){time_min=0;}
- if(time_min<0){time_min=59;}
- lcd_write_char(9,1,time_min/10+'0'); //顯示
- lcd_write_char(10,1,time_min%10+'0');
- lcd_write(0,0x80+0x40+10); //回到原位
- ds1302_set_min(time_min );
- }
- break;
- case 3: //時(shí)
- {
-
- lcd_write(0,0x0f); //光標(biāo)閃爍
- lcd_write(0,0x80+0x40+7); //定位
- if(key==2){time_hour++;} //時(shí)++
- if(key==3){time_hour--;} //時(shí)--
- if(time_hour>=24){time_hour=0;}
- if(time_hour<0){time_hour=23;}
- lcd_write_char(6,1,time_hour/10+'0'); //顯示
- lcd_write_char(7,1,time_hour%10+'0');
- lcd_write(0,0x80+0x40+7); //回到原位
- ds1302_set_hour(time_hour);
- }
- break;
- case 4: //年
- {
-
- lcd_write(0,0x0f);
- lcd_write(0,0x80+8);
- if(key==2){time_year++;}
- if(key==3){time_year--;}
- lcd_write_char(7,0,time_year/10+'0');
- lcd_write_char(8,0,time_year%10+'0');
- lcd_write(0,0x80+8); //回到原位
- ds1302_set_year(time_year);
- }
- break;
- case 5: //月
- {
-
- lcd_write(0,0x0f);
- lcd_write(0,0x80+11);
- if(key==2){time_month++;}
- if(key==3){time_month--;}
- if(time_month>12){time_month=1;}
- if(time_month<0){time_month=12;}
- lcd_write_char(10,0,time_month/10+'0');
- lcd_write_char(11,0,time_month%10+'0');
- lcd_write(0,0x80+11); //回到原位
- ds1302_set_month(time_month);
- }
- break;
- case 6: //日
- {
-
- lcd_write(0,0x0f);
- lcd_write(0,0x80+14);
- if(key==2){time_day++;}
- if(key==3){time_day--;}
- //判斷28天30天或31天
- if(time_min==2) //2月28天
- {
- if(time_day>28){time_day=0;}
- if(time_day<0){time_day=28;}
- }
- if(time_month==4 || time_month==6 || time_month==9 || time_month==11) //30天
- {
- if(time_day>30){time_day=0;}
- if(time_day<0){time_day=30;}
- }
- if(time_month==1 || time_month==3 || time_month==5 || time_month==7 || time_month==8 || time_month==10 || time_month==12 ) //31天
- {
- if(time_day>31){time_day=0;}
- if(time_day<0){time_day=31;}
- }
- lcd_write_char(13,0,time_day/10+'0');
- lcd_write_char(14,0,time_day%10+'0');
- lcd_write(0,0x80+14); //回到原位
- ds1302_set_day(time_day);
- }
- break;
- }
- }
- //主程序
- void main()
- {
- lcd_init();//LCD1602液晶顯示屏初始化
- ds1302_init();
- lcd_write_line(0,lcd_line[0]);//屏幕顯示第一行框架
- lcd_write_line(1,lcd_line[1]);//屏幕顯示第二行框架
- ds1302_set_sec(time_sec);
- ds1302_set_min(time_min);
- ds1302_set_hour(time_hour);
- //
- ds1302_set_day(time_day);
- ds1302_set_month(time_month);
- ds1302_set_year(time_year);
- //主循環(huán)
- while(1)
- {
- key_action();
-
- if(!mode) //沒有進(jìn)入設(shè)定時(shí)間
- {
- read_ds1302_all(); //顯示年月日時(shí)分秒
- display_time(); //顯示
- }
- else //讀回設(shè)定時(shí)間
- {
- ds1302_set_sec(time_sec);
- ds1302_set_min(time_min);
- ds1302_set_hour(time_hour);
- //
- ds1302_set_day(time_day);
- ds1302_set_month(time_month);
- ds1302_set_year(time_year);
- }
-
- }
- }
- ////////////////////////////////////
復(fù)制代碼
0.png (49.99 KB, 下載次數(shù): 145)
下載附件
2018-8-7 14:34 上傳
所有資料51hei提供下載:
ds1302萬(wàn)年歷.rar
(107.16 KB, 下載次數(shù): 488)
2018-8-7 08:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|