基于STC12C5A60S2系列单片机万年历时钟

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档