|
ds1302 數(shù)碼管顯示時(shí)間,年份,日期交互顯示, 51單片機(jī)適用的代碼,簡單易懂,包括的功能有,定時(shí)報(bào)警亮燈,定時(shí)控制,可改寫成控制家電代碼
單片機(jī)源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
- sbit wei = P2^7 ;
- sbit duan = P2^6 ;
- sbit TCE=P1^2;
- sbit TCLK=P1^0;
- sbit TIO =P1^1;
- uchar position[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; //8個(gè)數(shù)碼管位選數(shù)組
- uchar udata[]={1,2,16,4,5,16,7,8};
- uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
- uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
- #define hex(dat) (dat / 10 * 16 + (dat % 10)) //十進(jìn)制轉(zhuǎn)BCD碼
- #define dec(dat) ((dat >> 4)* 10 + (dat & 0x0f)) //BCD碼轉(zhuǎn)十進(jìn)制
- /*形式上為十六進(jìn),數(shù)值是BCD碼*/
- //存儲格式是BCD碼秒 分 時(shí) 日 月 周 年
- //uchar time[7]={0x50,0x59,0x14,0x20,0x06,0x06,0x19};
- /*如果數(shù)值時(shí)間是十進(jìn)制,寫入時(shí)間時(shí)要先轉(zhuǎn)化為BCD碼*/
- uchar time[7]={0,59,15,15,12,6,18}; //十進(jìn)制
- uchar settime[3] = {5,59,15}; //定時(shí)時(shí)間設(shè)置
- uchar i,changeflag=0;
- uint num=0;
- uchar temp[7];
- /*******向DS1302讀入一字節(jié)數(shù)據(jù)*********/
- uchar DS1302Read(uchar add)
- { uchar a, d=0;
- TCE = 0;
- TCLK = 0;
- TCE=1;
- for(a=0; a<8; a++) //發(fā)送控制字節(jié)
- {
- TCLK=0;
- TIO= add & 0x01;
- TCLK=1;//制造上升沿
- add>>=1;
- }
- for(a=0; a<8; a++) //讀1字節(jié)數(shù)據(jù)
- {
- TCLK=1;
- d >>= 1;//右移1位
- TCLK=0;//制造下降沿
- if(TIO) {//如果讀到1
- d |= 0x80;//把最高位置1
- }
- }
- TCE=0; //拉低TCE
- return dec(d); //讀取的數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制
- //return d;
- }
- /*******向DS1302寫入一字節(jié)數(shù)據(jù)*********/
- void DS1302Write(uchar add,uchar d)
- {
- uchar i;
- d = hex(d); //轉(zhuǎn)換為BCD碼
- TCE=0; //拉低TCE引腳,終止數(shù)據(jù)傳輸
- TCLK=0; //拉低TCLK引腳,清零時(shí)鐘線
- TCE=1; //拉高TCE引腳,所有數(shù)據(jù)傳輸都要拉高TCE腳,啟動控制邏輯
- //先寫入控制字節(jié)
- for(i=0; i<8; i++)
- {
- TIO= add & 0x01; //TIO引腳準(zhǔn)備好要寫入的1位數(shù)據(jù)
- TCLK=1; //TCLK上升沿,1位數(shù)據(jù)從TIO腳寫入,低位先寫入
- add>>=1; //數(shù)據(jù)右移1位
- TCLK=0; //拉低TCLK,為下次寫入準(zhǔn)備,循環(huán)8次寫入1字節(jié)
- }
- //再寫入數(shù)據(jù)字節(jié)
- for(i=0; i<8; i++)
- {
- TIO= d & 0x01;
- TCLK=1;
- d>>=1;
- TCLK=0;
- }
- TCE=0; //數(shù)據(jù)傳輸完拉低TCE
- }
-
- void DS1302Init()
- {
- uchar i;
- DS1302Write(0x8e,0x00);//關(guān)閉寫保護(hù)
- for(i=0;i<7;i++)
- DS1302Write(write_addr[i],time[i]);
- DS1302Write(0x8e,0x80);
- }
- void DS1302ReadTime()
- {
- udata[0] = temp[2]/10;
- udata[1] = temp[2]%10;
- udata[2] = 16;
- udata[3] = temp[1]/10;
- udata[4] = temp[1]%10;
- udata[5] = 16;
- udata[6] = temp[0]/10;
- udata[7] = temp[0]%10;
- }
- void DS1302ReadTimeyear()
- {
- udata[0] = 2;
- udata[1] = 0;
- udata[2] = temp[6]/10;
- udata[3] = temp[6]%10;
-
- udata[4] = temp[4]/10;
- udata[5] = temp[4]%10;
-
- udata[6] = temp[3]/10;
- udata[7] = temp[3]%10;
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號可以在使用多個(gè)定時(shí)器時(shí)不受影響
- TH0=(65536-1000)/256; //給定初值
- TL0=(65536-1000)/256;
- EA=1; //總中斷打開
- ET0=1; //定時(shí)器中斷打開
- TR0=1; //定時(shí)器開關(guān)打開
- }
- void main()
- {
- Init_Timer0();
- DS1302Init();
- while(1)
- {
- uchar i;
- for(i=0;i<7;i++)
- temp[i] = DS1302Read(read_addr[i]);
- if(!changeflag)
- DS1302ReadTime() ;
- else
- DS1302ReadTimeyear();
-
- if(temp[0] == settime[0] && temp[1] == settime[1] && temp[2] == settime[2])
- {
- P1 &= 0xf;
-
- }
- }
- }
- void Timer0_isr(void) interrupt 1
- {
- static uchar i;
- TH0=(65536-1000)/256; //給定初值
- TL0=(65536-1000)/256;
- P0=0xff;
- duan =1;
- P0=table[udata[i]];
- duan = 0;
- P0=0xff;
- wei = 1;
- P0 = position[i];
- wei =0;
- i++;
- num++;
- if(num > 30000)
- {
- num=0;
- changeflag = ~changeflag ;
- }
- if(i == 8)
- i=0;
- }
復(fù)制代碼
所有資料51hei提供下載:
DS1302.zip
(32.12 KB, 下載次數(shù): 55)
2018-12-24 16:10 上傳
點(diǎn)擊文件名下載附件
ds1302 數(shù)碼管 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|