标题:
51单片机电子时钟程序 IAP15F4K-HC595-Test(完整)
[打印本页]
作者:
LUOTAIXING
时间:
2019-5-25 16:01
标题:
51单片机电子时钟程序 IAP15F4K-HC595-Test(完整)
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)
2019-5-25 16:00 上传
点击文件名下载附件
51单片机电子时钟
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1