|
51單片機(jī)電子時(shí)鐘程序
單片機(jī)源程序如下:
- #include "intrins.h"
- #include "string.h"
- #include "STC15Fxxxx.H"
- #include "main.h"
- #include "HC595.H"
- #include "ds1302.h"
- //秒分時(shí)日月周年
- int Set_Time[3];
- unsigned char TIMES[7] = {0x30,0x30,0x10,0x30,0x11,0x05,0x18};
- sbit SPEAKER = P1^3;
- sbit SingleKey = P0^7;////把P0.7接地,設(shè)置P0.0~P0.3為4個(gè)獨(dú)立按鍵
- sbit KEY1 = P0^0;////P0.0為KEY1
- sbit KEY2 = P0^1;////P0.1為KEY2
- sbit KEY3 = P0^2;////P0.2為KEY3
- sbit KEY4 = P0^3;////P0.3為KEY4
- bit flag = 0,flag_ = 0;
- bit set_flag;
- unsigned char index = 0;
- unsigned char scan_con[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //列掃描控制字
- unsigned char displayDat[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //顯示單元數(shù)據(jù),共8個(gè)數(shù)據(jù)和一個(gè)運(yùn)算暫用
- void Delay10ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- } while (--i);
- }
- //蜂鳴器函數(shù)
- //////////////////////////////////////
- void Beep(unsigned int dd)
- {
- SPEAKER=1;
- Delaylong(dd);
- SPEAKER=0;
- }
- ////////////////////////////////////////////////////
- void Delaylong(unsigned int t)//
- {
- unsigned int i,j;
- for(i=0;i<t;i++)
- {
- for(j=0;j<10;j++);
- }
- }
- ///////////////////////////////////////////////////////////////////////
- // 串口初始化函數(shù)
- ///////////////////////////////////////////////////////////////////////
- void UartInit(void) //9600bps@11.0592MHz
- {
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
- AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
- TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
- TL1 = 0xE0; //設(shè)定定時(shí)初值
- TH1 = 0xFE; //設(shè)定定時(shí)初值
- ET1 = 0; //禁止定時(shí)器1中斷
- TR1 = 1; //啟動(dòng)定時(shí)器1
-
- // ES = 1; //使能串口1中斷
- REN =1;
- }
- ////////////////////////////
- void PortInit()
- {
- P0M1 =0X00;
- P0M0 =0X00;
- P1M1 =0X00;
- P1M0 =0X0C;////P1.2、P1.3強(qiáng)驅(qū)動(dòng)模式,P1.2繼電器,P1.3蜂鳴器
- P2M1 =0X00;
- P2M0 =0X00;
- P3M1 =0X00;
- P3M0 =0X00;
- P4M1 =0X00;
- P4M0 =0X00;
- P5M1 =0X00;
- P5M0 =0X00;
-
- SingleKey = 0;////把P0.7接地,設(shè)置P0.0~P0.3為4個(gè)獨(dú)立按鍵
- KEY1 =1;
- KEY2 =1;
- KEY3 =1;
- KEY4 =1;
- }
- void Timer0Init(void) //10毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0xDC; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 = 1;
- EA = 1;
- }
- void data_abs()
- {
- displayDat[0] = TIMES[6]/10;
- displayDat[1] = TIMES[6]%10;
- displayDat[2] = TIMES[4]/10;
- displayDat[3] = TIMES[4]%10;
- displayDat[4] = TIMES[3]/10;
- displayDat[5] = TIMES[3]%10;
- displayDat[6] = TIMES[5]/10;
- displayDat[7] = TIMES[5]%10;
- }
- //時(shí)分秒處理數(shù)據(jù)處理
- void data_bas()
- {
- displayDat[0] = TIMES[2]/10;
- displayDat[1] = TIMES[2]%10;
- displayDat[2] = 18;
- displayDat[3] = TIMES[1]/10;
- displayDat[4] = TIMES[1]%10;
- displayDat[5] = 18;
- displayDat[6] = TIMES[0]/10;
- displayDat[7] = TIMES[0]%10;
- }
- //設(shè)置時(shí)間
- void sit_Time()
- {
- if(set_flag == 0&&index == 0||index != 0)
- {
- displayDat[0] = Set_Time[0]/10;
- displayDat[1] = Set_Time[0]%10;
- }
- if(set_flag == 1&&index == 0)
- {
- displayDat[0] = 16;
- displayDat[1] = 16;
- }
- displayDat[2] = 18;
- if(set_flag == 0&&index == 1||index != 1)
- {
- displayDat[3] = Set_Time[1]/10;
- displayDat[4] = Set_Time[1]%10;
- }
- if(set_flag == 1&&index == 1)
- {
- displayDat[3] = 16;
- displayDat[4] = 16;
- }
- displayDat[5] = 18;
- if(set_flag == 0&&index == 2||index != 2)
- {
- displayDat[6] = Set_Time[2]/10;
- displayDat[7] = Set_Time[2]%10;
- }
- if(set_flag == 1&&index == 2)
- {
- displayDat[6] = 16;
- displayDat[7] = 16;
- }
- }
- /**************************************************************************
- *函數(shù)名稱(chēng):main()
- *功能 :主函數(shù)
- **************************************************************************/
- void main()
- {
- unsigned int i;
- AUXR =0x00;
- PortInit();
- UartInit(); // 串口1//注意,下載程序選擇晶振:11.0592MHz,波特率9600bps
- Delaylong(500);
- Beep(5000);
- //P6=0XFF;
- Ds1302Init();
- Timer0Init();
- while(1)
- {
- Ds1302ReadTime();//讀取時(shí)鐘信息
- if(KEY1 == 0)//切換界面
- {
- Delay10ms();
- if(KEY1 == 0)
- flag = !flag;
- while(!KEY1);
- }
- if(KEY2 == 0)//設(shè)置時(shí)鐘
- {
- Delay10ms();
- if(KEY2 == 0)
- {
- flag_ = 1;
- }
- while(!KEY2);
- }
- if(flag_)//設(shè)置時(shí)鐘界面
- {
-
- if(flag == 0)
- {
- Set_Time[0] = TIMES[2];
- Set_Time[1] = TIMES[1];
- Set_Time[2] = TIMES[0];
- Ds1302Write(0x8E,0X00);//打開(kāi)寫(xiě)保護(hù)
- while(1)
- {
- if(index == 3)
- {
- index = 0;
- flag_ = 0;
- break;
- }
- if(KEY2 == 0)
- {
-
- Delay10ms();
- if(KEY2 == 0)
- {
- index++;
- }
- while(!KEY2);
- }
- if(KEY3 == 0)//加
- {
- Delay10ms();
- if(KEY3 == 0)
-
- Set_Time[index] += 1;
- while(!KEY3);
- }
- if(KEY4 == 0)//減
- {
- Delay10ms();
- if(KEY4 == 0)
- Set_Time[index] -= 1;
- while(!KEY4);
- }
- if(Set_Time[0] > 23)Set_Time[0] = 0;
- if(Set_Time[1] > 59)Set_Time[1] = 0;
- if(Set_Time[2] > 59)Set_Time[2] = 0;
- if(Set_Time[0] < 0) Set_Time[0] = 23;
- if(Set_Time[1] < 0) Set_Time[1] = 59;
- if(Set_Time[2] < 0) Set_Time[2] = 59;
- Ds1302Write(0x80,Set_Time[2]/10*16 + Set_Time[2]%10);
- Ds1302Write(0x82,Set_Time[1]/10*16 + Set_Time[1]%10);
- Ds1302Write(0x84,Set_Time[0]/10*16 + Set_Time[0]%10);
- for(i=0;i<8;i++) //8位LED掃描控制
- {
- sit_Time();
- display(i,displayDat[i]);
- }
- }
- Ds1302Write(0x8E,0x80);//禁止寫(xiě)保護(hù)
- }
- }
- if(flag_ == 0)//顯示時(shí)鐘界面
- {
- for(i=0;i<8;i++) //8位LED掃描控制
- {
- if(flag == 0)//顯示時(shí)分秒
- data_bas();//數(shù)據(jù)處理
- else //顯示年月日
- data_abs();
- display(i,displayDat[i]);
- }
- }
- }
- }
- void Timer0()interrupt 1
- {
- static int i = 0;
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0xDC; //設(shè)置定時(shí)初值
- i++;
- if(i == 100)//1s時(shí)間到了
- {
- i = 0;
- set_flag = !set_flag;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
IAP15F4K-HC595-Test(完整)2.0板子.zip
(113.19 KB, 下載次數(shù): 13)
2019-5-25 16:00 上傳
點(diǎn)擊文件名下載附件
51單片機(jī)電子時(shí)鐘 下載積分: 黑幣 -5
|
|