单片机 cd40944如果有坏会使数码管显示不正常吗

现用电梯的轿内操纵箱的数码管显示会坏吗?_百度知道
现用电梯的轿内操纵箱的数码管显示会坏吗?
我有更好的答案
其他类似问题
为您推荐:
数码管显示的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁基于Proteus与单片机的CD4094级联控制仿真_机械行业_中国百科网
基于Proteus与单片机的CD4094级联控制仿真
    
一、CD4094功能介绍
&&& CD4094是带输出锁存和三态控制的串入/并出高速转换器,具有使用简单、功耗低、驱动能力强和控制灵活等优点。其引脚图如图1所示。
&&& (1)脚为锁存端;
&&& (2)脚为串行数据输入端;
&&& (3)脚为串行时钟端;
&&& (4)-(7)端为并行输出端Q1-Q4;
&&& (11)-(14)端为并行输出端Q5-Q8;
&&& (9)脚QS、(10)脚Q'S是串行数据输出端,用于级联。QS端在第9个串行时钟的上升沿开始输出,Q'S端在第9个串行时输出。
图1 CD4094引脚配置图
&&& CD4094真值表如表1所示,Strobe脚为高电平时,8位并行输出口Q1~Q8在时钟的上升沿随串行输入而变化;Strobe脚为低电平时,输出锁定。利用锁存端可方便地进行片选和级联输出控制。
表1 CD4094真值表
&&& 图2为CD4094的内部逻辑图。
图2 CD4094内部逻辑图
二、Proteus电路图设计
&&& 图3为CD4094的Proteus仿真电路图,用MCS-51的P2.0、P2.1、P2.2与每片CD4094的DATA脚、CLOCK脚、STROBE脚相连,CD4094的Q0-Q7与一个LED数码管相连,U2的QS端级联U3的DATA端,以此类推。
图3 CD4094仿真电路图
三、程序设计
&&& 本文的程序设计非常简单,设计目标是让四个LED数码管由上至下依次显示数字&2&、&0&、&1&、&3&,从而验证CD4094的逻辑功能。C语言程序设计如下:
四、仿真过程、效果及总结
&&& (1)打开Keil2,选择ProjectNew Project命令,在弹出的Create New Project对话框中新建Keil项目CD4094.uv2。
&&& (2)选择CPU为ATMEL中的AT89C51单片机。
&&& (3)编辑好源程序,编辑完成后保存。
&&& (4)在Project Workspace窗口中,将CD4094.c文件加入到Source Group1中。
&&& (5)在Project Workspace窗口中Target1文件夹上单击右键,在弹出的窗口中选择Output选项卡,并选中Create HEX File选项。
&&& (6)在Keil菜单中选择Project Build Target选项,编译汇编程序,并产生HEX文件。
&&& (7)将Keil产生HEX文件加载到Proteus ISIS绘制的硬件电路中。
图4 仿真效果图
&&& 图4为本系统的仿真效果图,仿真开始后,LED数码管由上至下依次显示数字&2&、&0&、&1&、&3&,从而验证了CD4094的逻辑功能与级联控制。CD4094与HC164有相同的功能。在不希望输出端抖动的情况下,用CD4094更适合,因为它有个输出使能端,能灵活控制并行输出的数据。
Copyright by ;All rights reserved.STC15F104E制作15小时定时器(数码管显示版)|我爱单片机 - 数码之家
查看完整版本: [--
&Pages: ( 2 total )
赞助商链接
36楼更新了程序:增加了记忆设置的定时初值时间。上次使用STC15F104E制作的15小时定时器 ,使用的是4个LED按照8421码显示,简单是够简单了,但是对于不熟悉8421码的坛友,认为这种显示方式不够直观。 因此,趁这二天得空,又制作了使用单数码管显示的15小时定时器,满足一些希望采用数码管显示的坛友的需要。 不过因只用一个数码管显示,所以对于10 ~ 15小时的显示,是按照16进制显示为A ~ F。可能又有人不熟悉了。 好在1 ~ 9显示还是阿拉伯数字的。定时不超过9小时的,不会遇到16进制的问题。 单片机依然采用STC15F104E,因IO比较少,故采用74HC595驱动数码管的显示,因只有一个数码管,595只需要三个IO线即可。 这次因显示上IO引脚比上次少用一个,所以接了一个蜂鸣器,在定时时间到的时候,不止继电器动作,蜂鸣器也会鸣叫一下。 具体说明请参见程序。 电原理图:[attachment=3575931] 实物图,晚上做的,拍照效果不好。这张是开闪光灯的:[attachment=3575964] 这张是没开闪光灯的:[attachment=3575958] 附件中是原理图、实物图、源程序(含工程文件)、HEX文件。 [attachment=3575892] 源程序: //使用STC15F104E制作的计时器(数码管显示版)//1. 上电为关闭状态。//2. 按一下按键可以递增计时时间,1、2、3...一直可以累加到15小时,再按则关闭(计时时间为0,数码管不显示)。//3. 使用一位数码管显示计时时间。最多15小时。按16进制显示1 ~ F。//4. 计时期间继电器吸合,计时结束后继电器释放,并且蜂鸣器鸣叫一声。//5. 计时期间数码管右下角的点每秒闪一次。//6. 数码管根据剩余时间递减显示。//7. 在计时过程中如果按键,在当前剩余时间上累加,而不是在计时初值上累加。//&& (针对这个问题:比方说初定时5小时,等到剩2小时的时候又想加1个小时,可是一按就变成6小时而不是3小时。)//8. 因STC15F104E上电后P3.3是低电平,故P3.3接按键,以避免副作用。//9. 可以断电记忆未完成的时间,来电接着继续计时。 //使用内部振荡11.0592M#include &STC15F104E.h&#include &intrins.h&typedef unsigned char&&UINT8;typedef unsigned int&& UINT16;sbit relay= P3^5;sbit beep = P3^4;sbit key1 = P3^3; //因STC15F104E加电P3.3为低电平,为避免副作用,作为按键输入。sbit HC595_SH = P3^2;sbit HC595_ST = P3^1;sbit HC595_DS = P3^0;UINT8 sec, min, hour,UINT8 bCbit light, save, bOldLight, bF#define MAX_HOURS&& 15UINT8 Seg8Code[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF };//将显示数据串行发送到595void OutputTo_Hc595(UINT8 Data){&&&&UINT8&&&&//移位数据 for(i=0; i&8; i++) {&&&& HC595_SH = 0;&&&&&&&&HC595_DS = Data & 0x80;&&_nop_();&&_nop_();&&HC595_SH = 1;&&Data &&= 1; }&&&&//锁存数据&&&&HC595_ST = 0;&&&&_nop_();&&_nop_();&&&&HC595_ST = 1;}//***************************************************************************//定义Flash操作等待时间及允许IAP/ISP/EEPROM 操作的常数#define ENABLE_ISP 0x83 //系统工作时钟&12MHz 时,对IAP_CONTR 寄存器设置此值//***************************************************************************void IAP_Disable(){&&&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&IAP_CONTR = 0;&&//关闭IAP 功能&&&&IAP_CMD&& = 0;&&//清命令寄存器,使命令寄存器无命令,此句可不用&&&&IAP_TRIG&&= 0;&&//清命令触发寄存器,使命令触发寄存器无触发,此句可不用&&&&IAP_ADDRH = 0;&&&&IAP_ADDRL = 0;}//***************************************************************************//eeprom读一字节//入口: addr = 要读取字节的地址//返回: 读出的字节//***************************************************************************UINT8 Byte_Read(UINT16 addr){&&&&IAP_DATA = 0x00;&&&&IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x01;&&&&&&&& //IAP/ISP/EEPROM 字节读命令&&&&IAP_ADDRH = addr && 8;&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL =&&&&&& //设置目标单元地址的低8 位地址 &&&&IAP_TRIG = 0x5A;&& //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&return (IAP_DATA);&&//返回读到的数据}//***************************************************************************//eeprom写一字节//入口: addr = 要写字节的地址//&&&&&&ch = 要写入的字节数据//***************************************************************************void Byte_Write(UINT16 addr, UINT8 ch){&&&&IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x02;&&&&&&&& //IAP/ISP/EEPROM 字节编程命令 &&&&IAP_ADDRH = addr && 8;&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL =&&&&&& //设置目标单元地址的低8 位地址 &&&&IAP_DATA =&&&&&&&&//要编程的数据先送进IAP_DATA 寄存器&&&&IAP_TRIG = 0x5A;&& //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//***************************************************************************//eeprom扇区擦除//入口: sect_addr = 扇区地址//***************************************************************************void Sector_Erase(UINT16 sect_addr){&&&&IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x03;&&&&&&&& //IAP/ISP/EEPROM 扇区擦除命令 &&&&IAP_ADDRH = (sect_addr & 0xFE00) && 8; //设置目标单元地址的高8 位地址&&&&IAP_ADDRL = sect_&&&&&&&&&&&&&&&& //设置目标单元地址的低8 位地址&&&&IAP_TRIG = 0x5A;&& //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h 后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//***************************************************************************void BeginRun(){&&&&relay = 0;&&&&TR0 = 1;&&&&sec = min = hour = 0;}//***************************************************************************void StopRun(){&&&&relay = 1;&&&&TR0 = 0;&&&&sec = min = hour = 0;&&&&count = 0;}//***************************************************************************void Init()&&//50毫秒@11.0592MHz{&&&&AUXR &= 0x7F; //定时器时钟12T模式&&&&TMOD &= 0xF0; //设置定时器模式&&&&TL0 = 0x00;&&//设置定时初值&&&&TH0 = 0x4C;&&//设置定时初值&&&&TF0 = 0;&&//清除TF0标志&&&&TR0 = 0;&&//定时器0停止计时&&&&//&&&&ET0 = 1;&&&&EA = 1;&&&&//}//***************************************************************************//定时器0中断//***************************************************************************void Timer0() interrupt 1{&&&&static UINT8 tim0, tim1, tim2;&&&&if(++tim0 &= 10)&&&&//500ms&&&&{&&&&&&&&tim0 = 0;&&&&&&&&light = !&&&&&&&&if(++tim1 &= 2) //1s&&&&&&&&{&&&&&&&&&&&&tim1 = 0;&&&&&&&&&&&&if(++sec &= 60) //1m&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if(++tim2 &= 10)&&&&//10m&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&tim2 = 0;&&&&&&&&&&&&&&&&&&&&save = 1;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&sec = 0;&&&&&&&&&&&&&&&&if(++min &= 60) //1h&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&min = 0;&&&&&&&&&&&&&&&&&&&&//使用count递减来倒计时&&&&&&&&&&&&&&&&&&&&++&&&&&&&&&&&&&&&&&&&&--&&&&&&&&&&&&&&&&&&&&if(count == 0)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&& bFinished = 1;&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}} //***************************************************************************void Delay1ms(UINT16 ms)&&//@11.0592MHz{ UINT8 i,&&&&for(; ms&0; ms--)&&&&{&&&& i = 11;&&&& j = 190;&&&& do&&&& {&&&&&&while(--j);&&&&&&&&} while(--i);&&&&}} //***************************************************************************void ReadKey(){&&&&if(key1)&&&&&&Delay1ms(150); //去抖动&&&&if(key1)&&&&&&while(!key1);&&&&count++;&&&&if(count & MAX_HOURS)&&count=0;&&&&if(count == 0)&&&&{&&&&&&&&StopRun();&&&&}&&&&else&&&&{&&&&&&&&BeginRun();&&&&}}//***************************************************************************void main(){&&&&P3 = 0xFF;&&//初始化端口状态&&&&light = 0;&&&&save = 0;&&&&bFinished = 0;&&&&bOldLight = ~&&&&//&&&&Init();&&&&//&&&&sec = Byte_Read(0);&&&&min = Byte_Read(1);&&&&hour = Byte_Read(2);&&&&count = Byte_Read(3); &&&&if(count == 0 || count & MAX_HOURS)&&&&{&&&&&&&&count = 0;&&&&&&&&TR0 = 0;&&&&}&&&&else&&&&{&&&&&&&&relay = 0;&&&&&&&&TR0 = 1;&&&&}&&&&while(1)&&&&{&&&&&&&&ReadKey();&&//读取按键&&&&&&&&if(save & TR0)&&//保存到eeprom中&&&&&&&&{&&&&&&&&&&&&save = 0;&&&&&&&&&&&&Sector_Erase(0);&&&&&&&&&&&&Byte_Write(0, sec);&&&&&&&&&&&&Byte_Write(1, min);&&&&&&&&&&&&Byte_Write(2, hour);&&&&&&&&&&&&Byte_Write(3, count);&&&&&&&&}&&&&&&&&if(count == 0)&&//运行检查&&&&&&&&{&&&&&&&&&&&&StopRun();&&&&&&&&&&&&OutputTo_Hc595(Seg8Code[16]); //关闭数码管显示&&&&&&&&}&&&&&&&&else if(bOldLight != light)&&&&&&&&{&&&&&&&&&&&&bOldLight =&&&&&&&&&&&&if(light) //点闪烁&&&&&&&&&& {&&&&&&&&&&&&&&&& bChar = Seg8Code[count] & 0x7F;&&&&&&&&&& }&&&&&&&&&&else&&&&&&&&&&{&&&&&&&&&&&&&&bChar = Seg8Code[count] | 0x80;&&&&&&&& }&&&&&&&&OutputTo_Hc595(bChar);&&&& }&&&&if(bFinished)&&&&{&&&&&&&& bFinished = 0;&&&&&&&& StopRun();&&&&&&&& Sector_Erase(0); //计时结束后清除保存的信息,以防下次加电继续计时。&&&&&&&& //鸣叫一下&&&&&&&& beep = 0;&&&&&&&& Delay1ms(1000);&&&&&&&& beep = 1;&&&&&&}&& }}
赞助商链接
用数码管就不如换用多脚的单片机了,
赞助商链接
很不错,谢谢分享!
不错,不错,这应该是比较小的了!!!!
呵呵,学习了
个人觉得还是8421码的简单方便得多
支持!不过还是使用IO多些的单片机方便,DIY起来更简单也不贵! (83)
優秀文章&&&& 很不错,值得学习
写得很规范,就是有点长了,没有看下去的恒心。
看看,做的不错哦!
不错,不错,我明天抄一下看一下. 暂时手里面没有595,
烧的几兆的频率?
我也以为用8421更好一些
这样就很直观了,如果加上计时结束后,过一定时间在已通10秒断10秒 。我的烂尾楼就可结贴了。
又看到这个,我觉得楼主用个多脚位的数单片机,4位数码管,也用上时间, 可以自己设置时间,开和关,这就牛X多了.
用上595,不如直接用20脚的单片机了
:这样就很直观了,如果加上计时结束后,过一定时间在已通10秒断10秒 。我的烂尾楼就可结贴了。&( 00:21)&具体说明一下?
不用20脚,14或者16脚的就够用了。
设想在选定的时间到后(即倒计时结束)IO口延时10分钟后每间隔3秒通5秒时间内容来自[短消息]
:设想在选定的时间到后(即倒计时结束)IO口延时10分钟后每间隔3秒通5秒时间内容来自[短消息]
( 13:10) 根据你的需求,修改程序如下。具体参见程序中说明。//应&维超&坛友需求:控制小炖锅,在选定的时间到后(即倒计时结束)IO口延时10分钟后每间隔3秒通5秒时间。//修改时间,只需要修改程序中的宏定义即可。////使用STC15F104E制作的计时器(数码管显示版)//1. 上电为关闭状态。//2. 按一下按键可以递增计时时间,1、2、3...一直可以累加到15小时,再按则关闭(计时时间为0,数码管不显示)。//3. 使用一位数码管显示计时时间。最多15小时。按16进制显示1 ~ F。//4. 计时期间继电器吸合,计时结束后继电器释放,并且蜂鸣器鸣叫一声。//5. 计时期间数码管右下角的点每秒闪一次。//6. 数码管根据剩余时间递减显示。//7. 在计时过程中如果按键,在当前剩余时间上累加,而不是在计时初值上累加。//&& (针对这个问题:比方说初定时5小时,等到剩2小时的时候又想加1个小时,可是一按就变成6小时而不是3小时。)//8. 因STC15F104E上电后P3.3是低电平,故P3.3接按键,以避免副作用。//9. 可以断电记忆未完成的时间,来电接着继续计时。//使用内部振荡11.0592M#include &STC15F104E.h&#include &intrins.h&#define _STC_typedef unsigned char&&UINT8;typedef unsigned int&& UINT16;sbit relay= P3^5;sbit beep = P3^4;sbit key1 = P3^3;&&&&//因STC15F104E加电P3.3为低电平,为避免副作用,作为按键输入。sbit HC595_SH = P3^2;sbit HC595_ST = P3^1;sbit HC595_DS = P3^0;UINT8 sec, min, hour,UINT8 bCUINT8 bWaitM //小时倒计时结束后,等待的分钟数UINT16 nS&&&&//最多65536秒,18.2小时bit light, save, bOldLight, bF#define MAX_HOURS&& 15&&&&//倒计时小时#define WAIT_MINS&&&&10&&&&//倒计时结束后等待分钟#define OFF_SECS&&&&3&&&&//等待分钟结束后,关闭的秒数#define ON_SECS&&&&&&&&5&&&&//打开的秒数UINT8 Seg8Code[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF };//将显示数据串行发送到595void OutputTo_Hc595(UINT8 Data){&&&&UINT8&&&&//移位数据&&&&for(i=0; i&8; i++)&&&&{&&&&&&&&HC595_SH = 0;&&&&&&&&HC595_DS = Data & 0x80;&&&&&&&&_nop_();&&_nop_();&&&&&&&&HC595_SH = 1;&&&&&&&&Data &&= 1;&&&&}&&&&//锁存数据&&&&HC595_ST = 0;&&&&_nop_();&&_nop_();&&&&HC595_ST = 1;}//***************************************************************************//定义Flash操作等待时间及允许IAP/ISP/EEPROM 操作的常数#define ENABLE_ISP 0x83 //系统工作时钟&12MHz 时,对IAP_CONTR 寄存器设置此值//***************************************************************************void IAP_Disable(){&&&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&IAP_CONTR = 0;&&//关闭IAP 功能&&&&IAP_CMD&& = 0;&&//清命令寄存器,使命令寄存器无命令,此句可不用&&&&IAP_TRIG&&= 0;&&//清命令触发寄存器,使命令触发寄存器无触发,此句可不用&&&&IAP_ADDRH = 0;&&&&IAP_ADDRL = 0;}//***************************************************************************//eeprom读一字节//入口: addr = 要读取字节的地址//返回: 读出的字节//***************************************************************************UINT8 Byte_Read(UINT16 addr){&&&&IAP_DATA = 0x00;&&&&IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x01;&&&&&&&& //IAP/ISP/EEPROM 字节读命令&&&&IAP_ADDRH = addr && 8;&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL =&&&&&& //设置目标单元地址的低8 位地址&&&&&&&&IAP_TRIG = 0x5A;&& //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&return (IAP_DATA);&&//返回读到的数据}//***************************************************************************//eeprom写一字节//入口: addr = 要写字节的地址//&&&&&&ch = 要写入的字节数据//***************************************************************************void Byte_Write(UINT16 addr, UINT8 ch){&&&&IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x02;&&&&&&&& //IAP/ISP/EEPROM 字节编程命令&&&&&&&&IAP_ADDRH = addr && 8;&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL =&&&&&& //设置目标单元地址的低8 位地址&&&&&&&&IAP_DATA =&&&&&&&&//要编程的数据先送进IAP_DATA 寄存器&&&&IAP_TRIG = 0x5A;&& //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//***************************************************************************//eeprom扇区擦除//入口: sect_addr = 扇区地址//***************************************************************************void Sector_Erase(UINT16 sect_addr){&&&&IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x03;&&&&&&&& //IAP/ISP/EEPROM 扇区擦除命令&&&&&&&&IAP_ADDRH = (sect_addr & 0xFE00) && 8; //设置目标单元地址的高8 位地址&&&&IAP_ADDRL = sect_&&&&&&&&&&&&&&&& //设置目标单元地址的低8 位地址&&&&IAP_TRIG = 0x5A;&& //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h 后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//***************************************************************************void BeginRun(){&&&&relay = 0;&&&&TR0 = 1;&&&&sec = min = hour = 0;&&&&bFinished = 0;&&&&bWaitMins = 0;}//***************************************************************************void StopRun(){&&&&relay = 1;&&&&//TR0 = 0;&&&&sec = min = hour = 0;&&&&count = 0;}//***************************************************************************void Init()&&&&&&&&//50毫秒@11.0592MHz{#ifndef _STC_&&&&TMOD=0x01; //16位定时模式&&&&TH0=() && 8;&&&&TL0=() & 255;#else&&&&AUXR &= 0x7F;&&&&//定时器时钟12T模式&&&&TMOD &= 0xF0;&&&&//设置定时器模式&&&&TL0 = 0x00;&&&&&&&&//设置定时初值&&&&TH0 = 0x4C;&&&&&&&&//设置定时初值#endif&&&&TF0 = 0;&&&&&&&&//清除TF0标志&&&&TR0 = 0;&&&&&&&&//定时器0停止计时&&&&//&&&&ET0 = 1;&&&&EA = 1;&&&&//}//***************************************************************************//定时器0中断//***************************************************************************void Timer0() interrupt 1{&&&&static UINT8 tim0, tim1, tim2;&&&&if(++tim0 &= 10)&&&&//500ms&&&&{&&&&&&&&tim0 = 0;&&&&&&&&light = !&&&&&&&&if(++tim1 &= 2) //1s&&&&&&&&{&&&&&&&&&&&&if(bWaitMins &= WAIT_MINS)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&++nS&&&&&&&&&&&&}&&&&&&&&&&&&tim1 = 0;&&&&&&&&&&&&if(++sec &= 60) //1m&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if(bFinished && bWaitMins&WAIT_MINS)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&++bWaitM&&&&//小时倒计时结束,进行10分钟计时&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&if(++tim2 &= 10)&&&&//10m&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&tim2 = 0;&&&&&&&&&&&&&&&&&&&&save = 1;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&sec = 0;&&&&&&&&&&&&&&&&if(++min &= 60) //1h&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&min = 0;&&&&&&&&&&&&&&&&&&&&//使用count递减来倒计时&&&&&&&&&&&&&&&&&&&&++&&&&&&&&&&&&&&&&&&&&if(count != 0)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&--&&&&&&&&&&&&&&&&&&&&&&&&if(count == 0)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&bFinished = 1;&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}#ifndef _STC_&&&&//重装定时器&&&&TH0=() && 8;&&&& &&&&TL0=() & 255;#endif}//***************************************************************************#ifndef _STC_void Delay1ms(UINT16 ms){&&&&UINT16&&&&for(; ms&0; ms--)&&&&{&&&&&&&&for(i=0; i&120; i++);&&&&}}#elsevoid Delay1ms(UINT16 ms)&&&&&&&&//@11.0592MHz{&&&&UINT8 i,&&&&for(; ms&0; ms--)&&&&{&&&&&&&&i = 11;&&&&&&&&j = 190;&&&&&&&&do&&&&&&&&{&&&&&&&&&&&&while(--j);&&&&&&&&} while(--i);&&&&}}#endif//***************************************************************************void ReadKey(){&&&&if(key1)&&&&&&Delay1ms(150); //去抖动&&&&if(key1)&&&&&&while(!key1);&&&&count++;&&&&if(count & MAX_HOURS)&&count=0;&&&&if(count == 0)&&&&{&&&&&&&&StopRun();&&&&}&&&&else&&&&{&&&&&&&&BeginRun();&&&&}}//***************************************************************************void main(){&&&&P3 = 0xFF;&&//初始化端口状态&&&&light = 0;&&&&save = 0;&&&&bFinished = 0;&&&&bOldLight = ~&&&&bWaitMins = 0;&&&&nSecs = 0;&&&&//&&&&Init();&&&&//&&&&sec = Byte_Read(0);&&&&min = Byte_Read(1);&&&&hour = Byte_Read(2);&&&&count = Byte_Read(3);&&&&&&&&if(count == 0 || count & MAX_HOURS)&&&&{&&&&&&&&count = 0;&&&&&&&&TR0 = 0;&&&&}&&&&else&&&&{&&&&&&&&relay = 0;&&&&&&&&TR0 = 1;&&&&}&&&&while(1)&&&&{&&&&&&&&if(bFinished)&&&&&&&&{&&&&&&&&&&&&//开始10分钟计时&&&&&&&&&&&&if(bWaitMins & WAIT_MINS)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&bChar = Seg8Code[bWaitMins];&&&&&&&&&&&&}&&&&&&&&&&&&else&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//10分钟计时结束&&&&&&&&&&&&&&&&if((nSecs%(OFF_SECS+ON_SECS)) == 0)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&relay = 1;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&else if((nSecs%(OFF_SECS+ON_SECS)) &= OFF_SECS)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&relay = 0;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&bChar = Seg8Code[(nSecs%(OFF_SECS+ON_SECS))];&&&&&&&&&&&&}&&&&&&&&&&&&//显示&&&&&&&&&&&&if(bOldLight != light)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&bOldLight =&&&&&&&&&&&&&&&&bChar = light ? (bChar&0x7F) : (bChar|0x80);&&&&//点闪烁&&&&&&&&&&&&&&&&OutputTo_Hc595(bChar);&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&else&&&&&&&&{&&&&&&&&&&&&ReadKey();&&//读取按键&&&&&&&&&&&&if(save & TR0)&&//保存到eeprom中&&&&&&&&&&&&{&&&&&&&&&&&&&&&&save = 0;&&&&&&&&&&&&&&&&Sector_Erase(0);&&&&&&&&&&&&&&&&Byte_Write(0, sec);&&&&&&&&&&&&&&&&Byte_Write(1, min);&&&&&&&&&&&&&&&&Byte_Write(2, hour);&&&&&&&&&&&&&&&&Byte_Write(3, count);&&&&&&&&&&&&}&&&&&&&&&&&&if(count == 0)&&//运行检查&&&&&&&&&&&&{&&&&&&&&&&&&&&&&StopRun();&&&&&&&&&&&&&&&&OutputTo_Hc595(Seg8Code[16]);&&&&//关闭数码管显示&&&&&&&&&&&&}&&&&&&&&&&&&else if(bOldLight != light)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&bOldLight =&&&&&&&&&&&&&&&&bChar = Seg8Code[count];&&&&&&&&&&&&&&&&bChar = light ? (bChar&0x7F) : (bChar|0x80);&&&&//点闪烁&&&&&&&&&&&&&&&&OutputTo_Hc595(bChar);&&&&&&&&&&&&}&&&&&&&&&&&&if(bFinished)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//bFinished = 0;&&&&&&&&&&&&&&&&StopRun();&&&&&&&&&&&&&&&&Sector_Erase(0);&&&&//计时结束后清除保存的信息,以防下次加电继续计时。&&&&&&&&&&&&&&&&//鸣叫一下&&&&&&&&&&&&&&&&beep = 0;&&&&&&&&&&&&&&&&Delay1ms(500);&&&&&&&&&&&&&&&&beep = 1;&&&&&&&&&&&&}&&&&&&&&}&&&&}}
谢谢J兄的热心帮助,我抽空实际试试看。
真的不错, 有时间做来玩玩, 谢谢分享.
这款也想做一个。可惜手里没有595。不知道cd4094能不能适合这个程序呢。
:这款也想做一个。可惜手里没有595。不知道cd4094能不能适合这个程序呢。 ( 22:27) 没用过CD4094。刚查了一下,功能上和595是一样的,只是引脚不同。本程序应该适用。
不错啊,学习下,要是两位显示就好了。
数码显示看起来直观明了,要顶
9. 可以断电记忆未完成的时间,来电接着继续计时。&&倒计时中,突然停电,下次上电接着?
:9. 可以断电记忆未完成的时间,来电接着继续计时。&&倒计时中,突然停电,下次上电接着?&( 15:22)&是的。比如定时12小时,倒计时到5小时时断电了,那来电后,会继续按5小时接着倒计时。该定时器每10分钟记忆一次倒计时剩余的时间,记忆存储在单片机的EEPROM中。
但EEPR0M的寿命只有十万次,十分钟写一次,十个小时60次,也可以用几年了,也差不多了!!
最好能记忆上次的设定时间,不用每次都设定。
:最好能记忆上次的设定时间,不用每次都设定。&( 01:39)&好建议!后面改进一下。可记忆二个时间:定时时间初值,倒计时剩余的时间。
我认为对于1位的插座,楼主的15F104并用8421表示正合适。若要用数码管,可以拓展一下,搞一个项目:结合市售公牛十孔的插座板,拆除一边,用亚克力板封上,安上数码管,叧一边是五组倒计时插座,简单想了三个方案:一、用11F04E+595+10位数码管,每组插座对应两个数码管,每组数码管十位的1用个位小数点位控制(亮度或稍有影响),每组数码管的位选端分别与一按键复用,用来在调整时间时,快速选择该组。20脚的11F04E共16个IO口,595用3个,5组数码管用5个,5个继电器用5个,还余3个,1个加,1个减,1个接蜂鸣器。方案二:用11F04E+595+2位数码管,两个数码管被5组共用,每组分配一个指示灯用以区别,并复用为快速使能按键,用来在调整时间时,快速选择该组,此时数码管显示该组时间。此时16个IO,595用3个,2位数码管用2个,5个继电器用5个,5位组别指示用5个,还余1个,用作加,个位的小数点永远用不到,用来接蜂鸣器(会有颤音,更好听,呵呵)。此种方案可以扩展时间到99小时。方案三:11F04E+20个LED,每组时间依旧用4个LED表示,5组共需9个IO,5组继电器需5个,还余2个,1个用来加,1个蜂鸣器,每组LED的位选依旧复用为快速使能按键。
个人认为,搞这么多组意义不大,必竞同时用的机会很少吧,最多两组足己。
确实,插线板正好有五组嘛,其实我觉得一组就基本够用了,这不是在折腾嘛
楼主加油,等你改进程序
:楼主加油,等你改进程序&( 16:38)&你好,最近要放假了,事情比较多,耽搁了。程序改了一下,增加了记忆设置的定时初值时间。下次加电后定时初值自动设置为该时间。(如果是断电续记的,则加电后设置为断电续记时间)//使用STC15F104E制作的计时器(数码管显示版Rev.1)//根据坛友建议,增加记忆设置的定时初值时间。//1. 上电为关闭状态。//2. 按一下按键可以递增计时时间,1、2、3...一直可以累加到15小时,再按则关闭(计时时间为0,数码管不显示)。//3. 使用一位数码管显示计时时间。最多15小时。按16进制显示1 ~ F。//4. 计时期间继电器吸合,计时结束后继电器释放,并且蜂鸣器鸣叫一声。//5. 计时期间数码管右下角的点每秒闪一次。//6. 数码管根据剩余时间递减显示。//7. 在计时过程中如果按键,在当前剩余时间上累加,而不是在计时初值上累加。//&& (针对这个问题:比方说初定时5小时,等到剩2小时的时候又想加1个小时,可是一按就变成6小时而不是3小时。)//8. 因STC15F104E上电后P3.3是低电平,故P3.3接按键,以避免副作用。//9. 可以断电记忆未完成的时间,来电接着继续计时。//10.记忆上次设置的定时初值时间。下次加电后定时初值自动设置为该时间。(如果是断电续记的,则加电后设置为断电续记时间)//使用内部振荡11.0592M#include &STC15F104E.h&#include &intrins.h&typedef unsigned char&&UINT8;typedef unsigned int&& UINT16;sbit relay= P3^5;sbit beep = P3^4;sbit key1 = P3^3;&& //因STC15F104E加电P3.3为低电平,为避免副作用,作为按键输入。sbit HC595_SH = P3^2;sbit HC595_ST = P3^1;sbit HC595_DS = P3^0;UINT8 sec, min, hour, count, OrgCUINT8 bCbit light, save, bOldLight, bF#define MAX_HOURS&& 15UINT8 Seg8Code[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF };//将显示数据串行发送到595void OutputTo_Hc595(UINT8 Data){&&&&UINT8&&&&//移位数据&&&&for(i=0; i&8; i++)&&&&{&&&&&&&&HC595_SH = 0;&&&&&&&&HC595_DS = Data & 0x80;&&&&&&&&_nop_();&&_nop_();&&&&&&&&HC595_SH = 1;&&&&&&&&Data &&= 1;&&&&}&&&&//锁存数据&&&&HC595_ST = 0;&&&&_nop_();&&_nop_();&&&&HC595_ST = 1;}//***************************************************************************//定义Flash操作等待时间及允许IAP/ISP/EEPROM 操作的常数#define ENABLE_ISP 0x83 //系统工作时钟&12MHz 时,对IAP_CONTR 寄存器设置此值//***************************************************************************void IAP_Disable(){&&&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&IAP_CONTR = 0;&&//关闭IAP 功能&&&&IAP_CMD&& = 0;&&//清命令寄存器,使命令寄存器无命令,此句可不用&&&&IAP_TRIG&&= 0;&&//清命令触发寄存器,使命令触发寄存器无触发,此句可不用&&&&IAP_ADDRH = 0;&&&&IAP_ADDRL = 0;}//***************************************************************************//eeprom读一字节//入口: addr = 要读取字节的地址//返回: 读出的字节//***************************************************************************UINT8 Byte_Read(UINT16 addr){&&&&IAP_DATA = 0x00;&&&&IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x01;&&&&&&&& //IAP/ISP/EEPROM 字节读命令&&&&IAP_ADDRH = addr && 8;&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL =&&&&&& //设置目标单元地址的低8 位地址&&&&&&&&IAP_TRIG = 0x5A;&& //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关&&&&return (IAP_DATA);&&//返回读到的数据}//***************************************************************************//eeprom写一字节//入口: addr = 要写字节的地址//&&&&&&ch = 要写入的字节数据//***************************************************************************void Byte_Write(UINT16 addr, UINT8 ch){&&&&IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x02;&&&&&&&& //IAP/ISP/EEPROM 字节编程命令&&&&&&&&IAP_ADDRH = addr && 8;&&//设置目标单元地址的高8 位地址&&&&IAP_ADDRL =&&&&&& //设置目标单元地址的低8 位地址&&&&&&&&IAP_DATA =&&&&&&&&//要编程的数据先送进IAP_DATA 寄存器&&&&IAP_TRIG = 0x5A;&& //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//***************************************************************************//eeprom扇区擦除//入口: sect_addr = 扇区地址//***************************************************************************void Sector_Erase(UINT16 sect_addr){&&&&IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间&&&&IAP_CMD = 0x03;&&&&&&&& //IAP/ISP/EEPROM 扇区擦除命令&&&&&&&&IAP_ADDRH = (sect_addr & 0xFE00) && 8; //设置目标单元地址的高8 位地址&&&&IAP_ADDRL = sect_&&&&&&&&&&&&&&&& //设置目标单元地址的低8 位地址&&&&IAP_TRIG = 0x5A;&& //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此&&&&IAP_TRIG = 0xA5;&& //送完A5h 后,ISP/IAP 命令立即被触发起动&&&&_nop_();&&&&_nop_();&&&&_nop_();&&&&//IAP_Disable();&&//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,&&&&&&&&&&&&&&&&&&&&&&//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//***************************************************************************void BeginRun(){&&&&relay = 0;&&&&TR0 = 1;&&&&sec = min = hour = 0;}//***************************************************************************void StopRun(){&&&&relay = 1;&&&&TR0 = 0;&&&&sec = min = hour = 0;&&&&count = 0;}//***************************************************************************void Init()&&//50毫秒@11.0592MHz{&&&&AUXR &= 0x7F;&& //定时器时钟12T模式&&&&TMOD &= 0xF0;&& //设置定时器模式&&&&TL0 = 0x00;&&&& //设置定时初值&&&&TH0 = 0x4C;&&&& //设置定时初值&&&&TF0 = 0;&&&&&&&&//清除TF0标志&&&&TR0 = 0;&&&&&&&&//定时器0停止计时&&&&//&&&&ET0 = 1;&&&&EA = 1;&&&&//}//***************************************************************************//定时器0中断//***************************************************************************void Timer0() interrupt 1{&&&&static UINT8 tim0, tim1, tim2;&&&&if(++tim0 &= 10)&&&&//500ms&&&&{&&&&&&&&tim0 = 0;&&&&&&&&light = !&&&&&&&&if(++tim1 &= 2) //1s&&&&&&&&{&&&&&&&&&&&&tim1 = 0;&&&&&&&&&&&&if(++sec &= 60) //1m&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if(++tim2 &= 10)&&&&//10m&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&tim2 = 0;&&&&&&&&&&&&&&&&&&&&save = 1;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&sec = 0;&&&&&&&&&&&&&&&&if(++min &= 60) //1h&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&min = 0;&&&&&&&&&&&&&&&&&&&&//使用count递减来倒计时&&&&&&&&&&&&&&&&&&&&++&&&&&&&&&&&&&&&&&&&&--&&&&&&&&&&&&&&&&&&&&if(count == 0)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&bFinished = 1;&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}}//***************************************************************************void Delay1ms(UINT16 ms)&&//@11.0592MHz{&&&&UINT8 i,&&&&for(; ms&0; ms--)&&&&{&&&&&&&&i = 11;&&&&&&&&j = 190;&&&&&&&&do&&&&&&&&{&&&&&&&&&&&&while(--j);&&&&&&&&} while(--i);&&&&}}//***************************************************************************void ReadKey(){&&&&if(key1)&&&&&&Delay1ms(150); //去抖动&&&&if(key1)&&&&&&while(!key1);&&&&count++;&&&&if(count & MAX_HOURS)&&&&{&&&&&&&&count = 0;&&&&}&&&&OrgCount =&& //设定的定时初值&&&&if(count == 0)&&&&{&&&&&&&&StopRun();&&&&}&&&&else&&&&{&&&&&&&&BeginRun();&&&&}}//***************************************************************************void main(){&&&&P3 = 0xFF;&&//初始化端口状态&&&&light = 0;&&&&save = 0;&&&&bFinished = 0;&&&&bOldLight = ~&&&&//&&&&Init();&&&&//&&&&sec = Byte_Read(0);&&&&min = Byte_Read(1);&&&&hour = Byte_Read(2);&&&&count = Byte_Read(3);&& //当前剩余的小时数&&&&OrgCount = Byte_Read(4);&&&&//设定的定时初值&&&&if(OrgCount & MAX_HOURS)&&&&//合法性检查&&&&{&&&&&&&&OrgCount = 0;&&&&}&&&&if(count == 0)&&//说明不是断点续计的&&&&{&&&&&&&&count = OrgC&&&&}&&&&&&&&if(count == 0 || count & MAX_HOURS)&&&&{&&&&&&&&count = 0;&&&&&&&&TR0 = 0;&&&&}&&&&else&&&&{&&&&&&&&relay = 0;&&&&&&&&TR0 = 1;&&&&}&&&&while(1)&&&&{&&&&&&&&ReadKey();&&//读取按键&&&&&&&&if(save & TR0)&&//保存到eeprom中&&&&&&&&{&&&&&&&&&&&&save = 0;&&&&&&&&&&&&Sector_Erase(0);&&&&&&&&&&&&Byte_Write(0, sec);&&&&&&&&&&&&Byte_Write(1, min);&&&&&&&&&&&&Byte_Write(2, hour);&&&&&&&&&&&&Byte_Write(3, count);&&&&&&&&&&&&Byte_Write(4, OrgCount);&&&&//保存设定的定时初值&&&&&&&&}&&&&&&&&if(count == 0)&&//运行检查&&&&&&&&{&&&&&&&&&&&&StopRun();&&&&&&&&&&&&OutputTo_Hc595(Seg8Code[16]); //关闭数码管显示&&&&&&&&}&&&&&&&&else if(bOldLight != light)&&&&&&&&{&&&&&&&&&&&&bOldLight =&&&&&&&&&&&&bChar = Seg8Code[count];&&&&&&&&&&&&bChar = light ? (bChar&0x7F) : (bChar|0x80);&&&&//点闪烁&&&&&&&&&&&&OutputTo_Hc595(bChar);&&&&&&&&}&&&&&&&&if(bFinished)&&&&&&&&{&&&&&&&&&&&&bFinished = 0;&&&&&&&&&&&&StopRun();&&&&&&&&&&&&Sector_Erase(0); //计时结束后清除保存的信息,以防下次加电继续计时。&&&&&&&&&&&&Byte_Write(0, sec);&&&&&&&&&&&&Byte_Write(1, min);&&&&&&&&&&&&Byte_Write(2, hour);&&&&&&&&&&&&Byte_Write(3, count);&&&&&&&&&&&&Byte_Write(4, OrgCount);&&&&//保存设定的定时初值&&&&&&&&&&&&//鸣叫一下&&&&&&&&&&&&beep = 0;&&&&&&&&&&&&Delay1ms(1000);&&&&&&&&&&&&beep = 1;&&&&&&&&}&&&&}}
真的是好文章,一定花时间学习一下你的程序,
应该弄个2位数码管的才好,倒计时时间长一点,在循环的过程中加个常开就好了&&&&
常开---倒计时---常闭
很实用的制作,有空试试
不错,不错,我明天抄一下看一下. 暂时手里面没有595,
真的是好文章,一定花时间学习一下你的程序
谢谢分享的代码 没币下载不了附件里
上次那个下载了不能用啊
实在太好了,刚好本人也要一个定时器
不知道能不能做一个分钟的定时器啊,拿来曝光pcb
優秀文章,值得看看学学!
留个记号,很不错
我仿制了一个因为用不到蜂鸣器,说以蜂鸣器那一块电路没有连,1脚空着呢,问题出现了,通上电有时数码管全亮。有时不亮按下按键后跳到1(有时7)一秒后数码管全亮,继电器始终没有动作,这是为什么?
感谢 楼主分享我需要一个10分钟左右的定时器&&把定时器改成下面的 可以吗void Timer0() interrupt 1{&&&&static UINT8 tim0, tim1;&&&&if(++tim0 &= 10)&&&&//500ms&&&&{&&&&&&&&tim0 = 0;&&&&&&&&light = !&&&&&&&&if(++tim1 &= 2) //1s&&&&&&&&{&&&&&&&&&&&&tim1 = 0;&&&&&&&&&&&&if(++sec &= 60) //1m&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&sec = 0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//使用count递减来倒计时&&&&&&&&&&&&&&&&&&&&++&&&&&&&&&&&&&&&&&&&&--&&&&&&&&&&&&&&&&&&&&if(count == 0)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&& bFinished = 1;&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}
这个定时器很实用,手上没有595,但有很多89C2051,楼主如有时间,帮忙改一个用2051的程序吧,感谢。
查看完整版本: [--
Powered by
Gzip enabled

我要回帖

更多关于 cd4511驱动数码管 的文章

 

随机推荐