7段式數(shù)碼管顯示時間,ds1302芯片,89c51單片機,protues+keil-c仿真電路加源程序,比較簡單,屬于校內(nèi)課程實驗,
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.79 KB, 下載次數(shù): 54)
下載附件
2018-6-2 23:34 上傳
0.png (7.33 KB, 下載次數(shù): 44)
下載附件
2018-6-2 23:34 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- uchar dot,time1[8],flash;
- unsigned int tt;
- uchar flag=0;
- code seven_tab[15]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x37,0x5c,0x77,0x73};//0--9,-,N,o,A,p
- sbit rtc_clk=P3^6;
- sbit rtc_data=P3^4;
- sbit rtc_rst=P3^5;
- sbit p2_2=P2^2;
- sbit p2_3=P2^3;
- sbit p2_4=P2^4;
- sbit p3_0=P3^2;
- sbit p2_7=P3^3;
- sbit p2_6=P2^6;
- sbit a0=ACC^0;
- sbit a7=ACC^7;
- void write_rtc(uchar date) //寫一字節(jié)
- {
- uchar i;
- ACC=date;
- for(i=8;i>0;i--)
- {
- rtc_data=a0;
- rtc_clk=1;
- rtc_clk=0;
- ACC=ACC>>1;
- }
- }
- uchar read_rtc() //讀一字節(jié)
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- ACC=ACC>>1;
- a7=rtc_data;
- rtc_clk=1;
- rtc_clk=0;
- }
- return(ACC);
- }
- void write1302(uchar address,uchar date) //寫1302數(shù)據(jù)
- {
- rtc_rst = 0;
- rtc_clk = 0;
- rtc_rst = 1;
- write_rtc(address);
- write_rtc(date);
- rtc_clk = 1;
- rtc_rst = 0;
- }
- uchar read1302(uchar address)//讀1302數(shù)據(jù)
- {
- uchar temp;
- rtc_rst = 0;
- rtc_clk = 0;
- rtc_rst = 1;
- write_rtc(address);
- temp=read_rtc();
- rtc_clk = 1;
- rtc_rst = 0;
- return(temp);
- }
- void init1302() //1302初始化
- {
- write1302(0x8e,0x00); //寫操作
- write1302(0x80,0x21); //寫秒
- write1302(0x82,0x50); //寫分
- write1302(0x84,0x14); //寫時
- write1302(0x88,0x05); //寫月
- write1302(0x86,0x22); //寫日
- write1302(0x8a,0x02); //寫星期
- write1302(0x8c,0x18); //寫年
- write1302(0x8e,0x80); //寫保護
- }
- void get_time() //獲取1302的時間數(shù)據(jù)(時、分、秒),存入time1數(shù)組中
- {
- uchar d;
- d = read1302(0x81);
- time1[0] = d & 0x0f;
- time1[1] = (d >> 4) & 0x0f;
- d = read1302(0x83);
- time1[3] = d & 0x0f;
- time1[4] = (d >> 4) & 0x0f;
- d = read1302(0x85);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[2]=time1[5]=10;
- }
- void get_date() //獲取1302的日期數(shù)據(jù)(日月年),存入time1數(shù)組中
- { uchar d;
- d = read1302(0x87);
- time1[0] = d & 0x0f;
- time1[1] = (d >> 4) & 0x0f;
- d = read1302(0x89);
- time1[3] = d & 0x0f;
- time1[4] = (d >> 4) & 0x0f;
- d = read1302(0x8d);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[2]=time1[5]=10;
- }
- void get_week() //獲取1302的星期數(shù)據(jù),存入time1數(shù)組中
- { uchar d;
- d = read1302(0x8b);
- time1[3] = d & 0x0f;
- time1[4] =10;
- time1[1]=10;
- time1[6]=12;
- time1[7]=11;
- d = read1302(0x85);
- if(((((d >>4 ) & 0x0f)==1)&(d & 0x0f)>=2)||((((d >>4 ) & 0x0f)==2)))
- {
- time1[0]=14;
- }
- else
- time1[0]=13;
- time1[2]=time1[5]=10;
- }
- void set_min() //設(shè)置分鐘顯示 ---分鐘---
- {
- uchar d;
- d = read1302(0x83);
- time1[3] = d & 0x0f;
- time1[4] = (d >> 4) & 0x0f;
- d = read1302(0x85);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[0]=time1[1]=time1[2]=time1[5]=10;
- }
- void set_hour() //設(shè)置時鐘顯示 時鐘------
- {
- uchar d;
- d = read1302(0x85);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[0]=time1[1]=time1[2]=time1[5]=time1[3]=time1[4]=10;
- }
- void set_day() //設(shè)置日期顯示 ------日期
- {
- uchar d;
- d = read1302(0x87);
- time1[0] = d & 0x0f;
- time1[1] = (d >> 4) & 0x0f;
- d = read1302(0x89);
- time1[3] = d & 0x0f;
- time1[4] = (d >> 4) & 0x0f;
- d = read1302(0x8d);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[2]=time1[5]=10;
- }
- void set_month() //設(shè)置月份顯示 ---月份---
- {
- uchar d;
- d = read1302(0x89);
- time1[3] = d & 0x0f;
- time1[4] = (d >> 4) & 0x0f;
- d = read1302(0x8d);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[2]=time1[5]=time1[0]=time1[1]=10;
- }
- void set_year() //設(shè)置年份顯示 年份------
- {
- uchar d;
- d = read1302(0x8d);
- time1[6] = d & 0x0f;
- time1[7] = (d >>4 ) & 0x0f;
- time1[3]=time1[4]=time1[2]=time1[5]=time1[0]=time1[1]=10;
- }
- void set_week() //設(shè)置星期顯示 No--星期---
- {
- uchar d;
- d = read1302(0x8b);
- time1[3] = d & 0x0f;
- time1[6]=time1[4]=time1[2]=time1[5]=time1[0]=time1[1]=time1[7]=10;
- }
- /*void time0() interrupt 1 //使用T0定時器刷新數(shù)碼管顯示,刷新間隔為2ms
- {
- uchar i;
- TR0=0;
- TH0 = (65536 - 2000) / 256;
- TL0 = (65536 - 2000) % 256;
- TR0 = 1;
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- case(7): p2_2=0; p2_3=0; p2_4=0; break;//顯示第0位
- case(6): p2_2=1; p2_3=0; p2_4=0; break;//顯示第1位
- case(5): p2_2=0; p2_3=1; p2_4=0; break;//顯示第2位
- case(4): p2_2=1; p2_3=1; p2_4=0; break;//顯示第3位
- case(3): p2_2=0; p2_3=0; p2_4=1; break;//顯示第4位
- case(2): p2_2=1; p2_3=0; p2_4=1; break;//顯示第5位
- case(1): p2_2=0; p2_3=1; p2_4=1; break;//顯示第6位
- case(0): p2_2=1; p2_3=1; p2_4=1; break;//顯示第7位
- }
- P1=seven_tab[time1[i]];
- i++;
- if(i==8)
- i=0;
- }
- void init_timer0() //初始化T0定時器
- {
- TMOD = 0x01;
- TH0 = (65536-2000) / 256;
- TL0 = (65536-2000) % 256;
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }*/
- void start() interrupt 0 //按下切屏鍵,切換時間,日期,星期;按下調(diào)節(jié)鍵,在調(diào)節(jié)分時日月年星期間切換
- {
-
- flag++;
- if(flag>2)
- {
- flag=0;
- }
-
- }
- void sart() interrupt 2
- {
-
- if(flag<3)
- flag=3;
- else
- {
- flag++;
- if(flag>8)
- flag=3;
- }
-
- }
- void delay(uchar t) //延時函數(shù)
- {
- uchar j=0;
- for(;t>0;t--)
- for(j=0;j<125;j++);
- }
- void main()
- {
- uchar n,i,d,t;
- /*init_timer0();*/
- init1302();
- IT0=1;
- EX0=1;
- EA=1;
- IT1=1;
- EX1=0;
- while(1)
- {
-
- switch(flag)
- {
- case 0:get_time(); //調(diào)用子函數(shù),把存入數(shù)組time的數(shù)據(jù)給顯示出來
- break;
- case 1:get_date(); //調(diào)用子函數(shù),把存入數(shù)組date的數(shù)據(jù)給顯示出來
- break;
- case 2:get_week(); //調(diào)用子函數(shù),把存入數(shù)組week的數(shù)據(jù)給顯示出來
- break;
- case 3:set_min(); //調(diào)整分
- if(p2_6==0)
- {
- delay(1000);
- if(p2_6==0)
- {
- n= read1302(0x83);
- d = n & 0x0f;
- t = (n >> 4) & 0x0f;
- d++;
- if(d>9)
- {
- d=0;
- t++;
- if(t>5)
- {
- t=0;
- }
- }
- n=(0x0f&d)|(0xf0&(t<<4));
- write1302(0x82,n);
- delay(1000);
- }
- }
- break;
- case 4:set_hour(); //調(diào)整時
- if(p2_6==0)
- {
- delay(1000);
- if(p2_6==0)
- {
- n= read1302(0x85);
- d = n & 0x0f;
- t = (n >> 4) & 0x0f;
- d++;
- if(t==2)
- {
- if(d>3)
- {
- d=0;
- t=0;
- }
- }
- if(d>9)
- {
- d=0;
- t++;
- }
-
- n=(0x0f&d)|(0xf0&(t<<4));
- write1302(0x84,n);
- delay(1000);
- }
- }
- break;
- case 5:set_day(); //調(diào)整日
- if(p2_6==0)
- {
- delay(1000);
- if(p2_6==0)
- {
- n= read1302(0x87);
- d = n & 0x0f;
- t = (n >> 4) & 0x0f;
- d++;
- if(t==3)
- {
- if(d>1)
- {
- d=1;
- t=0;
- }
- }
- if(d>9)
- {
- d=0;
- t++;
- }
-
- n=(0x0f&d)|(0xf0&(t<<4));
- write1302(0x86,n);
- delay(1000);
- }
- }
- break;
- case 6:set_month(); //調(diào)整月
- if(p2_6==0)
- {
- delay(1000);
- if(p2_6==0)
- {
- n= read1302(0x89);
- d = n & 0x0f;
- t = (n >> 4) & 0x0f;
- d++;
- if(t==1)
- {
- if(d>2)
- {
- d=1;
- t=0;
- }
- }
- if(d>9)
- {
- d=0;
- t++;
- }
-
- n=(0x0f&d)|(0xf0&(t<<4));
- write1302(0x88,n);
- delay(1000);
- }
- }
- break;
- case 7:set_year(); //調(diào)整年
- if(p2_6==0)
- {
- delay(1000);
- if(p2_6==0)
- {
- n= read1302(0x8d);
- d = n & 0x0f;
- t = (n >> 4) & 0x0f;
- d++;
- if(d>9)
- {
- d=0;
- t++;
- if(t>9)
- {
- t=0;
- }
- }
-
- n=(0x0f&d)|(0xf0&(t<<4));
- write1302(0x8c,n);
- delay(1000);
- }
- }
- break;
- case 8:set_week(); //調(diào)整星期
- if(p2_6==0)
- {
- delay(1000);
- if(p2_6==0)
- {
- n= read1302(0x8b);
- d = n & 0x0f;
- d++;
- if(d>7)
- {
- d=1;
- }
-
- n=0x0f&d;
- write1302(0x8a,n);
- delay(1000);
- }
- }
- break;
- }
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- case(7): p2_2=0; p2_3=0; p2_4=0; break;//顯示第0位
- case(6): p2_2=1; p2_3=0; p2_4=0; break;//顯示第1位
- case(5): p2_2=0; p2_3=1; p2_4=0; break;//顯示第2位
- case(4): p2_2=1; p2_3=1; p2_4=0; break;//顯示第3位
- case(3): p2_2=0; p2_3=0; p2_4=1; break;//顯示第4位
- case(2): p2_2=1; p2_3=0; p2_4=1; break;//顯示第5位
- case(1): p2_2=0; p2_3=1; p2_4=1; break;//顯示第6位
- case(0): p2_2=1; p2_3=1; p2_4=1; break;//顯示第7位
- }
- P1=seven_tab[time1[i]];
- delay(2);
- }
- }
-
- }
復(fù)制代碼
0.jpg (25.22 KB, 下載次數(shù): 41)
下載附件
2018-6-2 23:35 上傳
所有資料51hei提供下載:
ds1302.rar
(69.94 KB, 下載次數(shù): 45)
2018-6-2 21:56 上傳
點擊文件名下載附件
7段式數(shù)碼管顯示時間,ds1302芯片,89c51單片機,protues+keil-c仿真電路加源程序,比較簡單 下載積分: 黑幣 -5
|