`
xiewanzhi
  • 浏览: 161620 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第三章 锁、表分区

阅读更多

Oracle 第3章 锁、表分区



1、技术目标 

  • 理解锁定的概念
  • 使用表分区


2、锁定的概念 

  • 多个用户可同时访问相同数据,锁是数据库用来控制共享资源并发访问的机制
  • Oracle提供的锁可以确保多用户环境下数据的完整性、一致性
  • 锁能用于保护正在被修改的数据
  • 在提交或回滚事务之前,Oracle会锁定正在被修改的数据,直到提交或回滚了事务之后,锁会自动释放,其他用户才能更新数据 例如:库存中某商品只剩1件,某用户正在在线订购该商品,与该操作相关的数据,也就是这件商品的记录可以锁定,以防止其他用户"同时购买"该商品而修改该记录

大多数情况下,锁不需要开发者干预 ,Oracle会自动完成锁定,比如修改数据时,Oracle提供了锁定操作,以便于需要显示锁定数据时使用。锁定的特点如下:

  • 一致性:一次只允许一个用户修改数据,以保证数据的统一
  • 完整性:提供正确的数据,某用户所修改的数据会反映给所有其他用户
  • 并发性:允许多用户同时访问同一数据,如,某用户正在修改商品库存时,其他用户可以同时查看库存信息,某用户正在更新数据时,其他用户就不能同时删除该数据


3、锁的类型 

锁有两种类型:行级锁 (用于特定行)、表级锁 (用于整个表)

    3.1)行级锁

    对正在被修改的行进行锁定。其他用户可以访问其余的行,如图

    

    行级锁是一种排他锁 ,可防止其他事务修改行,但不会阻止读取,
    在使用insert、update、delete以及select  ... for update等
    语句时,Oracle会自动应用行级锁,select  ... for update 
    语句可每次选择多行记录进行更新,这些记录会被锁定,直到
    回滚或提交该事务后锁才会释放,其他用户才可编辑这些记录
    
    select ... for update语句的完整语法如下:
    select ... for update [of 列名集合] [wait 秒数 | nowait]; 
    of子句指定需要锁定的列
    wait子句指定等待其他用户释放锁的时间(秒),防止无限期等待
    
    使用: 锁定vencode为V002的记录中oDate和delDate两列,然后再修改
    SELECT * FROM orderMaster WHERE vencode=’V002’
            FOR UPDATE OF oDate, delDate;
    UPDATE orderMaster SET delDate=’18-8月-08’ WHERE 
    vencode=’V002’;
    COMMIT;--事务提交后释放锁定 
    
    使用"for update wait"子句的优点有:

  • 防止无期限等待被锁定的行
  • 可在应用程序中对锁定的等待时间进行设置

    
    3.2)表级锁

    表级锁用于保护表数据,使用"lock table "语句显示锁定表。在事务处理中,
    表级锁用来限制对表的添加、更新和删除等操作,具体语法如下:
    lock table 表名 in 锁定模式 mode [nowait];
    nowait关键字可防止无限期等待其他用户释放锁
    锁定模式有如下内容:

  • 行共享(row share, rs):允许其他用户访问和锁定表,禁止排他锁定整个表
  • 行排他(row exclusive, rx):在行共享模式基础上,禁止其他用户在表上使用共享锁
  • 共享(share, s):共享锁将锁定表,只允许其他用户查询表中的行,不允许添加、更新或删除行,多个用户可同时在同一表中设置共享锁(允许资源共享) 例如,每天的结帐操作时需更新日销售额表,可在更新该表示设置共享锁以确保数据一致性
  • 共享行排他(share row exclusive, srx):比共享锁更多的限制,防止其他事务在表上使用共享锁、共享行排他锁以及排他锁
  • 排他(exclusive, x):对表执行的最大限制,其他用户只能查询该表的记录,该锁防止其他事务对表做任何更新或在表上设置任何类型的锁

    使用: 以共享模式锁定orderMaster表
    lock table orderMaster in share mode;
    注意:执行commit或rollback命令可释放锁定 
    
    某用户对表锁定时未使用nowait子句,如该表已被另外的用户
    锁定,那么他将无限期等待,直到锁定该表的用户使用commit
    或rollback语句释放锁
    
4、死锁

当两个事务相互等待对方完成任务时,会出现死锁。比如用户A锁定了对象
X,用户B锁定了对象Y,用户A再锁定Y,用户B再锁定X,两位用户需要等
待对方释放锁,此时两个用户处于僵持状态,无法继续处理业务,这种情况
Oracle会自动检测死锁,通过终止两个事务之一来解决问题,如图




死锁在Oracle中极少出现,一般不用考虑此问题,可以通过人为制造环境来
产生死锁

5、表分区 

Oracle可管理包含海量数据的表,如,公司的订单表可能会增加到百万行,
大小超过2GB,随着表的增大,数据管理随之变得困难,要查找某条记录
需要搜索整个表,会消耗大量的系统资源和时间。Oracle提供的表分区技
术可改善系统性能

表分区允许用户把一个表中的行分为几个部分,不同的部分还可存储在不
同的位置。被分区的表称为分区表,划分出的每一个部分成为一个分区

表分区有许多优势 :

  • 可改善表的查询性能,在对表进行分区后,用户执行SQL查询时可以只访问表中的特定分区
  • 表更容易管理,因为分区表的数据存储在多个部分中,按分区加载和删除数据比在表中加载和删除更容易
  • 便于备份和恢复,可独立备份和恢复每个分区
  • 提高数据安全性,将不同的分区分布在不同的磁盘,可减小所有分区数据同时损坏的可能


应用程序不用知道表已分区,在更新和查询分区表时和普通表的操作一
样,但Oracle优化程序知道表已被分区

注意:要分区的表不能具有LONG和LONG ROW数据类型的列 

Oracle提供4种分区方法:

  • 范围分区
  • 散列分区
  • 复合分区
  • 列表分区


6、范围分区

范围分区根据表的某列或多列的值范围,决定将数据存储在哪个分区上,
比如,可根据序号分区,根据记录的创建日期分区等

创建分区的语法,在create table语句中增加partition子句可创建分区表,
按范围分区的语法为:
create table 表名
(
    ......
)
partition by range (column_name)
(
    partition part1 value less than(range1) [tablespace tbs1],
    partition part2 value less than(range2) [tablespace tbs2],
    ...
    partition partN value less than(rangeN) [tablespace tbsN],
)
语法说明:
column_name 为创建范围分区的列,其列值称为分区键
part1 ... partN 为分区名
range1 ... MAXVALUE 为分区的边界值
tbs1 ... tbsN 为分区所在的表空间,tablespace是可选项

范围分区注意事项:

  • 每个分区的边界值必须小于下一个分区的边界值
  • 每个分区中,只需指定其范围的最大值
  • 所有行的分区键都要小于( < )该分区的边界值
  • 最后一个分区中,MAXVALUE关键字代表边界的最大值,Oracle使用这个分区来存储前面几个分区中不能存储的数据,范围的最小值由Oracle隐含定义


使用1: 购物商场根据销售成本(salesCost)对Sales表中的数据进行分区,
每个分区有一个分区界限用以限制分区范围,按逻辑范围进行分区,
create table Sales
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesCost)
(
    partition P1 values less than (1000),
    partition P2 values less than (2000),
    partition P3 values less than (3000),
);
说明: 
创建Sales表时创建了3个分区,P1分区包含销售成本低于1000的所有
产品,P2分区包含销售成本低于2000但高于或等于1000的所有产品

使用2: 分区列为date数据类型的情况,必须使用年份为4字符格式掩码
的to_date()函数指定分区边界,
create table sales2
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesDate)
(
    partition P1 values less than (to_date('2006-01-01', 'YYYY-MM-DD')),
    partition P2 values less than (to_date('2007-01-01', 'YYYY-MM-DD')),
    partition P3 values less than (MAXVALUE),
);
说明: 根据销售日期将表分为3个分区,第一个分区存储2006年以前
的数据,第二个分区存储2006年度的数据,第三个分区存储2007年
以后的数据

7、散列分区

散列分区通过在分区键值上执行一个散列函数 来决定数据的物理位置,
在范围分区中分区键的连续值通常存储在相同的分区中,而散列分区
会把记录平均分布到不同的分区,减少磁盘I/O争用的可能性,

散列分区需要用户指定表所需的分区数目以及存储分区的物理位置,
将散列算法应用于分区键后,散列分区会将数据分布到适当的分区,
语法如下:
partition by hash (column_name)
partitions number_of_partitions [store in (tablespace_list)];
或者
partition by hash (column_name)
(
    partition part1 [tablespace tbs1],
    partition part2 [tablespace tbs2],
    ...
    partition partN [tablespace tbsN],
)
语法说明: 
column_name 为作为基础创建散列分区的列
number_of_partitions 为分区数量,使用这种方式会自动生成分区名
tablespace_list 为分区使用的表空间,如果分区数量超过表空间数量,
        分区会以循环的方式分配到表空间中
part1 ... partN 为分区名

使用1: 创建Employee表,设置4个散列分区,department列为分区键
create table employee
(
    empId number(4),
    empName varchar2(14),
    empAddress varchar2(15),
    department varchar2(10)
)
partition by hash(department) partitions 4;

使用2: 创建表MyEmp并设置2个散列分区
create table MyEmp
(
    eId number(4),
    eName varchar2(20)
)
partition by hash(empId)
(
    partition part1,
    partition part2
);

7、复合分区

复合分区是范围分区和散列分区的结合,创建复合分区时,先按范围对
数据进行分区,然后在这些分区内创建散列分区。复合分区即具有范围
分区便于管理的特定,有具有散列分区在数据放置和并行操作方面的优势

复合分区语法:
partition by range (column_name1)
subpartition by hash(column_name2)
subpartition number_of_partitions [store in (tablespace_list)]
(
    partition part1 value less than(range1),
    partition part2 value less than(range2),
    ...
    partition partN value less than(MAXVALUE),
);
语法说明: 
column_name1
column_name2
number_of_partitions
part1 ... partN 为分区名
range 为范围分区的边界值

使用: 创建表Sales,设置复合分区,先根据salesDate列创建4个范
围分区,再根据productId创建子分区,子分区采用散列分区,共创
建5个子分区,总共创建20个子分区
create table Sales
(
    productId varchar2(5),
    salesDate date not null,
    salesCost number(10)
)
partition by range(salesDate)
subpartition by hash(productId)
subpartitions 5
(
    partition P1 values less than(date '2008-03-01'),
    partition P2 values less than(date '2008-06-01'),
    partition P3 values less than(date '2008-09-01'),
    partition P4 values less than(MAXVALUE),
);

8、列表分区

列表分区允许用户明确地控制行到分区的映射,列表分区允许按自然方式
对无序和不相关的数据集进行分组和组织,语法如下:
partition by list (column_name)
(
    partition part1 values (values_list1),
    partition part2 values (values_list2),
    ...
    partition partN values (DEFAULT)
);
语法说明: 
column_name 为创建列表分区的基础列
part1 ... partN 为分区名
values_list 为对应分区的分区键值列表
DEFAULT 关键字为允许存储前面的分区不能存储的记录

使用: 根据职员住址对Employee表进行分区,north分区只包含地址
为"辽宁"的记录,如果用户输入的值是"广东",则Oracle会拒绝该值,
因为没有创建可以包含该值的分区
create Employee
(
    empId number(4),
    empName varchar2(14),
    empAddress varchar2(15),
    department varchar2(10)
)
partition by list(empAddress)
(
    partition north values('辽宁'),
    partition west values('西藏', '青海'),
    partition south values('福建', '海南'),
    partition east values('江苏', '上海')
);

9、按分区查询、删除记录 
使用1: 查询表分区的记录
select * from 表名 partition (分区名);

使用2: 删除表分区的记录
delete from 表名 partition (分区名);

10、分区维护

分区维护是指修改分区表的分区,比如可以向现有表添加新分区,将
分区移动到其他表空间中等等

某些分区维护操作时计划事件,如在历史数据库中,数据库管理员定
期从数据库中删除最旧的分区并添加一组新的分区,该删除和添加操作
将定期执行

其他分区维护操作时费计划事件,用于解决应用程序或系统问题,例如
意料之外的事务处理活动可能会迫使DBA拆分分区以便重新平衡I/O负载

部分分区维护操作如下:

  • 添加分区
  • 删除分区
  • 截断分区
  • 合并分区
  • 拆分分区

    10.1)添加分区 
    alert table 表名 add partition 新分区名 values less than (边界值);
    该语句用于在最后一个分区后添加新分区,如果要在表的开始或中间
    位置添加分区,或者最高分区的分区边界是MAXVALUE,则应使用
    split partition语句
    
    10.2)删除分区 
    alter table 表名 drop partition 分区名;
    删除分区会连分区中的数据一起删除
    
    10.3)截断分区 
    alter table 表名 truncate partition 分区名;
    截断分区会删除表分区中的所有记录

    10.4)合并分区 
    alter table 表名
    merge partitions 分区名1, 分区名2
    into 新分区名;
    可将范围分区或复合分区表的两相邻分区连接起来,合并后的
    分区将继承两个分区的较高上界

    10.5)拆分分区 
    alter table 表名
    split partition 分区名 at (边界值)
    into (partition 新分区名1, partition 新分区名2);
    可在表的开头或中间添加分区,拆分分区允许用户将一个分区
    拆分为两个分区,当分区过大时可对分区进行拆分
    
    使用:将Sales表的P3分区拆分为P31和P32两个分区,原P3分区
    存储2007年以后的数据,拆分为两个分区,一个存放2007年度数
    据,另一个存放2008年以后的数据
    alter table Sales split partition P3 at (date '2008-01-01')
    into (partition P31, partition P32);

11、总结

  • 锁用于保护多用户环境下被修改的数据
  • 锁分为两种级别,即行级锁和表级锁
  • 表分区允许将一个表划分成几部分,以改善大型应用系统的性能
  • 分区方法包括范围分区、散列分区、复合分区和列表分区
  • 分区维护操作包括添加、删除、截断、合并和拆分分区

分享到:
评论

相关推荐

    LTspice仿真:LDO电源电路学习与实践的利器

    内容概要:本文详细介绍了如何利用LTspice进行LDO(低压差线性稳压器)电源电路的仿真。首先讲解了如何导入LDO模型并配置仿真环境,接着深入探讨了瞬态分析、相位裕度、电源抑制比(PSRR)等关键仿真的具体步骤和注意事项。文中提供了多个实用的操作技巧,如通过调整补偿电容优化相位裕度,以及使用.step param命令批量测试不同参数的影响。此外,还分享了一些常见的仿真误区及其解决方法,帮助读者更好地理解和掌握LDO的设计与调试。 适合人群:电子工程专业学生、电源电路设计初学者、希望深入了解LDO特性的工程师。 使用场景及目标:适用于希望通过仿真工具提高LDO设计技能的人群。主要目标是掌握LDO的基本工作原理,学会使用LTspice进行各种类型的仿真分析,从而优化电路设计,确保系统的稳定性和性能。 其他说明:文章不仅提供详细的仿真步骤和技术细节,还附带了作者的实际经验和常见问题解决方案,使读者能够在实践中不断改进自己的设计思路。

    渝安集团员工职业发展通道设计方案.ppt

    渝安集团员工职业发展通道设计方案.ppt

    新能源电动汽车VCU与BMS的HIL硬件在环仿真技术及其模块化建模

    内容概要:本文详细介绍了新能源电动汽车中VCU(整车控制器)和BMS(电池管理系统)的HIL(硬件在环)仿真技术。首先阐述了整车建模的基础,包括电池、电机等关键部件的建模要点。接着分别解析了驾驶员模块、仪表模块、BCU整车控制器模块、MCU电机模块、TCU变速箱模块、BMS电池管理模块等多个子模块的功能和实现方式。最后强调了HIL仿真在电动汽车控制系统测试和优化中的重要性,特别是在降低成本和风险方面的作用。 适合人群:从事新能源汽车研发的技术人员,尤其是专注于VCU和BMS领域的工程师。 使用场景及目标:适用于需要深入了解电动汽车控制系统仿真技术的研发团队,在产品开发初期进行系统测试和优化,确保各子系统间的协同工作正常。 其他说明:文中提供了大量代码示例,帮助读者更好地理解和实践相关概念和技术细节。此外,还分享了一些实际项目中的经验和教训,如故障注入测试的具体应用场景等。

    如何应对一线人员春节后的离职潮.docx

    如何应对一线人员春节后的离职潮

    线性代数_GitHub_课件作业_教学辅助用途_1742837800.zip

    线性代数

    离职面谈表.xls

    离职面谈表.xls

    聚宽对接qmt大礼包,帮助你配置好交易实盘环境

    聚宽对接qmt大礼包,配备需要的全部软件:python3.9版本,qmt模拟安装包,pycharm安装包,talib包

    试用期转正表.xls

    试用期转正表.xls

    招聘数据分析.xls

    招聘数据分析.xls

    如何让新员工快速融入团队.docx

    如何让新员工快速融入团队

    电力电子仿真中并离网逆变器及无功补偿设备的控制策略与建模

    内容概要:本文详细介绍了并离网逆变器的两种主要控制策略——PQ控制和V/f控制,以及无功能量发生器(SVG)和有源电力滤波器(APF)的仿真模型。对于PQ控制,文章展示了如何将功率指令转化为电流指令,并强调了电网电压定向和限幅处理的重要性。V/f控制则用于离网模式,通过调节电压和频率来维持系统的稳定。SVG主要用于无功补偿,通过实时计算无功需求进行补偿。APF则专注于谐波检测和消除,利用自适应滤波器提高效率。此外,文中还提供了多个实用的小技巧,如仿真步长设置、模式切换时的前馈补偿等。 适合人群:从事电力电子仿真研究的技术人员,尤其是对逆变器控制策略感兴趣的工程师。 使用场景及目标:适用于需要深入理解和实现逆变器控制策略的研究项目,帮助工程师优化仿真模型,提升系统性能,确保仿真结果的准确性。 其他说明:文章不仅提供了详细的代码片段,还分享了许多实践经验,有助于读者避免常见错误,提高仿真成功率。

    Carsim与Simulink联合仿真中基于线性二自由度模型的卡尔曼滤波(KF)实现及优化

    内容概要:本文详细介绍了如何利用Carsim与Simulink进行联合仿真,通过线性二自由度模型和卡尔曼滤波(KF)来估计车辆的质心侧偏角和横摆角速度。首先搭建了联合仿真框架,Carsim提供车辆状态量,Simulink负责算法处理。文中展示了线性二自由度模型的状态方程及其参数设定,并深入探讨了KF的两种实现方式:S函数编程和Simulink内置模块。对于S函数实现,着重讲解了状态转移矩阵的动态更新以及噪声矩阵Q的调整策略,确保模型能够适应车速变化。而对于内置模块,则指出了其在灵活性方面的不足之处。此外,还讨论了联合仿真的配置要点,如数据接口同步、采样时间和信号处理等问题。 适合人群:从事车辆动力学研究、控制理论应用、自动化控制领域的工程师和技术人员。 使用场景及目标:适用于需要精确估计车辆质心侧偏角和横摆角速度的研究和开发项目,特别是在涉及ESP等主动安全系统的开发过程中。目标是提高估计精度,增强系统的鲁棒性和响应速度。 其他说明:文章提供了详细的代码片段和实践经验分享,帮助读者更好地理解和实施相关技术。建议在实际应用中根据具体需求选择合适的KF实现方式,并注意处理各种边界条件和异常情况。

    档案管理[03].pptx

    档案管理[03]

    风电与储能联合调频系统:基于Python的建模与优化

    内容概要:本文详细介绍了风电与储能联合调频系统的原理及其优化方法。首先解释了风电输出功率的波动性和对电网频率的影响,提出储能系统作为解决方案。文中展示了如何用Python生成风速数据并构建调频控制系统,重点讨论了PID控制器的设计以及SOC(荷电状态)管理策略。此外,还探讨了调频控制逻辑、硬件在环测试、风电功率预测模型(如LSTM)、调频效果验证方法及储能系统的物理限制等问题。最后强调了模型验证的重要性,提出了异常数据注入测试的方法。 适合人群:从事电力系统自动化、新能源发电及储能技术研发的专业人士,尤其是有一定编程基础的研究人员和技术工程师。 使用场景及目标:适用于需要理解和实施风电与储能联合调频项目的团队。主要目标是提高电网稳定性,减少风电波动带来的负面影响,同时延长储能系统的使用寿命。 其他说明:文中提供了大量实用的Python代码示例,涵盖了从数据生成到控制逻辑实现再到模型验证的全过程。对于希望深入理解风储调频系统的工作机制和技术挑战的人来说,是一份非常有价值的参考资料。

    HCIA-Storage V4.5 培训教材 合集

    HCIA-Storage V4.5 培训教材 合集

    基于S7-1200与博途V15的PLC小车自动往返控制系统设计与仿真

    内容概要:本文详细介绍了利用西门子S7-1200系列PLC和博途V15软件平台构建的小车自动往返控制系统。首先进行硬件组态,选择合适的CPU并配置输入输出点位,确保限位开关和急停按钮的有效接入。接着编写梯形图逻辑,实现小车在AB两点间的精确控制,采用定时器互锁机制避免电机损坏。然后设计触摸屏界面,通过WinCC创建动画效果展示小车运动状态,并设置按钮操作实现手动与自动模式切换。最后进行联合仿真实验,解决常见错误如变量地址配置不当等问题,确保系统稳定运行。 适合人群:工业自动化领域的工程师和技术人员,尤其是对PLC编程和HMI设计有一定基础的学习者。 使用场景及目标:适用于需要掌握PLC控制系统设计全流程的专业人士,帮助他们理解如何整合硬件组态、梯形图编程以及HMI开发,最终完成一个完整的自动化工程项目。 其他说明:文中提供了详细的调试经验和技巧,附带74分钟的操作录像资料,有助于读者更好地理解和实践相关知识点。

    公司员工关怀工作清单.xls

    公司员工关怀工作清单

    基于ANSYS/LS-DYNA的多孔延时起爆与重复起爆仿真技术详解

    内容概要:本文详细介绍了如何利用ANSYS/LS-DYNA进行多孔延时起爆和重复起爆的仿真。首先强调了起爆点的时间线控制和材料参数设置的重要性,如使用*INITIAL_DETONATION关键字设定起爆时间和坐标,以及配置JWL方程等材料属性。接着讨论了重复起爆的具体实现方式,包括使用*CONTROL_TERMINATION配合重启动功能,确保起爆点的正确复用。此外,文章还提供了调试技巧,如检查起爆同步性和优化时间步控制,以确保仿真的准确性。最后,分享了一些实际应用中的经验和常见错误,帮助用户更好地理解和掌握这一复杂的技术。 适合人群:从事爆炸力学研究和爆破工程设计的专业人士,尤其是有一定ANSYS/LS-DYNA使用经验的工程师。 使用场景及目标:适用于需要精确控制多个起爆点时间延迟和多次起爆的应用场合,如矿山开采、隧道挖掘等领域的爆破作业仿真。目标是提高爆破效率,减少对周围环境的影响。 其他说明:文中提到的许多技术细节对于初学者来说可能会有一定的难度,因此建议从简单的单孔起爆开始练习,逐步掌握复杂的多孔延时和重复起爆技术。同时,保持良好的注释习惯有助于追踪参数修改历史,便于后续调试和维护。

    Java面向对象的三大特性:封装、继承与多态

    内容概要:本文档详细介绍了Java面向对象编程的三大核心特性:封装、继承与多态。封装通过访问修饰符限制属性的访问权限,确保数据的安全性和完整性,如Student类中将name和age设为私有属性并通过公共方法进行访问控制。继承使得子类可以复用父类的属性和方法,减少代码冗余,如Dog类继承了Animal类的属性和方法并增加了特有的bark()方法。多态分为编译时多态(方法重载)和运行时多态(方法重写),它允许不同对象以相同接口执行不同的行为,如Shape类及其子类Circle和Rectangle通过重写getArea()方法实现了不同的面积计算逻辑,并在Main类中展示了多态的实际应用。 适合人群:具有Java编程基础的学习者或开发者,特别是对面向对象概念有初步了解但需要深入理解的人群。 使用场景及目标:①掌握Java中封装的实现机制,学会使用访问修饰符保护类成员;②理解继承的概念,能够创建父子类关系并利用继承特性提高代码复用性;③熟悉多态的应用场景,能够在实际项目中运用多态特性实现灵活的对象行为。 阅读建议:本资源侧重于理论讲解与简单示例演示,建议读者在学习过程中结合实际编程练习加深理解,同时注意对比不同特性的应用场景,以便更好地掌握面向对象编程的核心思想。

    基于51单片机protues仿真的番茄计时器(仿真图、源代码、AD原理图、流程图、视频)

    基于51单片机protues仿真的番茄计时器(仿真图、源代码、AD原理图、流程图、视频) 设计一个番茄计时器。使用番茄工作法(番茄工作法是一种时间管理方法),选择一个待完成的任务,将番茄时间设为45分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后进行短暂休息一下(5分钟),然后再开始下一个番茄。每4个番茄时段再多休息5分钟。 按键1:单击设置45分钟倒计时,双击设置5分钟休息倒计时。 按键2:单击音乐播放,双击暂停。按键3:复位按键。 所需硬件:3个按键,1个动态数码管,1个蜂鸣器。 仿真图、源代码、AD原理图、流程图、视频

Global site tag (gtag.js) - Google Analytics