c51语言sysinit头文件,单片机数字钟仿真和源码

#include

//---------------------端口定义-----------------

sbit K1 = P1^0;                 //指定P1.0为K1,在C51中Px.y写为Px^y,因“.”在C语言中是一种运算符

sbit K2 = P1^1;

sbit K3 = P1^2;

sbit K4 = P1^3;

//---------------------变量定义-----------------

unsigned char hou,min,sec,yea,mon,day;

unsigned char disp_buf[6];        //定义显示缓冲单元

bit update_time;                        //时间更新标志,1:当前时间已更新 0:当前时间未更新

unsigned char cnt=0;                //时间累加变量

unsigned int fli=0;                        //闪烁时间累加变量

bit c = 0;                                        //时间  与日期切换标志变量,c=0显示时间,c=1显示日期

bit leap;                                    //判断是否为闰年标志变量

bit f = 0;                                        //判断闪烁与不闪烁切换标志变量

bit s = 1;                                         //停留在某一状态变量

//---------------------函数声明-----------------

void sysinit(void);                        //调用初始化函数

//void time_inc(void);                //调用时间加1函数

void key_proc(void);                //调用按键模块

void disp_proc(void);           //调用显示模块

void delayms(unsigned char x);//延时xms函数

void main(void)

{

sysinit();        //调用初始化函数

while(1)

{

//time_inc();                //调用时间加1函数

key_proc();                //调用按键模块

//showcut();                 //调用切换函数

disp_proc();           //调用显示模块

}

}

void sysinit(void)

{

hou = 12;

min = 0;

sec = 0;

yea = 16;

mon = 10;

day = 1;

TMOD=0X11;                                        //设置定时器0和定时器1为工作方式1

TH0=(65536-50000)/256;           //装初值

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;           //装初值

TL1=(65536-50000)%256;

EA=1;                                           //开总中断

ET0=1;                                           //开定时器0中断

TR0=1;                                           //启动定时器0

ET1=1;                                           //开定时器1中断

TR1=0;                                           //启动定时器1

}

void key_proc(void)

{

static key_ask=0;

if((K1 == 0)&&(c == 0))

{

delayms(10); //去抖动

if(key_ask == 0)

{

hou++;

hou=hou%24;

key_ask =1;

}

}

else if((K2 == 0)&&(c == 0))

{

delayms(10);

if(key_ask == 0)

{

min++;

min = min % 60;

key_ask = 1;

}

}

else if((K1 == 0)&&(c == 1))

{

delayms(10);

if(key_ask == 0)

{

day++;

if((leap ==1)&&(mon == 2)&&(day >29 ))

day = 1;

else if((leap == 0)&&(mon == 2)&&(day > 28))

day=1;

else if(((mon == 1)||(mon == 3)||(mon == 5)||(mon == 7)||(mon == 8)||(mon == 10)||(mon == 12))&&(day > 31))

day = 1;

else if(((mon == 2)||(mon == 4)||(mon == 6)||(mon == 9)||(mon == 11))&&(day > 30))

day = 1;

key_ask = 1;

}

}

else if((K2 == 0)&&(c == 1))

{

delayms(10);

if(key_ask == 0)

{

mon++;

if(mon > 12)

mon = 1;

key_ask = 1;

}

}

else if(K3 == 0)

{

delayms(10);

if(key_ask == 0)

{

c=~c;

key_ask = 1;

}

}

if((K4 == 0)&&(f == 0))

{

delayms(10);

if(key_ask == 0)

{

TR1=1;

f = 1;

key_ask = 1;

}

}

else if((K4 == 0)&&(f == 1))

{

delayms(10);

if(key_ask == 0)

{

TR1 = 0;

f = 0;

key_ask = 1;

s = 1;

}

}

else if(key_ask == 1)

{

if(K1 == 1 && K2 == 1 && K3 ==1)

{

key_ask = 0;

}

}

}

void gengxin(void)

{

}

void disp_proc(void)

{

unsigned char i,j;

unsigned char code dis_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char code bit_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

if((update_time == 1)&&(s == 1))                 //若时值(hou,min,sec)已更新则要更新显缓disp_buf。使显示与时值保持一致

{

if((c == 0))

{

update_time = 0;

disp_buf[0] = hou / 10;        //更新时值

disp_buf[1] = hou % 10;

disp_buf[2] = min / 10;        //更新分值

disp_buf[3] = min % 10;

disp_buf[4] = sec / 10;        //更新秒值

disp_buf[5] = sec % 10;

}

if((c == 1))

{

update_time = 0;

disp_buf[0] = yea / 10;        //年

disp_buf[1] = yea % 10;

disp_buf[2] = mon / 10;        //月

disp_buf[3] = mon % 10;

disp_buf[4] =  day/ 10;        //日

disp_buf[5] =  day% 10;

}

}

for(i = 0; i < 6; i++)

{

P3 = 0xff;        //熄灭显示器(避免数码管出现乱码,不熄

//灭就会下次字型码输出的时候,下个数码

//管没有亮得时候,在之前的数码管上就瞬间亮了)

if((i==1)||(i==3))

{

P2 = dis_tab[disp_buf[i]]+0x80;                 //输现定形码

P3 = bit_tab[i];

for(j = 0; j < 100; j++);

}

else

{

P2 = dis_tab[disp_buf[i]];                 //输现定形码

P3 = bit_tab[i];

for(j = 0; j < 100; j++);

}

}

}

void T0_time()interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

++cnt;

if((yea%4 == 0)&&(yea%100 != 0)||(yea%400 == 0))

leap = 1;                                        //判断为闰年

else

leap = 0;                                        //不是闰年

if(cnt >= 20)

{

update_time = 1;        //置时间更新标志

cnt  = 0;

++sec;

if(sec >= 60)

{

sec = 0;

++min;

if(min >= 60)

{

min = 0;

++hou;

if(hou >= 24)

{

hou = 0;

day++;

if((leap ==1)&&(mon == 2)&&(day >29 ))

{

mon++;

day = 0;

}

else if((leap == 0)&&(mon == 2)&&(day > 28))

{

mon++;

day = 0;

}

else if((mon == 1)||(mon == 3)||(mon == 5)||(mon == 7)||(mon == 8)||(mon == 10)||(mon == 12)&&(day > 31))

{

mon++;

day = 0;

}

else if((mon == 2)||(mon == 4)||(mon == 6)||(mon == 9)||(mon == 11)&&(day > 30))

{

mon++;

day = 0;

}

if(mon > 12)

mon = 1;

}

}

}

}

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值