曾经用51的时分,在Proteus里面仿真过许多东西,51的一些基本功用都做过试验,复杂点的东西尽管也有,可是都是随性而来,需求什么用什么,程序显得臃肿难读,功率低下,且没有及时把剖析记录下来
有时刻自己再做一遍闹钟,跟曾经做的感觉不同很大,曾经如同都是COPY,自己改动的很少,并且老觉得程序长,当自己去规划过程时,呈现的问题却不在这个当地,尽管51关于许多人而言,已再了解不过,可是我觉得算法都相同,在很了解的51上验证算法是很有功率的
功用:
1:时钟显现
2:时钟可调
3:可设闹钟
4:闹钟随时可关
思路:
1:时钟用定时器1操控,每隔一秒,秒变量+1,
数码管扫描显现时钟
2:设置2个可调时分按键,按键按下,对应时刻变量+1
3:设置形式键,奇数次按下,改动闹钟时分
偶数次按下,改动时钟时分
不断地查询检测,时钟时分==闹钟时分?,假如等于,则相应闹铃
4:设置关闹铃键,按下时封闭闹铃
在这个当地会呈现一个小问题,闹钟是否敞开需求一向扫描,关闹钟按键也需求一向扫描,
当按键按下,在此时关掉闹钟,可是,在这一分钟之内,闹钟都有敞开的理由,故关了之后,
再次检测闹钟时,闹钟会再次翻开,
改进办法:设置标志量,当关闹钟之后的额外时刻内,不再检测闹钟,额外时刻与闹钟的操控精度有关
程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit beep=P3^1;
sbit led=P3^0;
sbit hour_key=P3^4;//调理小时键
sbit minu_key=P3^5;//调理分钟键
sbit stopsounder_key=P3^3; //关闹钟按键
bit sounder_flag=0;
sbit mode_key=P3^7; //调理时钟仍是闹铃操控按键
uchar mode_number;//形式计数
uchar sec_count;
uint a,b; //形式计数
uchar minu0=1;
uchar hour0,sec0, //闹钟
hour1,minu1,sec1,//时钟
h1,h2,m1,m2,s1,s2,//显现位
k;//状况转化标志
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void mode_check();
void init()
{
a=0;
b=0;
k=0;
hour1=0;
minu1=0;
sec1=0;
hour0=0;
minu0=1;
sec0=0;
TMOD=0x11; //定时器0,1作业于方法1;赋初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%6;
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
EA=1;
EX0=1;
//ET0=0;
ET1=1;
IT0=1; //P3.2引脚下经沿发生外部中止0
//PX0=1;
//TR0=1; //初始,秒表不作业
TR1=1; //时钟一开始作业
}
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
void ex0_int() interrupt 0
{
//效果待增加
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/259721.html