51hei圖片_20211104224000.jpg (1.3 MB, 下載次數: 34)
下載附件
2021-11-4 22:41 上傳
- #include<reg52.h> // 定義頭文件
- #include<intrins.h> //定義函數文件
- unsigned char Sce,Min,Hour;//Sce秒,Min分,Hour時
- unsigned char y = 2; //定時器0中斷時間y 設置ms
- sbit wei = P2^7; //定義位選
- sbit du = P2^6; //定義段選
- sbit TSCLK = P1^0;//DS1302 時鐘線 SCLK
- sbit TIO = P1^1; //DS1302 數據線 IO
- sbit TRST = P1^2;//DS1302 使能端 CE
- /*共陰級數碼管段選碼*/
- unsigned char code numdu_data[]= {
- 0x3F, //"0"
- 0x06, //"1"
- 0x5B, //"2"
- 0x4F, //"3"
- 0x66, //"4"
- 0x6D, //"5"
- 0x7D, //"6"
- 0x07, //"7"
- 0x7F, //"8"
- 0x6F, //"9"
- 0x77, //"A"
- 0x7C, //"B"
- 0x39, //"C"
- 0x5E, //"D"
- 0x79, //"E"
- 0x71, //"F"
- 0x76, //"H"
- 0x38, //"L"
- 0x37, //"n"
- 0x3E, //"u"
- 0x73, //"P"
- 0x5C, //"o"
- 0x40, //"-"
- };
- /*共陰級數碼管位選碼*/
- unsigned char code numwei_data[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- /*共陰級數碼管顯示函數*/
- void display(Sce,Min,Hour)
- {
- unsigned char Scege,Sceshi,Minge,Minshi,Hourge,Hourshi;
- static unsigned char i;//靜態變量
- Scege = Sce%10;// 12/10=1_2 取余2
- Sceshi = Sce/10;// 12/10=1_2 取商1
- Minge = Min%10;// 12/10=1_2 取余2
- Minshi = Min/10;// 12/10=1_2 取商1
- Hourge = Hour%10;// 12/10=1_2 取余2
- Hourshi = Hour/10;// 12/10=1_2 取商1
-
- P0 = 0XFF;
- wei = 1;//位選碼打開
- P0 = numwei_data[i];
- wei = 0;//鎖存位選碼
- switch(i)
- {
- // 如果是0 段選打開 P0等于數組里面的值 鎖存段選 返回
- case 0: du = 1; P0 = numdu_data[Scege]; du = 0; break;
- case 1: du = 1; P0 = numdu_data[Sceshi]; du = 0; break;
- case 2: du = 1; P0 = numdu_data[22]; du = 0; break;
- case 3: du = 1; P0 = numdu_data[Minge]; du = 0; break;
- case 4: du = 1; P0 = numdu_data[Minshi]; du = 0; break;
- case 5: du = 1; P0 = numdu_data[22]; du = 0; break;
- case 6: du = 1; P0 = numdu_data[Hourge]; du = 0; break;
- case 7: du = 1; P0 = numdu_data[Hourshi]; du = 0; break;
- }
- i++; //i自加
- if(i == 8)//因為numwei_data[]里面只有8個元素,所以只能加到8
- i = 0;//清零
- }
- /*定時器0中斷寄存器配置*/
- void Timer_0()
- {
- TMOD = 0X01;//配置TMOD寄存器 定時器0在16位工作模式下
- TH0 =((65535-921)*y)/256;//1ms 把初值放入高8位
- TL0 =((65535-921)*y)%256;//1ms 把初值放入低8位
- EA = 1;//總中斷打開
- ET0 = 1;//TO溢出中斷允許位
- TR0 = 1;//允許定時0開始計數
- }
- /*定時器0溢出中斷函數*/
- void Timer0_init() interrupt 1
- {
- TH0 =((65535-921)*y)/256;//1ms 把初值放入高8位
- TL0 =((65535-921)*y)%256;//1ms 把初值放入低8位
- display(Sce,Min,Hour);//共陰級數碼管顯示函數
- }
- /*DS1302寫數據*/
- void DS1302_wirte_dat(unsigned char cmd,unsigned char dat)
- {
- unsigned char i; //發送數據次數變量
-
- TRST = 0;// CE 拉低使能端
- TSCLK = 0;//SCLK 拉低時鐘線
- TRST = 1;//CE 拉高使能端 產生上升沿 允許開始寫數據
- for(i = 0; i < 8; i++) // 執行8次將8位字節的數據寫入
- {
- TSCLK = 0; //SCLK 拉低時鐘線
- TIO = cmd & 0x01;//寫入一位數據 從最低位開始寫入
- TSCLK = 1;// TSCLK產生上升沿時執行寫入數據 數據被DS1302讀取
- cmd >>= 1;//右移一位
- }
- for(i = 0; i < 8; i++)//執行8次將8位字節的數據寫入
- {
- TSCLK = 0;//SCLK 拉低時鐘線
- TIO = dat & 0x01;//寫入一位數據 從最低位開始寫入
- TSCLK = 1;// TSCLK產生上升沿時執行寫入數據 數據被DS1302讀取
- dat >>= 1;//右移一位
- }
- }
- /*DS1302讀數據*/
- unsigned char DS1302_Read_dat(unsigned char cmd)
- {
- unsigned char i,dat;//i發送數據次數變量 dat存放讀取數據的變量
- TRST = 0;// CE 拉低使能端
- TSCLK = 0;//SCLK 拉低時鐘線
- TRST = 1;//CE 拉高使能端 產生上升沿 允許開始寫數據
- for(i = 0; i < 8; i++) // 執行8次將8位字節的數據寫入
- {
- TSCLK = 0; //SCLK 拉低時鐘線
- TIO = cmd & 0x01; //寫入一位數據 從最低位開始寫入
- TSCLK = 1;// TSCLK產生上升沿時執行寫入數據 數據被DS1302讀取
- cmd >>= 1; //右移一位
- }
- for(i = 0; i < 8; i++)// 執行8次將8位字節的數據寫入
- {
- TSCLK = 0;//SCLK 拉低時鐘線
- dat >>= 1;//讀取數據變量dat右移一位
- if(TIO == 1) //如果TIO是高電平(為1)
- dat |= 0x80;//那么讀取數據變量dat或等于1000 0000
- TSCLK = 1;//將SCLK時鐘線拉高 準備下次通信
- }
- return dat;//得到的值返回
- }
- /*數據轉換成BCD碼 十進制轉換成BCD碼*/
- unsigned char Dat_Chg_BCD(unsigned char dat)
- { //45
- unsigned char dat1,dat2;
- dat1 = dat / 10;// 45/10=4_5 取值4
- dat2 = dat % 10;// 45/10=4_5 取值5
- dat2 = dat2 + dat1 * 16;// 5+4*16=69
- return dat2;//得到的值69返回
- }
- /*BCD碼轉換成數據 BCD碼轉換成十進制*/
- unsigned char BCD_Chg_Dat(unsigned char dat)
- { //69
- unsigned char dat1,dat2;
- dat1 = dat /16;// 69/16 = 4_5取值4
- dat2 = dat %16;// 69/16 = 4_5取值5
- dat2 = dat2 + dat1 *10;//5+4*10=45
- return dat2;//得到的值45返回
- }
- void main()
- {
- Timer_0();//定時器0寄存器配初始化
- DS1302_wirte_dat(0x8e,0);//關閉DS1302的寫保護 好方便往里面寫數據
- DS1302_wirte_dat(0x80,Dat_Chg_BCD(30));//寫秒初始顯示時間 往DS1302里面需要轉換成BCD碼才能寫進去
- DS1302_wirte_dat(0x82,Dat_Chg_BCD(15));//寫分初始顯示時間
- DS1302_wirte_dat(0x84,Dat_Chg_BCD(12));//寫分初始顯示時間
- DS1302_wirte_dat(0x8e,0x80);//打開DS1302的寫保護 寫不進數據
-
- while(1)
- {
- DS1302_wirte_dat(0x8e,0);//關閉DS1302的寫保護 好方便往里面寫數據
- Sce = BCD_Chg_Dat(DS1302_Read_dat(81));//讀秒
- Min = BCD_Chg_Dat(DS1302_Read_dat(83));//讀分
- Hour = BCD_Chg_Dat(DS1302_Read_dat(85));//讀時
- DS1302_wirte_dat(0x8e,0x80);//打開DS1302的寫保護 寫不進數據
-
-
- }
-
- }
復制代碼
|