51单片机电子时钟程序
单片机源程序如下:
- #include "intrins.h"
- #include "string.h"
- #include "STC15Fxxxx.H"
- #include "main.h"
- #include "HC595.H"
- #include "ds1302.h"
- //秒分时日月周年
- 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接地,设置P0.0~P0.3为4个独立按键
- 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}; //显示单元数据,共8个数据和一个运算暂用
- void Delay10ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- } while (--i);
- }
- //蜂鸣器函数
- //////////////////////////////////////
- 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++);
- }
- }
- ///////////////////////////////////////////////////////////////////////
- // 串口初始化函数
- ///////////////////////////////////////////////////////////////////////
- void UartInit(void) //9600bps@11.0592MHz
- {
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x40; //定时器1时钟为Fosc,即1T
- AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- TMOD &= 0x0F; //设定定时器1为16位自动重装方式
- TL1 = 0xE0; //设定定时初值
- TH1 = 0xFE; //设定定时初值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
-
- // ES = 1; //使能串口1中断
- REN =1;
- }
- ////////////////////////////
- void PortInit()
- {
- P0M1 =0X00;
- P0M0 =0X00;
- P1M1 =0X00;
- P1M0 =0X0C;////P1.2、P1.3强驱动模式,P1.2继电器,P1.3蜂鸣器
- P2M1 =0X00;
- P2M0 =0X00;
- P3M1 =0X00;
- P3M0 =0X00;
- P4M1 =0X00;
- P4M0 =0X00;
- P5M1 =0X00;
- P5M0 =0X00;
-
- SingleKey = 0;////把P0.7接地,设置P0.0~P0.3为4个独立按键
- KEY1 =1;
- KEY2 =1;
- KEY3 =1;
- KEY4 =1;
- }
- void Timer0Init(void) //10毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0xDC; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- 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;
- }
- //时分秒处理数据处理
- 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;
- }
- //设置时间
- 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;
- }
- }
- /**************************************************************************
- *函数名称:main()
- *功能 :主函数
- **************************************************************************/
- void main()
- {
- unsigned int i;
- AUXR =0x00;
- PortInit();
- UartInit(); // 串口1//注意,下载程序选择晶振:11.0592MHz,波特率9600bps
- Delaylong(500);
- Beep(5000);
- //P6=0XFF;
- Ds1302Init();
- Timer0Init();
- while(1)
- {
- Ds1302ReadTime();//读取时钟信息
- if(KEY1 == 0)//切换界面
- {
- Delay10ms();
- if(KEY1 == 0)
- flag = !flag;
- while(!KEY1);
- }
- if(KEY2 == 0)//设置时钟
- {
- Delay10ms();
- if(KEY2 == 0)
- {
- flag_ = 1;
- }
- while(!KEY2);
- }
- if(flag_)//设置时钟界面
- {
-
- if(flag == 0)
- {
- Set_Time[0] = TIMES[2];
- Set_Time[1] = TIMES[1];
- Set_Time[2] = TIMES[0];
- Ds1302Write(0x8E,0X00);//打开写保护
- 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);//禁止写保护
- }
- }
- if(flag_ == 0)//显示时钟界面
- {
- for(i=0;i<8;i++) //8位LED扫描控制
- {
- if(flag == 0)//显示时分秒
- data_bas();//数据处理
- else //显示年月日
- data_abs();
- display(i,displayDat[i]);
- }
- }
- }
- }
- void Timer0()interrupt 1
- {
- static int i = 0;
- TL0 = 0x00; //设置定时初值
- TH0 = 0xDC; //设置定时初值
- i++;
- if(i == 100)//1s时间到了
- {
- i = 0;
- set_flag = !set_flag;
- }
- }
复制代码
所有资料51hei提供下载:
IAP15F4K-HC595-Test(完整)2.0板子.zip
(113.19 KB, 下载次数: 13)
|