uchar code seven_seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7C,0x39,0x5e,0x79,0x71};
uchar keyState = 0 ; // 0表示没有 *** 作 1 修改秒 2 修改分钟 3 修改小时 4 定闹 小时 5定闹分钟
uint ledState =0;
uchar ledStateNum=0;
uint num = 0 ;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
char timer[] ={ 0 , 0 , 0} ; //时,分,秒
char n_timer[2]={11,0};
void DelayMS(uint ms) //这是个延时函数 进入while循环后开始递减一直到函数表达式为0结束函数
{
while(ms--); //while(0)结束
}
void Display() //这是演示函数在数码管上显示
{
uchar i = 0,flags; //flags是个标志位
uchar count = 0;
uchar temp [6] ={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //六个数字
if( 4 == keyState || 5 == keyState )
{
P2 = temp[0];
P0 = 0x00;
P0 = 0x40;
DelayMS(1);
P2 = temp[1];
P0 = 0x00;
P0 = 0x40;
DelayMS(1);
P2 = temp[2];
P0 = 0x00;
if(ledState && 4 == keyState)
P0 = seven_seg[ n_timer[0] / 10 ];
else
P0 = seven_seg[ n_timer[0] / 10 ] | 0x80;
DelayMS(1);
P2 = temp[3];
P0 = 0x00;
if(ledState && 4 == keyState)
P0 = seven_seg[ n_timer[0] % 10 ];
else
P0 = seven_seg[ n_timer[0] % 10 ] | 0x80;
DelayMS(1);
P2 = temp[4];
P0 = 0x00;
if(ledState && 5 == keyState)
P0 = seven_seg[ n_timer[1] / 10 ];
else
P0 = seven_seg[ n_timer[1] / 10 ] | 0x80;
DelayMS(1);
P2 = temp[5];
P0 = 0x00;
if(ledState && 5 == keyState)
P0 = seven_seg[ n_timer[1] % 10 ];
else
P0 = seven_seg[ n_timer[1] % 10 ] | 0x80;
DelayMS(1);
P2 = 0XFF;
return ;
}
if( 0 == keyState)
{
P2 = temp[0];
P0 = 0x00;
P0 = seven_seg[ timer[0] / 10 ];
DelayMS(1);
P2 = temp[1];
P0 = 0x00;
P0=seven_seg[ timer[0] % 10 ];
DelayMS(1);
P2 = temp[2];
P0 = 0x00;
P0 = seven_seg[ timer[1] / 10 ];
DelayMS(1);
P2 = temp[3];
P0 = 0x00;
P0 = seven_seg[ timer[1] % 10 ];
DelayMS(1);
P2 = temp[4];
P0 = 0x00;
P0 = seven_seg[ timer[2] / 10 ];
DelayMS(1);
P2 = temp[5];
P0 = 0x00;
P0 = seven_seg[ timer[2] % 10 ];
DelayMS(1);
P2 = 0XFF;
return ;
}
while( i < 6 )
{
if(3- keyState == i/2 && ledState == 0)
{
flags = 0;
}
else
{
flags = 1;
}
if( flags)
{
P2 = temp[i];
P0=0x00;
if(0 == i % 2)
{
P0 = seven_seg[ timer[i/2] / 10 ];
}
else
{
P0 = seven_seg[ timer[i/2] % 10 ];
}
}
i++;
}
}
你看看行不行
#include<reg51h>
uchar code tab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}
void view() /七段数码管显示程序 七个管轮流显示/
{P3=0x01;
unsigned int i=0;
while(i<6)
{n=vnum;
P1=tab[n];
P3<<=1;
i++;
}
}
void mDelay(unsigned int Delay) /延时程序/
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void jumpnum() /用于钟表时分秒的进位/
{if(jnum(5)>9) /秒进位
{jnum[4]=jnum[4]+1;
jnum[5]=0;
if(jnum[4]>6) /秒到分进位
{jnum[3]=jnum[3]+1;
jum[4]=0;
if(jnum[3]>9) /分进位
{jnum[2]=jnum[2]+1;
jnum[3]=0;
if(jnum[2]>6) /分到时进位
{jnum[1]=jnum[1]+1;
jnum[2]=0;
if(jnum[1]>9) /时的进位
{jnum[1]=0;
jnum[0]=jnum[0]+1;
}
else if(jnum[1]>4&&jnum[0]>=2)
{jnum[1]=0;
jnum[0]=0;
}
}
}
}
}
void key() /键盘控制程序
{if((P2&0xFF)!=0xFF); /防抖动
{mDelay(3000);
if((P2&0xFF)!=0xFF)
{unsign int c;
c=1;
while(c<4)
{ if((P2&0xFF)!=0xFF);
{mDelay(3000);
vnum[]=num[];
void view();
if((P2&0xFF)!=0xFF)
{switch(P2): /判断不同的按键
{case 0xFE: c++; /c用于判断是闹钟调时c=3还是时钟调时c=2
case oxFD :if(c=2) /分位增加
{num[3]++;}
else if(c=3)
{lnum[3]++;
}
case oxFC :if(c=2) /时位增加
{num[1]++;}
else if(c=3)
{lnum[1]++;
}
}
if(c=2) /增加后判断是否需要进位
{jnum[]=num[];
jumpnum();
vnum[]=num[];
void view[];}
if(c=3)
{jnum[]=lnum[];
jumpnum();
vnum[]=num[];
void view[];}}}}}}}
void clock() /闹钟程序
{for(cl=0;num[cl]==lnum(cl);cl=cl+1) /当前时间与设定时间相同
{;}
unsigned int kp=0;
if(cl==5&&kp==0) /闹钟铃声
{for(i=1;i<100;i++)
{P1_7=~P1_7;
for(j=1;i<=100;j++);}
void mDelay(3000);
for(i=1;i<100;i++)
{P1_7=~P1_7;
for(j=1;i<=100;j++);}
vnum[]=num[];
void view();
if((P2&0xFF)!=0xFF); /判断是否有按键,有则停止闹钟
{mDelayd(3000)
void view();
if((P2&0xFF)!=0xFF)
{kp=1;}
}}}
viod intclock() /整点报时程序
{unsigned int ic,i;
if(num[2]==5&&num[3]==9&&num[4]==5&&num[5]==0) /判断差十秒整点
{if(ic=num[5]+2;(ic==(num[5]+2))&&num[5]<59;ic=num[5]) /开始发出500hz声因
{for(i=0;i<100;i++)
{P1_7=~P1_7;
for(i=0;i<=100;i++)
}
for(i=1;i<150;i++) /1000hz声音
{P1_7=~P1_7;
for(i=0;i<=50;i++)
}}}}
void count() inturrupt 1 using 2 /计时程序
{cn++;
if(cn==20)
{num[5]++;
cn=0;
}
}
void main()
{ P2=0x00;
unsigned int num[5],jnum[5],lnum[5];
ET0=1;
EA=1;
TR0=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
unsigned int cn=0;
P2=0x00;
while(1)
{void key();
void view();
void jumpnumber();
void clock();
void intclock();
}
}
你所有调用display()和 delay()函数时候都没在后面加个分号。漏了还是???
还有:
uchar code table[]={ //显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}
也应该在后面加个分号!!
你的分不好拿啊,该用分号的不用,不该用的地方用了,还有括号你用了很多中文的括号。
现在帮你改了,你自己好好对一下了,反正编译通过了,运行结果你自己看吧,我没你的目标板,运行不了。
#include<reg51h>
#define uchar unsigned char//宏定义
#define uint unsigned int
sbit dula=P2^6; //段控制位
sbit wela=P2^7; //位控制位
uchar miao,fen,aa,n1,n2,n3,n4;
uchar code table[]={ //显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z); //延时程序声明
void init(void);//初始化程序声明
void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //显示程序声明
void main() //主程序
{
init(); //调用初始化程序
while(1) //进入大循环
{
if(aa==20) //判断是否到了1S
{
miao++; //秒数加1
if(miao==60) //判断是否到了60秒
{
miao=0; //秒数清0
fen++; //分数加1
if(fen==60) //判断是否到了60分
{
fen=0; //分数到60则清0
}
n1=fen/10; //第一个数码管显示分的十位
n2=fen%10; //第二个数码管显示分的个位
n3=miao/10; //第三个数码管显示秒的十位
n4=miao%10; //第四个数码管显示秒的个位
}
display(n1,n2,n3,n4);
}
}
}
void delay(uint z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar n1 ,uchar n2,uchar n3,uchar n4)
{
dula=1; //开段选
P0=table[n1]; //送分的十位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfe; //选通分的十位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n2]; //送分的个位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfd; //选通分的个位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n3]; //送秒的十位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfb; //选通秒的十位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n4]; //送秒的个位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xf7; //选通秒的个位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
}
void init(void)
{
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-50000)/256; //求模
TL0=(65536-50000)%256; //求余
aa++;
}
#include <NEW_8051h>"
#include <taskh>
//
sbit T_CLK=P3^5; //DS1302引脚连接
sbit T_IO =P3^6;
sbit T_RST=P3^7;
sbit ACC0=ACC^0; //1bit数据存储位
sbit ACC7=ACC^7;
uchar starts_time[7]={0x00,0x10,0x22,0x20,0x05,0x04,0x10}; //初始化后设置
uchar Sec;
uchar Cent;
uchar Hour;
uchar Year;
uchar Day;
uchar Week;
uchar Month;
//
//根据选择调整相应项目
void Set(uchar sel,uchar sel_1)
{
uchar address,time;
uchar max,min;
if(sel==1) {address=0x84; max=23;min=0;} //小时
if(sel==2) {address=0x82; max=59;min=0;} //分钟
if(sel==3) {address=0x88; max=12;min=1;} //月
if(sel==4) {address=0x86; max=31;min=1;} //日
if(sel==5) {address=0x8a; max=7;min=1;} //星期
time=R1302(address+1)/1610+R1302(address+1)%16; //变成BCD码
if (sel_1==1) time++; else time--;
if(time>max) time=min;
if(time<min) time=max;
W1302(0x8e,0x00);
W1302(address,time/1016+time%10);
W1302(0x8e,0x80);
}
//DS1302读写程序///
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
/
void RTInputByte(uchar d)
{
uchar h;
ACC = d;
for(h=8; h>0; h--)
{
T_IO = ACC0; /相当于汇编中的 RRC /
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
uchar RTOutputByte(void)
{
uchar h;
for(h=8; h>0; h--)
{
ACC = ACC >>1; /相当于汇编中的 RRC /
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
//
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); / 地址,命令 /
RTInputByte(ucDa); / 写1Byte数据/
T_CLK = 1;
T_RST = 0;
}
/
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); / 地址,命令 /
ucData = RTOutputByte(); / 读1Byte数据 /
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
/
void Set1302(uchar pClock)
{
uchar h;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); / 控制命令,WP=0,写 *** 作/
for(h =7; h>0; h--)
{
W1302(ucAddr,pClock); / 秒 分 时 日 月 星期 年 /
pClock++;
ucAddr +=2;
}
W1302(0xc0,0x01);
W1302(0XC2,0X03); //初始自动转换显示时间为3秒。
W1302(0x8e,0x80); / 控制命令,WP=1,写保护/
}
void Auto_Set1302(uchar pClock)
{
uchar h;
uchar ucAddr = 0x80;
if(((R1302(0x81))&0x80)==0x80)
{
W1302(0x8e,0x00); / 控制命令,WP=0,写 *** 作/
for(h =7; h>0; h--)
{
W1302(ucAddr,pClock); / 秒 分 时 日 月 星期 年 /
pClock++;
ucAddr +=2;
}
W1302(ucNumRows_adder,0);
W1302(ucNumRows_p_adder,0);
W1302(DISP_TIME_adder,170);
W1302(0xc0,0x01);
W1302(0XC2,0X03); //初始自动转换显示时间为3秒。
W1302(0x8e,0x80); / 控制命令,WP=1,写保护/
}
}
/读取DS1302中的时间/
void du1302()
{
Sec=R1302(0x81); //对取 秒 分 时 日 月 星期 年
Cent=R1302(0x83);
Hour=R1302(0x85);
Day=R1302(0x87);
Month=R1302(0x89);
Week=R1302(0x8b);
Year=R1302(0x8d);
//b=R1302(0xc1);
//a=R1302(0xc3);
//a=a/1610+a%16;
}
void write_1302Data (uchar ucAddr,uchar Value)
{
W1302(0x8e,0x00); / 控制命令,WP=0,写 *** 作/
W1302(ucAddr,Value); //地址和数据
W1302(0x8e,0x80); / 控制命令,WP=1,写保护/
}
可按键调节的C语言时钟程序 (郭天祥版)
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar count,key1num;
char shi,fen,miao;
uchar code hh[]=" 2010-5-4 Tue";
uchar code yy[]=" 00-00-00";
sbit ledrs=P2^4;
sbit ledrw=P2^5;
sbit leden=P2^6;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^4;
void delay(uchar x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void write_com(uchar com)
{
ledrs=0;
P0=com;
leden=1;
delay(5);
leden=0;
delay(5);
}
void write_date(uchar date)
{
ledrs=1;
P0=date;
leden=1;
delay(5);
leden=0;
delay(5);
}
void init()
{
uchar i;
ledrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
write_com(0x01);
for(i=0;i<15;i++)
{
write_date(hh[i]);
}
write_com(0x80+0x40);
for(i=0;i<12;i++)
{
write_date(yy[i]);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
key4=0;
if(key1==0)
{
delay(5);
if(key1==0)
{
key1num++;
while(key1==0);
if(key1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(key1num==2)
{
write_com(0x80+0x40+7);
}
if(key1num==3)
{
write_com(0x80+0x40+4);
}
if(key1num==4)
{
key1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(key1num!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(key2==0);
if(key1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(key1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(key1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(key3==0);
if(key1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(key1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(key1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
我给你一个保证好用的,KEY_COM调模式,按一下进入调时 ,在按一下调分,再按一下退出调时模式,这时加减按键都无效,在调时模式时会产生闪烁方式,这段程序是我自己想的办法实现的,可能有点笨拙,但效果很好,我建议你用DS1302做时钟,用单片机计数器由于晶振等原因会有很大的误差,实际中没有用直接用单片机做的,希望对你有帮助。
(段选和位选接的都是8位的D触发器,如果你的开发板电路结构有区别,改一下显示部分的程序就行了)
#include<reg51h>
#define uchar unsigned char
sbit duan=P0^0;
sbit wei=P0^1;
sbit KEY_ADD=P3^3;
sbit KEY_DEC=P3^4;
sbit KEY_COM=P3^5;
uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40, 0x00 };
char hour=0,minute=0,second=0,i=0,flag=0;
unsigned char t=0,t1=0,t2=0,t3=0;
unsigned int count=0;
void delays()//10ms延时子程序
{unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void start()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
start();
KEY_ADD=1;
KEY_DEC=1;
KEY_COM=1;
while(1){
if(!KEY_COM)
{
delays();
if(!KEY_COM)
{while(!KEY_COM);
flag++;if(flag==3)flag=0;
}
}
if(!KEY_ADD)
{
delays();
if(!KEY_ADD)
{
while(!KEY_ADD);
if(flag==1)
{hour++;if(hour==24)hour=0;}
if (flag==2)
{minute++;if(minute==60)minute=0;}
}
}
if(!KEY_DEC)
{
delays();
if(!KEY_DEC)
{while(!KEY_DEC);
if(flag==1)
{hour--;if(hour<0)hour=23;}
if(flag==2)
{minute--;if(minute<0)minute=59;}
}
}
}
}
void t0() interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
count++;
switch(i)
{case 0: {if(flag==1){t++;if(t==60)t=0; if(t<30) {P1=a[hour/10];duan=1;duan=0;P1=~0x01;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour/10];duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } break;
case 1: {if(flag==1) {t1++;if(t1==60)t1=0; if(t1<30) {P1=a[hour%10];duan=1;duan=0;P1=~0x02;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour%10];duan=1;duan=0;P1=~0x02;wei=1;wei=0;} } break;
case 2:{P1=0x40;duan=1;duan=0;P1=~0x04;wei=1;wei=0;}break;
case 3: {if(flag==2) {t2++;if(t2==60)t2=0; if(t2<30) {P1=a[minute/10];duan=1;duan=0;P1=~0x08;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute/10];duan=1;duan=0;P1=~0x08;wei=1;wei=0;} } break;
case 4: {if(flag==2) {t3++;if(t3==60)t3=0; if(t3<30) {P1=a[minute%10];duan=1;duan=0;P1=~0x10;wei=1;wei=0;}
else {P1=0x00;duan=1;duan=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute%10];duan=1;duan=0;P1=~0x10;wei=1;wei=0;} } break;
case 5:{P1=0x40;duan=1;duan=0;P1=~0x20;wei=1;wei=0;}break;
case 6:{P1=a[second/10];duan=1;duan=0;P1=~0x40;wei=1;wei=0;}break;
case 7:{P1=a[second%10];duan=1;duan=0;P1=~0x80;wei=1;wei=0;}break;
}
i++;
if(i==8)i=0;
if(count==500)
{count=0;
second++;
if(second==60)
{second=0;
minute++;
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
以上就是关于一部分用C语言编写的C51单片机的时钟程序,求加注释全部的内容,包括:一部分用C语言编写的C51单片机的时钟程序,求加注释、求单片机C语言的电子闹钟设计程序 其功能只要有闹钟,一天24小时的时钟功能就行。、51单片机用c语言编译时钟程序,跪求高手帮忙看下我的程序,共阴LED上显示的是00-00-00等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)