基于STC12C5A60S2系列单片机万年历时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**************************************************/
/*基于STC12C5A60S2系列单片机+595驱动五个数码管+165按键输入
+1302实时时钟+18B20温度传感器的万年历时钟
功能键:0xfe:实现温度,时间,年月日,周的转换显示
0xdf:实现每按一次可以一次更改小时,分,年,月,日,周的闪烁,而
实现加减按键对其改变数值
0xfb:加功能键,在0xdf有效的情况下才能生效
0xfd:减功能键,在0xdf有效的情况下才能生效
数码管亮度有点不一致,还希望高手能帮忙解决,其他功能都是正常的,也可以给各位爱好单片机的新人们一个互相交流的一段小程序,后面付有图片
*/
#include < 12C5A60S2.h > //头文件
#include < intrins.h >
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar time_tuf[]={0x14,0x04,0x10,0x12,0x30,0x00,0x5}; //年月日时分秒周
uchar code weima[]={0x20,0x10,0x08,0x04,0x02,0x01}; //数码管位选
uchar code duan_ma[]={0xee,0x88,0xd6,0xdc,0xb8,0x7c,0x7e,0xc8,0xfe,0xfc}; //数码管段选信号
uchar sec,min,hour,day,month,year,week,num,flag,flag1,flag2,flag3,Flicker,di,x,h;
//时间变量及标志位变量
uint tt,tvalue; //变量
void yueri_work(void); //月日显示程序
void nian_work(void); //年显示程序
void Show_pass(uchar dss); //不显示程序
void zhou_work(void); //周显示程序
void delay_18B20(uint i); //温度延时显示程序
void wendu_work(void); //温度显示程序
void show_work(void); //显示程序
void KEY(void); //按键显示程序
sbit RCLK=P0^2; //595输出存储器锁存时钟线/165装载移位控制锁存信号
sbit SRCLK=P0^0; //595数据输入时钟线
sbit SER=P0^3; //595数据线
sbit SO=P0^4; //165数据输出数据线
sbit CLK=P0^1; //165时钟信号
sbit RST=P0^5; //1302复位引脚,高电平有效
sbit IO=P0^6; //1302数据输入输出引脚
sbit SCL=P0^7; //1302串行时钟输入,控制数据线的输入输出
sbit DQ=P1^0; //18B20数字温度传感器,输入输出口
void Delayms(uint z) //1毫秒1T时钟模式下
{
uint x,y;
for(x=z;x>0;x--)
for(y=848;y>0;y--);
}
/********************595驱动程序*********************/
void wr595(uchar date) //595写入一个字节
{
uchar i;
for(i=0;i<8;i++)
{
SRCLK=1;
SER=date&0x80;
date<<=1;
SRCLK=0;
}
}
void send2baty(uchar date1,uchar date2) //写入双字节程序
{
wr595(date1);
wr595(date2);
}
void out595(void) //595输出锁存程序
{
RCLK=0;
RCLK=1;
}
/****************************************************/
/**************165移位寄存器并转串驱动***************/
uchar series_165()
{
uchar i;
uchar BYTE=1; //最终接收到得字符
RCLK=0; //将165外部端口数据装入内部寄存器
RCLK=1; //抬高为移位准备
for(i=0;i<8;i++)
{
BYTE<<=1; // 1
CLK=1; //时钟低
BYTE=BYTE|SO; //先接收高位
CLK=0; //时钟高,上升沿下一个数据移出
// 5
}
return BYTE; //返回接收字符
}
/****************************************************/
/***************18B20数字传感器驱动程序**************/
void delay_18B20(uint i) //延时1微秒
{
i=i*12; //由于我用的是1T 51单片机如果用普通51请把这句话屏蔽while(i--);
}
void ds1820rst(void) //ds1820初始化
{
uchar x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd(void) //读数据
{
uchar i=0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ) //如果DQ==1,执行下面语句
{
dat|=0x80;
}
delay_18B20(10);
}
return(dat);
}