求一份51 单片机的数字时钟的C语言代码 可以用于超想-3000TC

如题所述

/*头文件---------------------------------------------------------------------*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
/*定义全局变量---------------------------------------------------------------*/
uchar sec,min,hour;
//秒,分,小时
bit w = 0; //调时标志位
/*定义数码管数据线-----------------------------------------------------------*/
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
#define leddata P0
/*定义按键-------------------------------------------------------------------*/
sbit K1 = P1^0; //K1-设置
sbit K2 = P1^1; //K2-确认
sbit K3 = P1^2; //K3-加
sbit K4 = P1^3; //K4-减
/*定义DS12CR887数据线--------------------------------------------------------*/
sbit DS_CS = P1^4;
sbit DS_AS = P1^5;
sbit DS_RW = P1^6;
sbit DS_DS = P1^7;
#define Ds_Bus P0 //DS12CR887数据总线

void display(void);

unsigned char code dis_7[]={
0x7D, // 0
0x50, // 1
0x6E, // 2
0x7A, // 3
0x53, // 4
0x3B, // 5
0x3F, // 6
0x70, // 7
0x7F, // 8
0x7B, // 9

};
unsigned char code scan_6[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char dispbuf[6]={0,0,0,0,0,0};
//延时函数 1MS/次
void DelayM(uint a)
{
uchar i;
while( --a != 0)
{
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
void delays(unsigned char k)
{
unsigned char i,j;
for(i=0;i<k;i++)
for(j=0;j<50;j++);
}
/*DS12CR887驱动程序----------------------------------------------------------*/
//往DS12CR887写数据函数
void ds_write(uchar add,uchar date)
{
DS_CS=0;
DS_DS=1;
DS_RW=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_RW=0;
Ds_Bus=date;
DS_RW=1;
DS_AS=1;
DS_CS=1;
}
//读取DS12CR887的数据
uchar ds_read(uchar add)
{
uchar z;
DS_CS=0;
DS_RW=1;
DS_DS=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_DS=0;
Ds_Bus=0xff;
z=Ds_Bus;
DS_DS=1;
DS_AS=1;
DS_CS=1;
return z;
}
//DS12CR887初始化
void ds_int()
{
DS_AS=0;
DS_DS=0;
DS_RW=0;
ds_write(0x0a,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
}
/*---------------数码管驱动程序------------------------------------------------*/
void display(void)
{
uint k;
DS_CS=1;
for(k = 0;k<6;k++)
{leddata=dis_7[dispbuf[k]];
P2 = scan_6[k];delays(10);P2=0xff;
DS_CS=0;
}
}

//往显示缓冲区填写 小时 数据
void led_w_hour(void)
{
hour=ds_read(4);//读取DS12CR887的小时
dispbuf[1]=hour%10;
dispbuf[0]=hour/10;
}

//往显示缓冲区填写 分钟 数据
void led_w_min(void)
{
min=ds_read(2);//读取DS12CR887的分
dispbuf[3]=min%10;
dispbuf[2]=min/10;
}

//往显示缓冲区填写 秒 数据
void led_w_sec(void)
{
sec=ds_read(0);//读取DS12CR887的秒
dispbuf[5]=sec%10;
dispbuf[4]=sec/10;
}

/*调整时间、日期程序---------------------------------------------------------*/
void Set_time(uchar sel)
{
signed char address,item;
signed char max,mini;
if(sel==1) {address=2; max=59;mini=0;} //分钟2
if(sel==0) {address=4; max=23;mini=0;} //小时4

//读取DS12CR887某地址上的数值赋给item
item=ds_read(address);
if(K3 == 0)//K3-加
{
item++;//数加 1
}
if(K4 == 0)//K4-减
{
item--;//数减 1
}
if(item>max)
item=mini;//查看数值有效范围
if(item<mini)
item=max;

//将调整好的item值写入DS12CR887
ds_write(address,item);//+
led_w_hour(); //时
led_w_min(); //分

}

/*主程序---------------------------------------------------------------------*/

main()
{
uchar e=0;
K1=1;K2=1;K3=1;K4=1;
ds_int(); //初始化DS12CR887
while(1)
{
if (w == 0) //正常走时
{

led_w_hour(); //显示时
led_w_min(); //显示分
led_w_sec(); //显示秒
display();
}
else {}//否则启动调时

if (K1 == 0) // 设置时间
{
DelayM(20); //按键消抖
if(K1 == 0 && w == 1) //当是调时状态 本键用于调整下一项
{
e++;
if (e >= 2 )
{
e = 0;
}
Set_time(e);//调整
}
if(K1 == 0 && w == 0) //当是正常状态时就进入调时状态
{

w=1; //进入调时
Set_time(e);//调整
}
while(K1 == 0);//等待键松开
}

if (K2 == 0) // 当在调时状态时就退出调时
{
DelayM(20);//按键消抖
if(K2 == 0 && w == 1)
{
w = 0; //退出调时
e = 0; //"下一项"计数器清0
}

led_w_hour(); //时
led_w_min(); //分
led_w_sec(); //秒
display();
while(K2 == 0);//等待键松开
}

if (K3 == 0 && w == 1)//加调整
{
DelayM(20);//按键消抖
if(K3 == 0 && w == 1)
{
Set_time(e);//调整
}
while(K3 == 0);//等待键松开
}

if (K4 == 0 && w == 1) //减调整
{
DelayM(20);//按键消抖
if(K4 == 0 && w == 1)
{
Set_time(e);//调整
}
while(K4 == 0);//等待键松开
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-02-06
/*DS12CR887驱动程序----------------------------------------------------------*/
//往DS12CR887写数据函数
void ds_write(uchar add,uchar date)
{
DS_CS=0;
DS_DS=1;
DS_RW=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_RW=0;
Ds_Bus=date;
DS_RW=1;
DS_AS=1;
DS_CS=1;
}
//读取DS12CR887的数据
uchar ds_read(uchar add)
{
uchar z;
DS_CS=0;
DS_RW=1;
DS_DS=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_DS=0;
Ds_Bus=0xff;
z=Ds_Bus;
DS_DS=1;
DS_AS=1;
DS_CS=1;
return z;
}
//DS12CR887初始化
void ds_int()
{
DS_AS=0;
DS_DS=0;
DS_RW=0;
ds_write(0x0a,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
}
/*---------------数码管驱动程序------------------------------------------------*/
void display(void)
{
uint k;
DS_CS=1;
for(k = 0;k<6;k++)
{leddata=dis_7[dispbuf[k]];
P2 = scan_6[k];delays(10);P2=0xff;
DS_CS=0;
}
}

//往显示缓冲区填写 小时 数据
void led_w_hour(void)
{
hour=ds_read(4);//读取DS12CR887的小时
dispbuf[1]=hour%10;
dispbuf[0]=hour/10;
}

//往显示缓冲区填写 分钟 数据
void led_w_min(void)
{
min=ds_read(2);//读取DS12CR887的分
dispbuf[3]=min%10;
dispbuf[2]=min/10;
}

//往显示缓冲区填写 秒 数据
void led_w_sec(void)
{
sec=ds_read(0);//读取DS12CR887的秒
dispbuf[5]=sec%10;
dispbuf[4]=sec/10;
}

/*调整时间、日期程序---------------------------------------------------------*/
void Set_time(uchar sel)
{
signed char address,item;
signed char max,mini;
if(sel==1) {address=2; max=59;mini=0;} //分钟2
if(sel==0) {address=4; max=23;mini=0;} //小时4

//读取DS12CR887某地址上的数值赋给item
item=ds_read(address);
if(K3 == 0)//K3-加
{
item++;//数加 1
}
if(K4 == 0)//K4-减
{
item--;//数减 1
}
if(item>max)
item=mini;//查看数值有效范围
if(item<mini)
item=max;

//将调整好的item值写入DS12CR887
ds_write(address,item);//+
led_w_hour(); //时
led_w_min(); //分

}
相似回答