s1200 s odt计时器器怎么s odt计时器到年

您是不是找:
共找到54条 计时器 产品信息
摘要:石英电子计时器型号:TAJ5QJT5库号:M274024主要用于各种工程机械,农业机械及电子设备的工作时间累计主要技术参数工作电压OperatingVoltageDC12V-24V计时范围Countingrange0----99999h59min计时精度Countin...
摘要: 技术参数REXROTH博世速度计时器R使用BODAS控制器过程中的安全措施如果可靠性检Afterthefiltercartridge,itsimpuritiesare
摘要: HEYCO开口扳手55X60
摘要: AmarellGmbH&Co.KG公司著名精密德国AMARELL计时器仪表制造商,有超过80年的生产品经验在温度计和湿度计领域,
摘要: 德国comat主要产品:comat继电器,comat固态继电器,comat功率继电器,德国comat延时继电器,德国comat时间继电器,德国comat电压继电器,德国comat监控继电器,德国comat接触器,德国comat计时器。
摘要: 品牌GraLab型号Model165,Model170,Model173,Model254,Model300,
摘要: megacon电流变压器有着广泛的选择可能,原装瑞士进口megacon计时器和继电器上海代理主要特点是:现代化,安全设计,多种优化附件,电流从50A到400A,甚至1A/S。等级在0.2S以上。
摘要: Legrand计时器
摘要: Q96-JS特性:环境温度:-25℃to+55℃外壳防护:IP42/52耐振动:0.7gh
摘要: Q48-JS特性:环境温度:-25℃to+55℃外壳防护:IP42/52耐振动:0.7gh
摘要: Q72-JS特性:环境温度:-25℃to+55℃外壳防护:IP42/52耐振动:0.7gh
摘要: BAUSER公司成立于1953年,超过50年的开发和生产电子计数产品的经验,如今,产品在全球50多个国家的工业计算技术领域被应用。产品主要有电池和时间控制器、报警调制解调器等,被广泛用于叉车和其他车辆的控制系统,以及电动驱动车辆。德国BAUSER计时器
摘要: 英国FOXTAM是一家生产质量电子定时器和传感控制继电器的制造商,2004年被NORTONICS公司收购,NORTONICS成立于1983年,是一个制造商,也是先进的独立经销商在电子元件和仪表控制面板和配电板行业。英国FOXTAM计时器
摘要: BAUSER公司成立于1953年,超过50年的开发和生产电子计数产品的经验,如今,产品在全球50多个国家的工业计算技术领域被应用。产品主要有电池和时间控制器、报警调制解调器等,被广泛用于叉车和其他车辆的控制系统,以及电动驱动车辆。BAUSER计时器
摘要: 意大利IMSYSTEM是一家主要从事仪器、流体流量、压力、液位、温度、分析、计量、等自动化领域的检测及电子控制系统,主要产品有自动化,电子,机电和电气系统、电子和自动化流体控制仪器及元器件等。随着公司的发展,可以制造IMSYSTEM计时器定制的液压系统和自动化设备。
摘要: IMO计时器是工业控制和电子元件的供应商,代表了在工业和电子元件领域的主要力量。
摘要: FINDER计时器以生产、研制高端继电器而闻名世界。Finder生产继电器始于1954年,作为专业的生产厂家,与德国SINMENS及日本OMRON并列为世界三大继电器制造商,在欧洲享有极高的盛誉。
摘要: HII压力泵维修包SK7A-8V
摘要: HENGSTLER计时器0891211
摘要:夏罗登工业科技是comat计时器代理商!德国comat主要产品:comat继电器,comat固态继电器,comat功率继电器,德国comat延时继电器,德国comat时间继电器,德国comat电压继电器,德国comat监控继电器,德国comat接触器,德国comat计...
共3页54条记录=96&&event.keyCode=48&&event.keyCode确定
石英电子计时器型号:TAJ5QJT5库号:M274024主要用于各种工程机械,
技术参数REXROTH博世速度计时器R使用BODAS控制器过程中的
HEYCO开口扳手55X60
AmarellGmbH&Co.KG公司著名精密德国AMARELL计时器仪表制造商,有超
德国comat主要产品:comat继电器,comat固态继电器,comat功率继电
品牌GraLab型号Model165,Model170,Model173,Model254,Model300
megacon电流变压器有着广泛的选择可能,原装瑞士进口megacon计时器
Legrand计时器
Q96-JS特性:环境温度:-25℃to+55℃外壳防护:IP42/52耐振动:0.7
Q48-JS特性:环境温度:-25℃to+55℃外壳防护:IP42/52耐振动:0.7
Q72-JS特性:环境温度:-25℃to+55℃外壳防护:IP42/52耐振动:0.7
BAUSER公司成立于1953年,超过50年的开发和生产电子计数产品的经验
英国FOXTAM是一家生产质量电子定时器和传感控制继电器的制造商,20
BAUSER公司成立于1953年,超过50年的开发和生产电子计数产品的经验
意大利IMSYSTEM是一家主要从事仪器、流体流量、压力、液位、温度、
IMO计时器是工业控制和电子元件的供应商,代表了在工业和电子元件
FINDER计时器以生产、研制高端继电器而闻名世界。Finder生产继电器
HII压力泵维修包SK7A-8V
HENGSTLER计时器0891211
夏罗登工业科技是comat计时器代理商!德国comat主要产品:comat继
夏罗登工业科技是Hengstler亨士乐计时器经销商!德国Hengstler主要
夏罗登工业科技是Hengstler亨士乐计时器代理商!德国Hengstler主要
德国Hengstler主要产品:Hengstler亨士乐编码器,Hengstler亨士乐
德国Hengstler主要产品:Hengstler亨士乐编码器,Hengstler亨士乐
西纳计时器之BAUSER计时器BAUSER公司成立于1953年,超过50年的开发第35节:带数码管显示的象棋比赛专用计时器
> 第35节:带数码管显示的象棋比赛专用计时器
第35节:带数码管显示的象棋比赛专用计时器
开场白:2014年春节的时候,一帮朋友举行小规模的象棋比赛,有一些朋友下棋的速度实在是太慢了,为了限制比赛时间,我专门用朱兆祺的51学习板做了一个棋类比赛专用计时器给他们用。这一节要教会大家两个知识点:第一个:按键服务程序操作的精髓在于根据当前系统处于什么窗口状态下就执行什么操作。紧紧围绕着不同的窗口ucWd来执行不同的操作。第二个:继续加深熟悉鸿哥首次提出的&一二级菜单显示理论&:凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用ucWd变量表示。局部就是二级菜单,用ucPart来表示。不同的窗口,会有不同的更新显示变量ucWdXUpdate来对应,表示整屏全部更新显示。不同的局部,也会有不同的更新显示变量ucWdXPartYUpdate来对应,表示局部更新显示。具体内容,请看源代码讲解。(1)硬件平台:基于朱兆祺51单片机学习板。刚上电开机时,红棋加时键对应S1键,红棋减时键对应S2键.。刚上电开机时,黑棋加时键对应S3键,黑棋减时键对应S4键.。比赛中途暂停双方计时的暂停按键对应S6键。刚上电时,复位双方默认20分时间的复位按键对应S7按键。红棋的抢时按键对应S13键,黑棋的抢时按键对应S16按键。(2)实现功能:棋类计时器有点像抢答器,本质上有两个计时器。比赛的时候对弈的两个棋友各用一个不同的按键抢时间,红棋走一步棋后,就按一下自己的抢时按键,这个时候红棋的计时器停止计时,而黑棋的计时器开始计时,黑棋走了一步棋后,按一下自己的计时器,黑棋停止计时,红棋继续计时,依次循环,谁的时间最先用完谁就输,蜂鸣器也会发出长鸣的声音提示时间到。上电开机默认双方各有20分钟的时间,左边显示的是红棋的时间,右边显示的是黑棋的时间。此时可以通过S1,S2.,S3,S4的加减按键来设置各自的最大倒计时时间。此时如果按下复位按键S7,会自动把双方的时间设置为默认的20分钟。设置好最大倒计时的时间后,此时任意一方按下各自的抢时按键(S13或者S16),则自己的计时器停止计时,而对方开始倒计时。此时数码管显示的是对方的时间,而自己的时间屏蔽不显示。在开始倒计时的时候,如果中途有棋友要接听电话或者忙别的事情,需要暂时暂停一下双方的时间,这个时候可以按S6暂停按键来暂停双方的计时,忙完后再次按下暂停按键会继续倒计时。任何一方的时间走完,都会蜂鸣器长鸣提示。(3)源代码讲解如下:#include "REG52.H"#define const_voice_short40 //蜂鸣器短叫的持续时间#define const_voice_long 900 //蜂鸣器长叫的持续时间#define const_key_time10
//按键去抖动延时的时间#define const_1s 422 //产生一秒钟的时间基准void initial_myself(); void initial_peripheral();void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelaylong);void T0_time();//定时中断函数void key_service();void key_scan(); //按键扫描函数 放在定时中断里void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);void display_drive();//放在定时中断里的数码管驱动函数void time_service();//放在定时中断里的时间应用程序void display_service();sbit key_sr1=P0^0; //第一行输入sbit key_sr2=P0^1; //第二行输入sbit key_sr3=P0^2; //第三行输入sbit key_sr4=P0^3; //第四行输入sbit key_dr1=P0^4; //第一列输出sbit key_dr2=P0^5; //第二列输出sbit key_dr3=P0^6; //第三列输出sbit key_dr4=P0^7; //第四列输出sbit beep_dr=P2^7; //蜂鸣器的驱动IO口sbit led_dr=P3^5;//作为中途暂停指示灯 亮的时候表示中途暂停sbit dig_hc595_sh_dr=P2^0; //数码管 的74HC595程序sbit dig_hc595_st_dr=P2^1;sbit dig_hc595_ds_dr=P2^2;sbit hc595_sh_dr=P2^3;
//LED灯的74HC595程序sbit hc595_st_dr=P2^4;sbit hc595_ds_dr=P2^5;unsigned char ucKeyStep=1;//按键扫描步骤变量unsigned char ucKeySec=0; //被触发的按键编号unsigned intuiKeyTimeCnt=0; //按键去抖动延时计数器unsigned char ucKeyLock=0; //按键触发后自锁的变量标志unsigned char ucRowRecord=1; //记录当前扫描到第几列了unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器unsigned char ucDigShow8=0;//第8位数码管要显示的内容unsigned char ucDigShow7=0;//第7位数码管要显示的内容unsigned char ucDigShow6=0;//第6位数码管要显示的内容unsigned char ucDigShow5=0;//第5位数码管要显示的内容unsigned char ucDigShow4=0;//第4位数码管要显示的内容unsigned char ucDigShow3=0;//第3位数码管要显示的内容unsigned char ucDigShow2=0;//第2位数码管要显示的内容unsigned char ucDigShow1=0;//第1位数码管要显示的内容unsigned char ucDigDot3=1;//数码管3的小数点是否显示的标志unsigned char ucDigDot7=1;//数码管7的小数点是否显示的标志unsigned char ucDigShowTemp=0; //临时中间变量unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量unsigned int uiRedTimeCnt=0;
//红棋产生秒基准的时间计时器unsigned int uiBlackTimeCnt=0;//黑棋产生秒基准的时间计时器unsigned int uiRedTotal=1200;
//红棋的总时间unsigned int uiBlackTotal=1200;//黑棋的总时间unsigned char ucRedFlag=0;//红棋是否开始计时的标志unsigned char ucBlackFlag=0;//黑棋是否开始计时的标志unsigned char ucDisplayUpdate=1; //更新显示标志/* 注释一:*ucWd变量是本程序最核心的变量,代表显示哪一个窗口和系统处于当前哪种状态*/unsigned char ucWd=1;code unsigned char dig_table[]={0x3f,//0
序号00x06,//1
序号10x5b,//2
序号20x4f,//3
序号30x66,//4
序号40x6d,//5
序号50x7d,//6
序号60x07,//7
序号70x7f,//8
序号80x6f,//9
序号90x00,//不显示序号10};void main(){ initial_myself(); delay_long(100);
initial_peripheral(); while(1) {
key_service();
display_service(); }}void time_service()//放在定时中断里的时间应用程序{if(ucRedFlag==1)//1代表红棋在运行中{ uiRedTimeCnt++;
if(uiRedTimeCnt>const_1s)
uiRedTimeCnt=0;
if(uiRedTotal>0)
uiRedTotal--;
else//时间到
ucRedFlag=0;
//红棋和黑棋同时停止计时
ucBlackFlag=0;
ucWd=1;//切换到第一个窗口的状态
uiVoiceCnt=const_voice_ //报警声音触发
ucDisplayUpdate=1;//更新显示
}}if(ucBlackFlag==1)//1代表黑棋在运行中{ uiBlackTimeCnt++;
if(uiBlackTimeCnt>const_1s)
uiBlackTimeCnt=0;
if(uiBlackTotal>0)
uiBlackTotal--;
else//时间到
ucRedFlag=0;//红棋和黑棋同时停止计时
ucBlackFlag=0;
ucWd=1;//切换到第一个窗口的状态
uiVoiceCnt=const_voice_ //报警声音触发
ucDisplayUpdate=1;//更新显示
}}}void display_service()//放在定时中断里的显示应用程序{if(ucDisplayUpdate==1)//有数据更新显示{ ucDisplayUpdate=0;
switch(ucWd) //本程序最核心的变量ucWd
case 1://窗口1,代表刚上电或者复位后的状态
//红棋分解出分
ucDigShowTemp=uiRedTotal/60;
ucDigShow8=ucDigShowTemp/10;
ucDigShow7=ucDigShowTemp%10;
//红棋分解出秒
ucDigShowTemp=uiRedTotal%60;
ucDigShow6=ucDigShowTemp/10;
ucDigShow5=ucDigShowTemp%10;
ucDigDot7=1;//数码管7的小数点显示
//黑棋分解出分
ucDigShowTemp=uiBlackTotal/60;
ucDigShow4=ucDigShowTemp/10;
ucDigShow3=ucDigShowTemp%10;
//黑棋分解出秒
ucDigShowTemp=uiBlackTotal%60;
ucDigShow2=ucDigShowTemp/10;
ucDigShow1=ucDigShowTemp%10;
ucDigDot3=1;//数码管3的小数点显示
led_dr=1;//计时器处于停止状态,LED亮
case 2://窗口2,代表黑棋正在运行中的状态
//红棋全部不显示
ucDigShow8=10;
ucDigShow7=10;
ucDigShow6=10;
ucDigShow5=10;
ucDigDot7=0;//数码管7的小数点不显示
//黑棋分解出分
ucDigShowTemp=uiBlackTotal/60;
ucDigShow4=ucDigShowTemp/10;
ucDigShow3=ucDigShowTemp%10;
//黑棋分解出秒
ucDigShowTemp=uiBlackTotal%60;
ucDigShow2=ucDigShowTemp/10;
ucDigShow1=ucDigShowTemp%10;
ucDigDot3=1;//数码管3的小数点显示
led_dr=0;//计时器处于计时状态,LED灭
case 3://窗口3,代表黑棋在中途暂停的状态
//红棋全部不显示
ucDigShow8=10;
ucDigShow7=10;
ucDigShow6=10;
ucDigShow5=10;
ucDigDot7=0;//数码管7的小数点不显示
//黑棋分解出分
ucDigShowTemp=uiBlackTotal/60;
ucDigShow4=ucDigShowTemp/10;
ucDigShow3=ucDigShowTemp%10;
//黑棋分解出秒
ucDigShowTemp=uiBlackTotal%60;
ucDigShow2=ucDigShowTemp/10;
ucDigShow1=ucDigShowTemp%10;
ucDigDot3=1;//数码管3的小数点显示
led_dr=1;//计时器处于暂停状态,LED亮
case 4://窗口4,代表红棋正在运行中的状态
//红棋分解出分
ucDigShowTemp=uiRedTotal/60;
ucDigShow8=ucDigShowTemp/10;
ucDigShow7=ucDigShowTemp%10;
//红棋分解出秒
ucDigShowTemp=uiRedTotal%60;
ucDigShow6=ucDigShowTemp/10;
ucDigShow5=ucDigShowTemp%10;
ucDigDot7=1;//数码管7的小数点显示
//黑棋全部不显示
ucDigShow4=10;
ucDigShow3=10;
ucDigShow2=10;
ucDigShow1=10;
ucDigDot3=0;//数码管3的小数点不显示
led_dr=0;//计时器处于倒计时状态,LED灭
case 5://窗口5,代表红棋在中途暂停的状态
//红棋分解出分
ucDigShowTemp=uiRedTotal/60;
ucDigShow8=ucDigShowTemp/10;
ucDigShow7=ucDigShowTemp%10;
//红棋分解出秒
ucDigShowTemp=uiRedTotal%60;
ucDigShow6=ucDigShowTemp/10;
ucDigShow5=ucDigShowTemp%10;
ucDigDot7=1;//数码管7的小数点显示
//黑棋全部不显示
ucDigShow4=10;
ucDigShow3=10;
ucDigShow2=10;
ucDigShow1=10;
ucDigDot3=0;//数码管3的小数点不显示
led_dr=1;//计时器处于暂停状态,LED亮
}}}void display_drive()//放在定时中断里的数码管驱动函数{ //以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路 switch(ucDisplayDriveStep) {
case 1://显示第1位
ucDigShowTemp=dig_table[ucDigShow1];
dig_hc595_drive(ucDigShowTemp,0xfe);
case 2://显示第2位
ucDigShowTemp=dig_table[ucDigShow2];
dig_hc595_drive(ucDigShowTemp,0xfd);
case 3://显示第3位
ucDigShowTemp=dig_table[ucDigShow3];
if(ucDigDot3==1)
ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
dig_hc595_drive(ucDigShowTemp,0xfb);
case 4://显示第4位
ucDigShowTemp=dig_table[ucDigShow4];
dig_hc595_drive(ucDigShowTemp,0xf7);
case 5://显示第5位
ucDigShowTemp=dig_table[ucDigShow5];
dig_hc595_drive(ucDigShowTemp,0xef);
case 6://显示第6位
ucDigShowTemp=dig_table[ucDigShow6];
dig_hc595_drive(ucDigShowTemp,0xdf);
case 7://显示第7位
ucDigShowTemp=dig_table[ucDigShow7];
if(ucDigDot7==1)
ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
dig_hc595_drive(ucDigShowTemp,0xbf);
case 8://显示第8位
ucDigShowTemp=dig_table[ucDigShow8];
dig_hc595_drive(ucDigShowTemp,0x7f); } ucDisplayDriveStep++; if(ucDisplayDriveStep>8)//扫描完8个数码管后,重新从第一个开始扫描 { ucDisplayDriveStep=1; }}//数码管的74HC595驱动函数void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01){ unsigned char ucTempD dig_hc595_sh_dr=0; dig_hc595_st_dr=0; ucTempData=ucDigStatusTemp16_09;//先送高8位 for(i=0;i<8;i++) {
if(ucTempData>=0x80)dig_hc595_ds_dr=1;
else dig_hc595_ds_dr=0;/* 注释二:*注意,此处的延时delay_short必须尽可能小,否则动态扫描数码管的速度就不够。*/
dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
dig_hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1; } ucTempData=ucDigStatusTemp08_01;//再先送低8位 for(i=0;i<8;i++) {
if(ucTempData>=0x80)dig_hc595_ds_dr=1;
else dig_hc595_ds_dr=0;
dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
dig_hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1; } dig_hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来 delay_short(1); dig_hc595_st_dr=1; delay_short(1); dig_hc595_sh_dr=0;
//拉低,抗干扰就增强 dig_hc595_st_dr=0; dig_hc595_ds_dr=0;}//LED灯的74HC595驱动函数void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01){ unsigned char ucTempD hc595_sh_dr=0; hc595_st_dr=0; ucTempData=ucLedStatusTemp16_09;//先送高8位 for(i=0;i<8;i++) {
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1; } ucTempData=ucLedStatusTemp08_01;//再先送低8位 for(i=0;i<8;i++) {
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1; } hc595_st_dr=0;//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来 delay_short(1); hc595_st_dr=1; delay_short(1); hc595_sh_dr=0;
//拉低,抗干扰就增强 hc595_st_dr=0; hc595_ds_dr=0;}void key_scan()//按键扫描函数 放在定时中断里{switch(ucKeyStep){ case 1: //按键扫描输出第ucRowRecord列低电平
if(ucRowRecord==1)//第一列输出低电平
key_dr1=0;
key_dr2=1;
key_dr3=1;
key_dr4=1;
else if(ucRowRecord==2)//第二列输出低电平
key_dr1=1;
key_dr2=0;
key_dr3=1;
key_dr4=1;
else if(ucRowRecord==3)//第三列输出低电平
key_dr1=1;
key_dr2=1;
key_dr3=0;
key_dr4=1;
else //第四列输出低电平
key_dr1=1;
key_dr2=1;
key_dr3=1;
key_dr4=0;
uiKeyTimeCnt=0;//延时计数器清零
ucKeyStep++; //切换到下一个运行步骤 case 2: //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。
uiKeyTimeCnt++;
if(uiKeyTimeCnt>1)
uiKeyTimeCnt=0;
ucKeyStep++; //切换到下一个运行步骤
if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==1)
ucKeyStep=1;//如果没有按键按下,返回到第一个运行步骤重新开始扫描
ucKeyLock=0;//按键自锁标志清零
uiKeyTimeCnt=0; //按键去抖动延时计数器清零,此行非常巧妙
ucRowRecord++;//输出下一列
if(ucRowRecord>4)
ucRowRecord=1; //依次输出完四列之后,继续从第一列开始输出低电平
else if(ucKeyLock==0)//有按键按下,且是第一次触发
if(key_sr1==0&&key_sr2==1&&key_sr3==1&&key_sr4==1)
uiKeyTimeCnt++;//去抖动延时计数器
if(uiKeyTimeCnt>const_key_time)
uiKeyTimeCnt=0;
ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零
if(ucRowRecord==1)//第一列输出低电平
ucKeySec=1;//触发1号键 对应朱兆祺学习板的S1键
else if(ucRowRecord==2)//第二列输出低电平
ucKeySec=2;//触发2号键 对应朱兆祺学习板的S2键
else if(ucRowRecord==3)//第三列输出低电平
ucKeySec=3;//触发3号键 对应朱兆祺学习板的S3键
else //第四列输出低电平
ucKeySec=4;//触发4号键 对应朱兆祺学习板的S4键
else if(key_sr1==1&&key_sr2==0&&key_sr3==1&&key_sr4==1)
uiKeyTimeCnt++;//去抖动延时计数器
if(uiKeyTimeCnt>const_key_time)
uiKeyTimeCnt=0;
ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零
if(ucRowRecord==1)//第一列输出低电平
ucKeySec=5;//触发5号键 对应朱兆祺学习板的S5键
else if(ucRowRecord==2)//第二列输出低电平
ucKeySec=6;//触发6号键 对应朱兆祺学习板的S6键
else if(ucRowRecord==3)//第三列输出低电平
ucKeySec=7;//触发7号键 对应朱兆祺学习板的S7键
else //第四列输出低电平
ucKeySec=8;//触发8号键 对应朱兆祺学习板的S8键
else if(key_sr1==1&&key_sr2==1&&key_sr3==0&&key_sr4==1)
uiKeyTimeCnt++;//去抖动延时计数器
if(uiKeyTimeCnt>const_key_time)
uiKeyTimeCnt=0;
ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零
if(ucRowRecord==1)//第一列输出低电平
ucKeySec=9;//触发9号键 对应朱兆祺学习板的S9键
else if(ucRowRecord==2)//第二列输出低电平
ucKeySec=10;//触发10号键 对应朱兆祺学习板的S10键
else if(ucRowRecord==3)//第三列输出低电平
ucKeySec=11;//触发11号键 对应朱兆祺学习板的S11键
else //第四列输出低电平
ucKeySec=12;//触发12号键 对应朱兆祺学习板的S12键
else if(key_sr1==1&&key_sr2==1&&key_sr3==1&&key_sr4==0)
uiKeyTimeCnt++;//去抖动延时计数器
if(uiKeyTimeCnt>const_key_time)
uiKeyTimeCnt=0;
ucKeyLock=1;//自锁按键置位,避免一直触发,只有松开按键,此标志位才会被清零
if(ucRowRecord==1)//第一列输出低电平
ucKeySec=13;//触发13号键 对应朱兆祺学习板的S13键
else if(ucRowRecord==2)//第二列输出低电平
ucKeySec=14;//触发14号键 对应朱兆祺学习板的S14键
else if(ucRowRecord==3)//第三列输出低电平
ucKeySec=15;//触发15号键 对应朱兆祺学习板的S15键
else //第四列输出低电平
ucKeySec=16;//触发16号键 对应朱兆祺学习板的S16键
}}}/* 注释三:*按键服务程序操作的精髓在于根据当前系统处于什么窗口下就执行什么操作。*紧紧围绕着不同的窗口ucWd来执行不同的操作。*/void key_service() //第三区 放在定时中断里的按键服务应用程序{switch(ucKeySec) //按键服务状态切换{
case 1:// 1号键 对应朱兆祺学习板的S1键红棋加分 按键
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
uiRedTotal=uiRedTotal+60;//加红棋分的时间,此处60秒代表一分
if(uiRedTotal>5940)
uiRedTotal=5940;
uiRedTotal=uiRedTotal-(uiRedTotal%60);//去秒取整分
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 2://窗口2,代表黑棋正在运行中的状态
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 2:// 2号键 对应朱兆祺学习板的S2键红棋减分 按键
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
if(uiRedTotal>=60)
uiRedTotal=uiRedTotal-60;//减红棋分的时间,此处60秒代表一分
uiRedTotal=uiRedTotal-(uiRedTotal%60);//去秒取整分
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 2://窗口2,代表黑棋正在运行中的状态
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 3:// 3号键 对应朱兆祺学习板的S3键黑棋加分 按键
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
uiBlackTotal=uiBlackTotal+60;//加黑棋分的时间,此处60秒代表一分
if(uiBlackTotal>5940)
uiBlackTotal=5940;
uiBlackTotal=uiBlackTotal-(uiBlackTotal%60);//去秒取整分
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 2://窗口2,代表黑棋正在运行中的状态
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 4:// 4号键 对应朱兆祺学习板的S4键黑棋减分 按键
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
if(uiBlackTotal>=60)
uiBlackTotal=uiBlackTotal-60;//减黑棋分的时间,此处60秒代表一分
uiBlackTotal=uiBlackTotal-(uiBlackTotal%60);//去秒取整分
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 2://窗口2,代表黑棋正在运行中的状态
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 5:// 5号键 对应朱兆祺学习板的S5键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 6:// 6号键 对应朱兆祺学习板的S6键中途暂停和启动按键
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
case 2://窗口2,代表黑棋正在运行中的状态
ucRedFlag=0;
//暂停计时
ucBlackFlag=0;//暂停计时
ucWd=3; //切换到黑棋中途暂停的状态
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 3://窗口3,代表黑棋在中途暂停的状态
ucRedFlag=0; //红棋暂停计时
ucBlackFlag=1; //黑棋继续计时
//切换到黑棋正在运行中的状态
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 4://窗口4,代表红棋正在运行中的状态
ucRedFlag=0;
//暂停计时
ucBlackFlag=0;//暂停计时
//切换到红棋中途暂停的状态
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 5://窗口5,代表红棋在中途暂停的状态
ucRedFlag=1; //红棋继续计时
ucBlackFlag=0; //黑棋暂停计时
//切换到红棋正在运行中的状态
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 7:// 7号键 对应朱兆祺学习板的S7键在第一个窗口下,把计时器的值恢复为开机时的默认值20分钟
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
uiRedTotal=1200;
//红棋的总时间
uiBlackTotal=1200;//黑棋的总时间
ucDisplayUpdate=1;//更新显示
uiVoiceCnt=const_voice_ //按键声音触发,滴一声就停。
case 2://窗口2,代表黑棋正在运行中的状态
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 8:// 8号键 对应朱兆祺学习板的S8键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 9:// 9号键 对应朱兆祺学习板的S9键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 10:// 10号键 对应朱兆祺学习板的S10键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 11:// 11号键 对应朱兆祺学习板的S11键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 12:// 12号键 对应朱兆祺学习板的S12键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 13:// 13号键 对应朱兆祺学习板的S13键红棋按下
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
ucRedFlag=0;
//红棋暂停计时
ucBlackFlag=1;//黑棋继续计时
ucWd=2; //切换到黑棋正在运行中的状态
ucDisplayUpdate=1;//更新显示
case 2://窗口2,代表黑棋正在运行中的状态
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
ucRedFlag=0;
//红棋暂停计时
ucBlackFlag=1;//黑棋继续计时
ucWd=2; //切换到黑棋正在运行中的状态
ucDisplayUpdate=1;//更新显示
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 14:// 14号键 对应朱兆祺学习板的S14键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 15:// 15号键 对应朱兆祺学习板的S15键
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
case 16:// 16号键 对应朱兆祺学习板的S16键
switch(ucWd)//本程序最核心的变量ucWd
case 1://窗口1,代表刚上电,完成或者复位后的状态
ucRedFlag=1;
//红棋继续计时
ucBlackFlag=0;//黑棋暂停计时
ucWd=4; //切换到红棋正在运行中的状态
ucDisplayUpdate=1;//更新显示
case 2://窗口2,代表黑棋正在运行中的状态
ucRedFlag=1;
//红棋继续计时
ucBlackFlag=0;//黑棋暂停计时
ucWd=4; //切换到红棋正在运行中的状态
ucDisplayUpdate=1;//更新显示
case 3://窗口3,代表黑棋在中途暂停的状态
case 4://窗口4,代表红棋正在运行中的状态
case 5://窗口5,代表红棋在中途暂停的状态
ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发 }
}void T0_time() interrupt 1{TF0=0;//清除中断标志TR0=0; //关中断key_scan(); //放在定时中断里的按键扫描函数time_service();//放在定时中断里的时间应用程序if(uiVoiceCnt!=0){ uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。}else{ ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。}display_drive();//放在定时中断里的数码管驱动函数/* 注释四:*注意,此处的重装初始值不能太大,否则动态扫描数码管的速度就不够。我把原来常用的2000改成了500。*/TH0=0 //重装初始值()=65035=0xfe0bTL0=0x0b;TR0=1;//开中断}void delay_short(unsigned int uiDelayShort){ for(i=0;i<uiDelaySi++) { ; //一个分号相当于执行一条空语句 }}void delay_long(unsigned int uiDelayLong){ for(i=0;i<uiDelayLi++) {
for(j=0;j<500;j++)//内嵌循环的空指令数量
{ //一个分号相当于执行一条空语句
} }}void initial_myself()//第一区 初始化单片机{led_dr=1;beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。hc595_drive(0x00,0x00);TMOD=0x01;//设置定时器0为工作方式1TH0=0 //重装初始值()=65035=0xfe0bTL0=0x0b;}void initial_peripheral() //第二区 初始化外围{EA=1; //开总中断ET0=1;
//允许定时中断TR0=1;
//启动定时中断}总结陈词:这节讲了象棋比赛专用计时器的项目程序。为了继续加深读者理解按键和显示是如何有规律关联起来的,下节会继续讲一个相关的小项目程序。欲知详情,请听下回分解-----带数码管显示的加法简易计算器。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一

我要回帖

更多关于 ios 计时器到注销 的文章

 

随机推荐