单片机中有一元件引脚上标注为“CLK”请问这个CLK是什么意思???
时钟信号引脚。
“清除”的英文是clear,在电子方面的英文缩写是CLR
求用单片机c语言做一个电子时钟,实现调时、显示、整点报时等功能。
(1)用数字逻辑集成块实现;
(2)时间以24小时为一个周期,显示时、分、秒;
(3)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;
(4)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。
c51单片机 晶振为11.0592MHz
#includereg52.h
#define HOUR1 1
#define HOUR0 0
#define MIN1 2
#define MIN0 8
#define SEC1 2
#define SEC0 0
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
int i;
ulint
sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;//秒计数全局变量
uchar code segment[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code time[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay(uint);//程序毫秒延时
void beeper(uchar);//开蜂鸣器毫秒
void init();//初始化函数
void display();//从数码管上显示
void counter();//计算进行过程中的时、分、秒值
void scan();//扫描键盘
void main()
{
init();
while(1)
{
scan();//扫描键盘看是否有键按下
for(i=6;i0;i–)//动态扫描6位数码管
{
display();//显示时、分、秒
}
}
}
void init()
{
second=hour1*36000+hour0*3600+min1*600+min0*60+sec1*10+sec0;
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)//程序毫秒延时
{
uint x=0,y=0;
for(x=z;x0;x–)
for(y=110;y0;y–);
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
count++;
if(count==20)//判断是否到1秒
{
counter();//计算进行过程中的时、分、秒值
if(sharp!=hour0) beeper(1000);//判断小时的值是否改变,变则启动蜂鸣器
}
}
void beeper(uchar tt)
{
uchar t=tt;
count=0;
beep=0;//开蜂鸣器
delay(t);
beep=1;//关蜂鸣器
}
void display()
{
P0=0xff;//位消影(低电平选择位)
//送位选信号
wela=1;
P0=segment[i-1];
wela=0;
P0=0x00;//段消影(高电平选择段)
//送段选信号
dula=1;
switch(i)
{
case 6 : P0=time[sec0]; break;
case 5 : P0=time[sec1]; break;
case 4 : P0=time[min0]; break;
case 3 : P0=time[min1]; break;
case 2 : P0=time[hour0]; break;
case 1 : P0=time[hour1]; break;
}
delay(1);
P0=0x00; //配合上面用于消隐
dula=0;
}
void counter()
{
second++;
if(second==86400) second=0;
count=0;
sharp=hour0;//设置报时检测KEY
sec0=second%10;
sec1=(second%60-sec0)/10;
min0=((second%3600-sec1*10-sec0)/60)%10;
min1=((second%3600-sec1*10-sec0)/60-min0)/10;
hour0=(second%36000-min1*600-min0*60-sec1*10-sec0)/3600;
hour1=second/36000;
}
void scan()
{
}
单片机c程序设计中 ~CLK代表什么?
CLK应该是为变量,当T0中断时取反一次。
再看看别人怎么说的。
单片机做的日历 c语言程序
这是一个DS1302时钟程序,根据自己的硬件电路适当改改就可以做成日历了 /********************************************************************
*DS1302控制程序 2011.12.01 wqz
********************************************************************/
#includereg52.h
#includeintrins.h
typedef unsigned uchar;sbit sda=P2^1; //DS1302
sbit clk=P2^0;
sbit ce=P2^2;
//sbit sda=P3^4;
//sbit clk=P3^6;
//sbit ce=P3^5;
//
//sbit _138_A=P2^2; //138A,B,C口
//sbit _138_B=P2^3;
//sbit _138_C=P2^4;sbit IO =P1^7; //595控制信号
sbit RLK =P1^6;
sbit CLK =P1^5;#define my_delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
//#define T0_init() TMOD=0x01;TH0=0xb8;TL0=0x00;TR0=1;ET0=1;EA=1uchar cc[8]; //将要显示的时间由BCD码转换成要显示的数值存放在CC[]中
uchar bb[8]; //存放从DS1302中读取出来的数据
uchar aa[7]={0,30,18,20,12,6,11}; //初始时间
uchar code write_rtc[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //时间寄存器写地址
uchar code tember[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管显示表void my_delay1ms(int t); //延时1ms函数
void write_1byte(uchar temp); //写一字节数据
uchar read_1byte(); //读一字李数据
void write_addr_data(uchar Addr, uchar Data); //先写地址再写数据
uchar writeadd_readdat(uchar ucAddr); //先写地址再读数据
void write1_readM(); //连续读多个字节数据
void ds1302_init(); //DS1302初始化/********************************************************************
*
* 主函数
********************************************************************/void main()
{
uchar i,j,dat; my_delay1ms(10);
ds1302_init(); //给DS1302付初值 11年12月20日 周六 18-30-00
// T0_init(); while(1)
{
write1_readM(); //读DS1302中的数据 cc[0]=bb[0]%16;
cc[1]=bb[0]/16;
cc[2]=10;
cc[3]=bb[1]%16;
cc[4]=bb[1]/16;
cc[5]=10;
cc[6]=bb[2]%16;
cc[7]=bb[2]/16; for(j=0;j8;j++)
{
dat=tember[cc[j]];
RLK=0;
my_delay5us();
for(i=0;i8;i++)
{
if(dat0x80)IO=1;
else IO=0;
my_delay5us();
CLK=1;
my_delay5us();
CLK=0;
dat=1;
}
my_delay5us();
RLK=1;
}
my_delay1ms(500);
}
}/**********************************************************************/void my_delay1ms(int t) //延时
{
uchar i,j;
while(t–)
{
for(i=4;i0;i–)
for(j=50;j0;j–);
}
}/**********************************************************************/void write_1byte(uchar temp) //写一字节数据
{
uchar i; clk=0;
my_delay5us();
for (i=0;i8;i++)
{
if(temp0x01)sda=1;
else sda=0;
my_delay5us();
clk=1;
my_delay5us();
clk=0;
temp=1;
}
}/**********************************************************************/uchar read_1byte() //读一字节数据
{
uchar i,num;
for (i=0;i8;i++)
{
num=1;
if(sda)
num|=0x80;
my_delay5us();
clk=1;
my_delay5us();
clk=0;
}
return num;
}/**********************************************************************/void write_addr_data(uchar Addr, uchar Data) //先写地址再写数据
{
ce = 0;
my_delay5us();
clk = 0;
my_delay5us();
ce = 1;
my_delay5us();
write_1byte(Addr); // 地址,命令
write_1byte(Data); // 写1Byte数据
my_delay5us();
clk=1;
my_delay5us();
ce =0;
} /**********************************************************************/uchar writeadd_readdat(uchar ucAddr) //先写地址再读数据
{
uchar num1=0; ce = 0 ;
my_delay5us();
clk = 0;
my_delay5us();
ce = 1;
my_delay5us();
write_1byte(ucAddr); // 地址,命令
num1 = read_1byte(); // 读1Byte数据
my_delay5us();
clk = 1;
my_delay5us();
ce =0; return(num1);
}/**********************************************************************/void write1_readM() //连续读多个字节数据
{
uchar i,Addr; Addr=0x81;
for (i=0;i7;i++)
{
bb[i] = writeadd_readdat( Addr);//*格式为: 秒 分 时 日 月 星期 年
Addr += 2;
}
}/**********************************************************************/void ds1302_init() //初始时间 11年12月20日 周六 18-30-00
{
uchar i,*p,tmp; for(i=0;i7;i++)
{ /*如想设置DS1302的“秒”,设置时间为37秒,所以输入的是十*/
tmp=aa[i]/10; /*进制数37,对应的16进制是0x25,但是DS1302寄存器使用的是压*/
aa[i]=aa[i]%10; /*缩BCD码,所以应该写入BCD数值37才行,即0x37。所以需要将*/
aa[i]=aa[i]+tmp*16; /*10进制的37转换为16进制表示的0x37*/
}
write_addr_data(0x8E,0X00);
p=write_rtc; //传地址
for(i=0;i7;i++) //7次写入 秒分时日月周年
{
write_addr_data(*p,aa[i]);
p++;
} write_addr_data(0x8E,0x80);
}/**********************************************************************///void ET0_ser() interrupt 1
//{
//// uchar i;
//
// TH0=0x55;
// TL0=0x00;
//
//// P0=tember[cc[i]];
//// switch(i)
//// {
//// case 0 : _138_A=1;_138_B=1;_138_C=1; break;
//// case 1 : _138_A=0;_138_B=1;_138_C=1; break;
//// case 2 : _138_A=1;_138_B=0;_138_C=1; break;
//// case 3 : _138_A=0;_138_B=0;_138_C=1; break;
//// case 4 : _138_A=1;_138_B=1;_138_C=0; break;
//// case 5 : _138_A=0;_138_B=1;_138_C=0; break;
//// case 6 : _138_A=1;_138_B=0;_138_C=0; break;
//// case 7 : _138_A=0;_138_B=0;_138_C=0; break;
//// }
//// i++;
//// if(i==8)i=0;
//}