You are on page 1of 7

‫ﻋﻨﻮﺍﻥ ﻣﻄﻠﺐ ‪:‬‬

‫ﺭﻟﻪ ﻫﺎﯼ ﺗﺎﺧﻴﺮﯼ ﭼﻨﺪ ﺯﻣﺎﻧﻪ‬


‫)ﺗﺎﻳﻤﺮ ﭼﻨﺪ ﺯﻣﺎﻧﻪ(‬

‫ﻣﻄﺎﻟﺐ ﺑﻴﺎﻥ ﺷﺪﻩ ﻓﻮﻕ ﺍﺯ ﺳﺮﯼ ﻣﺜﺎﻝ ﻫﺎ ﻭ ﻣﻄﺎﻟﺐ ﺗﮑﻤﻴﻠﯽ ﮐﺘﺎﺏ " ﺁﻣﻮﺯﺵ ﺣﺮﻓﻪ ﺍﯼ ﻣﻴﮑﺮﻭﮐﻨﺘﺮﻟﺮﻫﺎﯼ ‪ "PIC‬ﻣﯽ ﺑﺎﺷﺪ ‪.‬‬
‫ﺑﺮﺍﯼ ﺍﻃﻼﻋﺎﺕ ﺑﻴﺸﺘﺮ ﺩﺭ ﻣﻮﺭﺩ ﮐﺘﺎﺏ ﻭ ﻳﺎ ﺧﺮﻳﺪ ﻣﯽ ﺗﻮﺍﻧﻴﺪ ﺍﺯ ﻃﺮﻳﻖ ﻟﻴﻨﮏ ﺯﻳﺮ ﺍﻗﺪﺍﻡ ﮐﻨﻴﺪ ‪:‬‬

‫‪www.dspic.ir/product_info.php?products_id=1447‬‬

‫‪www.ir-micro.com/modules.php?name=Forums&file=viewtopic&t=483‬‬

‫‪۱‬‬
‫‪www.Ir-micro.com‬‬ ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ ‪ ،‬ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬
‫ﺭﻟﻪ ﻫﺎﯼ ﺗﺎﺧﻴﺮﯼ ﭼﻨﺪ ﺯﻣﺎﻧﻪ)ﺗﺎﻳﻤﺮ ﭼﻨﺪ ﺯﻣﺎﻧﻪ( ‪:‬‬

‫ﺗﺎﻳﻤﺮﻫﺎ ‪ ،‬ﺷﻤﺎﺭﻧﺪﻩ ﻫﺎ ﻭ ﺳﺎﻋﺖ ﻫﺎﯼ ﻣﻌﻤﻮﻟﯽ ﻋﻤﻮﻣﺎ ﺑـﻪ ﺍﻳـﻦ ﺻـﻮﺭﺕ‬


‫ﺑﺮﻧﺎﻣﻪ ﺭﻳـﺰﯼ ﻣـﯽ ﺷـﻮﻧﺪ ﮐـﻪ ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﺗﻌـﺪﺍﺩ ﺗﺎﻳﻤﺮﻫـﺎﯼ ﺩﺍﺧﻠـﯽ‬
‫ﻣﻴﮑﺮﻭﮐﻨﺘﺮﻟﺮ )‪ ۱۶‬ﺑﻴﺘﯽ ﻭ ﻣﺠﻬﺰ ﺑﻪ ﺍﺳﻴﻼﺗﻮﺭ ﺧﺎﺭﺟﯽ( ‪ ،‬ﺣـﺪﺍﮐﺜﺮ ﺍﻣﮑـﺎﻥ‬
‫ﺫﺧﻴﺮﺓ ‪ ۱‬ﻳﺎ ‪ ۲‬ﺯﻣﺎﻥ ﻣﺠﺰﺍ ﺍﺯ ﻫﻢ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ‪.‬‬
‫ﺍﻣﺎ ﺩﺭ ﺑﺮﺧﯽ ﻣﻮﺍﺭﺩ ﻧﻈﻴﺮ ﺳﺎﻋﺖ ﻫﺎﻳﻲ ﮐﻪ ﭼﻨﺪﻳﻦ ﺯﻣﺎﻥ ﺭﺍ ﺑـﺮﺍﯼ ﻧﻘـﺎﻁ‬
‫ﻣﺨﺘﻠﻒ ﻳﺎ ‪ ...‬ﻣﺤﺎﺳﺒﻪ ﻭ ﻧﻤﺎﻳﺶ ﻣﯽ ﺩﻫﻨﺪ ‪ ،‬ﻭ ﻳﺎ ﺩﺭ ﺯﻣﺎﻥ ﺳﻨﺞ ﻫﺎﻳﻲ ﮐﻪ ﻋﻤﻮﻣﺎ ﺑـﺎ ﻧـﺎﻡ ﺭﻟـﻪ ﻫـﺎﯼ ﺻـﻨﻌﺘﯽ‬
‫ﺷﻨﺎﺧﺘﻪ ﻣﯽ ﺷﻮﻧﺪ ﻭ ﻧﻴﺎﺯ ﺍﺳﺖ ﮐﻪ ﻫﺮ ﺧﺮﻭﺟﯽ ﭘﺲ ﺍﺯ ﻳﮏ ﺗﺎﺧﻴﺮ ﻣﺨﺼﻮﺹ ﺑﻪ ﺧﻮﺩ ﺍﺯ ﻣﺪﺍﺭ ﺧﺎﺭﺝ ﺷـﻮﺩ ‪،‬‬
‫ﭼﻨﻴﻦ ﺑﻪ ﻧﻈﺮ ﻣﯽ ﺭﺳﺪ ﮐﻪ ﺑﺎﻳﺪ ﺗﻌﺪﺍﺩ ﺗﺎﻳﻤﺮﻫﺎﻳﻲ ﮐﻪ ﺑﻪ ﮐﺎﺭ ﺑﺮﺩﻩ ﻣﯽ ﺷﻮﺩ ‪ ،‬ﺑﺎ ﻧﺴﺒﺖ ﺯﻣﺎﻥ ﻫـﺎﻳﻲ ﮐـﻪ ﻗﺼـﺪ‬
‫ﻣﺤﺴﺎﺑﺔ ﺁﻥ ﺭﺍ ﺩﺍﺭﻳﻢ ﺑﺮﺍﺑﺮ ﺑﺎﺷﺪ ‪ .‬ﮐﻪ ﺍﻳﻦ ﺣﺎﻟﺖ ﺑﺮﺍﯼ ﻣﻴﮑﺮﻭﮐﻨﺘﺮﻟﺮﯼ ﻣﺎﻧﻨـﺪ ‪ 16F877‬ﺑـﻪ ﻣﻌﻨـﺎﯼ ﺑـﻪ ﮐـﺎﺭ‬
‫ﺑﺮﺩﻥ ﻳﮏ ﻣﻴﮑﺮﻭ ﺑﺮﺍﯼ ﻫﺮ ﻭﺍﺣﺪ ﺯﻣﺎﻧﯽ ﺍﺳﺖ ‪ .‬ﺍﻣﺎ ﺩﺭ ﺍﻳﻦ ﭘﺮﻭﮊﻩ ﻗﺼﺪ ﺩﺍﺭﻳﻢ ﺗﺎ ﺭﻭﺷﯽ ﺭﺍ ﺑﺮﺭﺳﯽ ﮐﻨﻴﻢ ﮐـﻪ‬
‫ﺑﺪﻭﻥ ﻧﻴﺎﺯ ﺑﻪ ﭼﻨﺪﻳﻦ ﺗﺎﻳﻤﺮ ﻣﺠﺰﺍ ﻭ ﺗﻨﻬﺎ ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﺗﺎﻳﻤﺮ ‪ ، ۱‬ﭼﻨﺪﻳﻦ ﺯﻣﺎﻥ ﻣﺠﺰﺍ ﺭﺍ ﻧﮕﻬﺪﺍﺭﯼ ﻭ ﺍﺳـﺘﺨﺮﺍﺝ‬
‫ﮐﻨﻴﻢ ‪ .‬ﺑﺮﺍﯼ ﺭﺳﻴﺪﻥ ﺑﻪ ﺍﻳﻦ ﺣﺎﻟﺖ ﻻﺯﻡ ﺍﺳﺖ ﮐﻪ ﻳﮏ ﺳﻄﺢ ﺯﻣﺎﻧﯽ ﺑﻪ ﺻﻮﺭﺕ ﻣﺮﺟﻊ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﻢ ﮐـﻪ ﺩﻳﮕـﺮ‬
‫ﺯﻣﺎﻥ ﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺁﻥ ﺳﻨﺠﻴﺪﻩ ﺷﻮﺩ ‪.‬‬
‫ﺩﺭ ﺍﺩﺍﻣﻪ ﺑﺮﻧﺎﻣﺔ ﮐﺎﺭﯼ ﻳﮏ ﺭﻟﻪ ﺗﺎﺧﻴﺮﯼ ‪ ۸‬ﻭﺭﻭﺩﯼ – ‪ ۸‬ﺧﺮﻭﺟﯽ ﺑﺎ ﻗﺎﺑﻠﻴﺖ ﺍﻳﺠـﺎﺩ ﺗـﺎﺧﻴﺮ ﺩﻟﺨـﻮﺍﻩ ﺑـﺮﺍﯼ ﻫـﺮ‬
‫ﺧﺮﻭﺟﯽ ﺑﻪ ﺻﻮﺭﺕ ﻣﺠﺰﺍ ﻭ ﺩﺭ ﺯﻣﺎﻥ ﻫﺎﯼ ﻣﺨﺘﻠﻒ ﺭﺍ ﺑﺮﺭﺳﯽ ﺧﻮﺍﻫﻴﻢ ﻧﻤﻮﺩ ﮐﻪ ﺑﺎ ﺍﺳـﺘﻔﺎﺩﻩ ﺍﺯ ﺗـﺎﻳﻤﺮ ‪ ۱‬ﻭ‬
‫ﺍﺳﻴﻼﺗﻮﺭ ﺧﺎﺭﺟﯽ ﻣﺨﺼﻮﺹ ﺑﻪ ﺁﻥ ‪ ،‬ﺣﺎﻟﺖ ‪ RTC‬ﭘﻴﺎﺩﻩ ﺳﺎﺯﯼ ﺷـﺪﻩ ﺗـﺎ ﺍﺯ ﺁﻥ ﺑـﺮﺍﯼ ﺍﻳﺠـﺎﺩ ﺗـﺎﺧﻴﺮ ﻭﺍﺣـﺪ‬
‫ﺍﺳﺘﻔﺎﺩﻩ ﺷﻮﺩ ‪.‬‬
‫ﺯﻣﺎﻥ ﻣﺮﺟﻊ ﺗﻮﺳﻂ ﺩﻭ ﻣﺘﻐﻴﺮ ﮐﻪ ﻳﮑﯽ ﻣﺨﺘﺺ ﺑﻪ ﺛﺎﻧﻴﻪ ﺷﻤﺎﺭ ﻭ ﺩﻳﮕﺮﯼ ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﻣﯽ ﺑﺎﺷـﺪ ﻧﮕﻬـﺪﺍﺭﯼ ﻭ‬
‫ﻋﻤﻞ ﺷﻤﺎﺭﺵ ﺯﻣﺎﻥ ﻫﻤﺎﻧﻨﺪ ﻳﮏ ﺳﺎﻋﺖ ﻣﻌﻤﻮﻟﯽ ‪ ،‬ﺑﺪﻭﻥ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﺳﺎﻋﺖ ﺷﻤﺎﺭ ﺍﻧﺠﺎﻡ ﻣﯽ ﺷـﻮﺩ ‪ .‬ﺳـﺮ‬
‫ﺭﻳﺰ ﺗﺎﻳﻤﺮ ﻫﺮ ‪ ۱‬ﺛﺎﻧﻴﻪ ﻳﮑﺒﺎﺭ ﺻﻮﺭﺕ ﻣﯽ ﮔﻴﺮﺩ ﮐﻪ ﺩﺭ ﺯﻳـﺮ ﺑﺮﻧﺎﻣـﺔ ﻣﺨﺼـﻮﺹ ﺑـﻪ ﻭﻗﻔـﺔ ﺳـﺮ ﺭﻳـﺰ ﺗـﺎﻳﻤﺮ ‪،‬‬
‫ﻣﺤﺎﺳﺒﺎﺕ ﻣﺮﺑﻮﻁ ﺑﻪ ﺗﻨﻈﻴﻢ ﻭ ﺍﻓﺰﺍﻳﺶ ﺛﺎﻧﻴﻪ ﻭ ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﺻﻮﺭﺕ ﻣﯽ ﮔﻴﺮﺩ ‪ .‬ﻫﺮ ﺯﻣﺎﻥ ﮐﻠﻴـﺪﯼ ﺯﺩﻩ ﺷـﻮﺩ ‪،‬‬
‫ﺑﺎﻳﺪ ﺧﺮﻭﺟﯽ ﻣﺨﺘﺺ ﺑﻪ ﺁﻥ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﺪﺕ ﺯﻣﺎﻧﯽ ﮐﻪ ﺍﺯ ﻗﺒﻞ ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﺍﺳﺖ ‪ ،‬ﻓﻌﺎﻝ ﺷﺪﻩ ﻭ ﭘـﺲ ﺍﺯ ﻃـﯽ‬
‫ﺯﻣﺎﻥ ﻣﺬﮐﻮﺭ ‪ ،‬ﻏﻴﺮ ﻓﻌﺎﻝ ﺷﻮﺩ ‪ .‬ﺑﺮﺍﯼ ﺗﺸﺨﻴﺺ ﺍﻳﻨﮑﻪ ﺧﺮﻭﺟﯽ ﻣﻮﺭﺩ ﻧﻈﺮ ﺑﺎﻳﺪ ﻓﻌﺎﻝ ﺑﺎﺷﺪ ﻳﺎ ﻏﻴﺮ ﻓﻌـﺎﻝ‪ ،‬ﻳـﮏ‬
‫ﻓﻠﮓ ﺑﺮﺍﯼ ﻫﺮ ﺧﺮﻭﺟﯽ ﺩﺭ ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﯽ ﺷﻮﺩ ﮐﻪ ﻫﺮ ﮔﺎﻩ ﮐﻠﻴﺪ ﻣﺮﺑـﻮﻁ ﺑـﻪ ﺁﻥ ﺧﺮﻭﺟـﯽ ﺯﺩﻩ ﺷـﻮﺩ ‪ ،‬ﻓﻠـﮓ‬
‫ﻣﺮﺑﻮﻃﻪ ﺳﺖ ﺷﺪﻩ ﺗﺎ ﺑﻪ ﺍﻳﻦ ﻣﻌﻨﺎ ﺑﺎﺷﺪ ﮐﻪ ﺁﻥ ﺧﺮﻭﺟﯽ ﺑﺎﻳﺪ ﺗـﺎ ﭘﺎﻳـﺎﻥ ﺯﻣـﺎﻥ ﺍﺧﺘﺼـﺎﺹ ﻳﺎﻓﺘـﻪ ﺑـﻪ ﺁﻥ ‪ ،‬ﺩﺭ‬
‫ﺣﺎﻟﺖ ﻓﻌﺎﻝ ﻗﺮﺍﺭ ﺩﺍﺷﺘﻪ ﺑﺎﺷﺪ ‪ .‬ﭘﺲ ﺍﺯ ﻃﯽ ﺷﺪﻥ ﺯﻣﺎﻥ ﻣﻮﺭﺩ ﻧﻈﺮ ﻧﻴﺰ ﻓﻠﮓ ﻣﺮﺑﻮﻃﻪ ﺭﻳﺴﺖ ﻭ ﺧﺮﻭﺟـﯽ ﻏﻴـﺮ‬
‫ﻓﻌﺎﻝ ﻣﯽ ﺷﻮﺩ ﻭ ﺑﺮﻧﺎﻣﻪ ﺩﺭ ﺍﻧﺘﻈﺎﺭ ﻓﺮﻣﺎﻥ ﺑﻌﺪﯼ ﺑﺮﺍﯼ ﻓﻌﺎﻝ ﮐﺮﺩﻥ ﺧﺮﻭﺟﯽ ﻗﺮﺍﺭ ﻣﯽ ﮔﻴﺮﺩ ‪.‬‬
‫ﻣﺎﺩﺍﻣﯽ ﮐﻪ ﻓﻠﮓ ﻣﺮﺑﻮﻁ ﺑﻪ ﻳﮏ ﺧﺮﻭﺟﯽ ﺳﺖ ﺑﺎﺷﺪ ‪ ،‬ﻣﺤﺎﺳﺒﺎﺕ ﺯﻣﺎﻧﯽ ﻣﺮﺑﻮﻁ ﺑﻪ ﺁﻥ ﺍﻧﺠﺎﻡ ﻣﯽ ﺷﻮﺩ ﺗـﺎ ﻫـﺮ‬
‫ﺯﻣﺎﻥ ﮐﻪ ﺗﺎﺧﻴﺮ ﻣﻮﺭﺩ ﻧﻈﺮ ﺳﭙﺮﯼ ﺷﺪ ‪ ،‬ﻓﻠﮓ ﺭﻳﺴﺖ ﻭ ﺧﺮﻭﺟﯽ ﻏﻴﺮ ﻓﻌﺎﻝ ﺷﻮﺩ ‪ .‬ﺍﻣﺎ ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐـﻪ‬
‫ﺩﺭ ﺣﻴﻦ ﻓﻌﺎﻝ ﺑﻮﺩﻥ ﻳﮏ ﺧﺮﻭﺟﯽ ‪ ،‬ﺧﺮﻭﺟﯽ ﻫﺎﯼ ﺩﻳﮕﺮ ﻧﻴﺰ ﻣﯽ ﺗﻮﺍﻧﻨﺪ ﻓﻌﺎﻝ ﻳـﺎ ﻏﻴـﺮ ﻓﻌـﺎﻝ ﺷـﻮﻧﺪ ‪ .‬ﺑﻨـﺎﺑﺮﺍﻳﻦ‬
‫ﻻﺯﻡ ﺍﺳﺖ ﺗﺎ ﻫﺮ ﺧﺮﻭﺟﯽ ﻳﮏ ﺛﺎﻧﻴﻪ ﺷﻤﺎﺭ ﻭ ﻳﮏ ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﻣﺨﺘﺺ ﺑﻪ ﺧـﻮﺩ ﻧﻴـﺰ ﺩﺍﺷـﺘﻪ ﺑﺎﺷـﺪ ﺗـﺎ ﺑﺘـﻮﺍﻥ‬
‫ﻣﺤﺎﺳﺒﺎﺕ ﺯﻣﺎﻧﯽ ﻫﺮ ﮐﺪﺍﻡ ﺭﺍ ﺑﻪ ﺻﻮﺭﺕ ﺟﺪﺍﮔﺎﻧﻪ ﺍﻧﺠﺎﻡ ﺩﺍﺩ ‪ .‬ﺍﻳﻦ ﺛﺎﻧﻴﻪ ﻭ ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﻫـﺎ ﺩﻗﻴﻘـﺎ ﺯﻣـﺎﻧﯽ ﮐـﻪ‬

‫‪۲‬‬
‫‪www.Ir-micro.com‬‬ ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ ‪ ،‬ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬
‫ﮐﻠﻴﺪ ﻭﺭﻭﺩﯼ ﻣﺮﺑﻮﻃﻪ ﺯﺩﻩ ﺷﻮﺩ ‪ ،‬ﻣﻘﺎﺩﻳﺮ ﺛﺎﻧﻴﻪ ﻭ ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﻣﺮﺟﻊ ﺳﻴﺴﺘﻢ ﺭﺍ ﺩﺭ ﺧﻮﺩ ﺫﺧﻴﺮﻩ ﻣﯽ ﮐﻨﻨﺪ ﺗـﺎ‬
‫ﺑﺘﻮﺍﻥ ﺯﻣﺎﻥ ﺯﺩﻩ ﺷﺪﻥ ﮐﻠﻴﺪ ﺭﺍ ﺑﻪ ﺍﻳﻦ ﻭﺳﻴﻠﻪ ﺗﻌﻴﻴﻦ ﮐﺮﺩ ‪ .‬ﺩﺭ ﺍﺩﺍﻣﻪ ﺑﺎ ﻣﻘﺎﻳﺴﺔ ﺯﻣﺎﻥ ﺣـﺎﻝ ﺳﻴﺴـﺘﻢ ﻭ ﺯﻣـﺎﻥ‬
‫ﺯﺩﻩ ﺷﺪﻥ ﮐﻠﻴﺪ ‪ ،‬ﻣﯽ ﺗﻮﺍﻥ ﺗﻌﻴﻴﻦ ﻧﻤﻮﺩ ﮐﻪ ﭼﻪ ﻣﻘﺪﺍﺭ ﺍﺯ ﺗﺎﺧﻴﺮ ﻣﻮﺭﺩ ﻧﻈﺮ ﺳﭙﺮﯼ ﺷﺪﻩ ﺍﺳـﺖ ﮐـﻪ ﺍﮔـﺮ ﺗـﺎﺧﻴﺮ‬
‫ﮐﺎﻣﻞ ﺳﭙﺮﯼ ﺷﺪﻩ ﺑﻮﺩ ‪ ،‬ﻓﻠﮓ ﻭ ﺧﺮﻭﺟﯽ ﻏﻴﺮ ﻓﻌﺎﻝ ﻣﯽ ﺷﻮﻧﺪ ‪.‬‬
‫ﻋﻤﻞ ﻣﻘﺎﻳﺴﻪ ﺯﻣﺎﻧﯽ ﺑﻪ ﺍﻳﻦ ﺻﻮﺭﺕ ﺍﻧﺠﺎﻡ ﻣﯽ ﺷﻮﺩ ﮐﻪ ﺯﻣﺎﻥ ﺣﺎﻝ ﻭ ﻫﻤﭽﻨﻴﻦ ﺯﻣﺎﻥ ﺯﺩﻩ ﺷﺪﻥ ﮐﻠﻴﺪ ﺑﻪ ﺛﺎﻧﻴـﻪ‬
‫ﻣﺤﺎﺳﺒﻪ ﻣﯽ ﺷﻮﺩ )ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﺿﺮﺏ ﺩﺭ ‪ + ۶۰‬ﺛﺎﻧﻴﻪ ﺷﻤﺎﺭ( ﻭ ﺳﭙﺲ ﺍﺯ ﻫﻢ ﮐﻢ ﻣﯽ ﺷﻮﻧﺪ ؛ ﺍﮔﺮ ﺍﻳﻦ ﻣﻘﺪﺍﺭ ﺑﺎ‬
‫ﻣﻘﺪﺍﺭ ﺗﺎﺧﻴﺮ ﻣﻮﺭﺩ ﻧﻈﺮ )ﺑﻪ ﺛﺎﻧﻴﻪ( ﺑﺮﺍﺑﺮ ﺑﻮﺩ ‪ ،‬ﺑﻪ ﻣﻌﻨﺎﯼ ﺳﭙﺮﯼ ﺷﺪﻥ ﺯﻣﺎﻥ ﺗﺎﺧﻴﺮ ﻣﻮﺭﺩ ﻧﻈﺮ ﺍﺳﺖ ‪.‬‬
‫ﺗﻨﻬﺎ ﺣﺎﻟﺖ ﺧﻄﺎﻳﻲ ﮐﻪ ﺍﺗﻔﺎﻕ ﻣﻴﻔﺘﺪ ﺑﺮﺍﯼ ﺯﻣﺎﻧﯽ ﺍﺳﺖ ﮐﻪ ﻣﻌﺎﺩﻝ ﺯﻣﺎﻥ ﺳﻴﺴﺘﻢ )ﺑـﻪ ﺛﺎﻧﻴـﻪ( ‪ ،‬ﺍﺯ ﻣﻌـﺎﺩﻝ ﺯﻣـﺎﻥ‬
‫ﺯﺩﻩ ﺷﺪﻥ ﮐﻠﻴﺪ )ﺑﻪ ﺛﺎﻧﻴﻪ( ﮐﻤﺘﺮ ﺑﺎﺷﺪ ‪ .‬ﺑﻪ ﻃﻮﺭ ﻣﺜﺎﻝ ﮐﻠﻴﺪ ﺩﺭ ﺯﻣﺎﻥ ‪ ۵۹‬ﺩﻗﻴﻘﻪ ﻭ ‪ ۳۰‬ﺛﺎﻧﻴـﻪ ﺯﺩﻩ ﻣـﯽ ﺷـﻮﺩ ﻭ‬
‫ﺯﻣﺎﻥ ﺳﻴﺴﺘﻢ ﻧﻴﺰ ‪ ۵‬ﺩﻗﻴﻘﻪ ﻭ ‪ ۳۰‬ﺛﺎﻧﻴﻪ ﺭﺍ ﻧﺸﺎﻥ ﻣﯽ ﺩﻫﺪ ﻭ ﻣﺪﺕ ﺯﻣﺎﻥ ﺗﺎﺧﻴﺮ ﺑﺮﺍﯼ ﺁﻥ ﺧﺮﻭﺟﯽ ﻧﻴـﺰ ‪ ۶‬ﺩﻗﻴﻘـﻪ‬
‫ﺍﺳﺖ ؛ ﺩﺭ ﺍﻳﻦ ﺣﺎﻟﺖ ﺑﺎﻳﺪ ﺧﺮﻭﺟﯽ ﻣﻮﺭﺩ ﻧﻈﺮ ﻏﻴﺮ ﻓﻌﺎﻝ ﺷﻮﺩ ‪ ،‬ﺍﻣﺎ ﺑﻪ ﺩﻟﻴﻞ ﮐﻮﭼﮑﺘﺮ ﺑﻮﺩﻥ ﺯﻣـﺎﻥ ﺳﻴﺴـﺘﻢ ﺍﺯ‬
‫ﺯﻣﺎﻥ ﮐﻠﻴﺪ ‪ ،‬ﺣﺎﺻﻞ ﺗﻔﺮﻳﻖ ﺫﮐﺮ ﺷﺪﻩ ﻣﻨﻔﯽ ﻭ ﻏﻴﺮ ﻓﻌﺎﻝ ﺷﺪﻥ ﺧﺮﻭﺟﯽ ﺍﻧﺠﺎﻡ ﻧﺨﻮﺍﻫﺪ ﺷﺪ ‪ .‬ﺩﺭ ﺍﻳـﻦ ﺷـﺮﺍﻳﻂ‬
‫ﻗﺒﻞ ﺍﺯ ﻋﻤﻞ ﺗﻔﺮﻳﻖ ‪ ،‬ﺣﺎﻟﺖ ﺧﻄﺎ ﭼﮏ ﻣﯽ ﺷﻮﺩ ﮐﻪ ﺍﮔﺮ ﺍﻳﻦ ﺣﺎﻟﺖ ﺑﺮ ﻗﺮﺍﺭ ﺑـﻮﺩ ‪ ۶۰‬ﺩﻗﻴﻘـﻪ ﺑـﻪ ﺯﻣـﺎﻥ ﺳﻴﺴـﺘﻢ‬
‫ﺍﺿﺎﻓﻪ ﺧﻮﺍﻫﺪ ﺷﺪ ﺗﺎ ﻣﺎﻧﻊ ﺑﺮﻭﺯ ﺧﻄﺎ ﺷﻮﺩ )‪ ۳۶۰۰‬ﺛﺎﻧﻴﻪ( ‪.‬‬

‫ﺯﻳﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎﯼ ﺑﻪ ﮐﺎﺭ ﺭﻓﺘﻪ ‪:‬‬


‫‪ : MAIN‬ﺯﻳﺮ ﺑﺮﻧﺎﻣﻪ ﺍﺻﻠﯽ ﻭ ﻫﻤﭽﻨﻴﻦ ﻓﺮﺍﺧﻮﺍﻥ ﺯﻳﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎﯼ ﻣﺮﺑﻮﻁ ﺑﻪ ﭼﮏ ﮐﺮﺩﻥ ﮐﻠﻴﺪ ﻫﺎ ﻭ ﻣﺤﺎﺳﺒﺎﺕ‬
‫ﺯﻣﺎﻧﯽ ﺧﺮﻭﺟﯽ ﻫﺎ ‪.‬‬
‫‪ : SCAN‬ﺯﻳﺮ ﺑﺮﻧﺎﻣﻪ ﭼﮏ ﮐﺮﺩﻥ ﮐﻠﻴﺪ ﻫﺎ‬
‫‪ : INT‬ﺯﻳﺮ ﺑﺮﻧﺎﻣﻪ ﺳﺮﻳﺰ ﺗﺎﻳﻤﺮ ﻭ ﺷﻤﺎﺭﺷﮕﺮ ﺯﻣﺎﻥ ﺳﻴﺴﺘﻢ‬
‫‪ : DEVICE_0~7‬ﺯﻳﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎﯼ ﻣﺤﺎﺳﺒﺎﺕ ﺯﻣﺎﻥ ﺑﺮﺍﯼ ﻫﺮ ﮐﺪﺍﻡ ﺍﺯ ﺧﺮﻭﺟﯽ ﻫﺎ‬

‫ﻣﺘﻐﻴﺮ ﻫﺎﯼ ﺑﻪ ﮐﺎﺭ ﺭﻓﺘﻪ ‪:‬‬


‫‪ : SYSTEM_MINUTE‬ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﺳﻴﺴﺘﻢ‬
‫‪ : SYSTEM_SECOND‬ﺛﺎﻧﻴﻪ ﺷﻤﺎﺭ ﺳﻴﺴﺘﻢ‬
‫]‪ : MINUTE[x‬ﺩﻗﻴﻘﻪ ﺷﻤﺎﺭ ﻣﺮﺑﻮﻁ ﺑﻪ ﺧﺮﻭﺟﯽ ‪x‬‬
‫]‪ : SECOND[x‬ﺛﺎﻧﻴﻪ ﺷﻤﺎﺭ ﻣﺮﺑﻮﻁ ﺑﻪ ﺧﺮﻭﺟﯽ ‪x‬‬
‫]‪ : FLAG[x‬ﻓﻠﮓ ﻣﺮﺑﻮﻁ ﺑﻪ ﺧﺮﻭﺟﯽ ‪x‬‬
‫‪ TEMP_1‬ﻭ ‪ : TEMP_2‬ﻣﺘﻐﻴﺮ ﻫﺎﯼ ﻣﻮﻗﺘﯽ ﺑﺮﺍﯼ ﻣﺤﺎﺳﺒﺎﺕ ﺯﻣﺎﻧﯽ‬

‫‪ DELAY_x‬ﻫﻢ ﺛﺎﺑﺖ ﺗﻌﺮﻳﻒ ﺷﺪﻩ ﺟﻬﺖ ﺗﻌﻴﻴﻦ ﺯﻣﺎﻥ ﺗﺎﺧﻴﺮ ﺑﺮﺍﯼ ﺧﺮﻭﺟﯽ ‪ x‬ﺍﺳﺖ ‪.‬‬
‫ﺩﺭ ﺍﺩﺍﻣﻪ ﺑﺮﻧﺎﻣﻪ ﮐﺎﺭﯼ ﻭ ﺷﻤﺎﺗﻴﮏ ﻣﺪﺍﺭ ﻗﺎﺑﻞ ﻣﺸﺎﻫﺪﻩ ﺍﺳﺖ ‪:‬‬

‫‪DEFINE OSC 20‬‬


‫‪۳‬‬
‫‪www.Ir-micro.com‬‬ ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ ‪ ،‬ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬
INTCON=%11000000
PIE1.0=1
PIR1.0=0
ON INTERRUPT GOTO INT
T1CON=%00001111
TRISC=0
TRISB=0
TRISD=$FF
PORTB=0
TRISA.0=0
SYSTEM_MINUTE VAR BYTE
SYSTEM_SECOND VAR BYTE
MINUTE VAR BYTE[8]
SECOND VAR BYTE[8]
FLAG VAR BIT[8]
TEMP_1 VAR WORD
TEMP_2 VAR WORD
DELAY_0 CON 5
DELAY_1 CON 10
DELAY_2 CON 15
DELAY_3 CON 20
DELAY_4 CON 25
DELAY_5 CON 30
DELAY_6 CON 60
DELAY_7 CON 120
CLEAR

MAIN:
GOSUB SCAN
IF FLAG[0]=1 THEN GOSUB DEVICE_0
IF FLAG[1]=1 THEN GOSUB DEVICE_1
IF FLAG[2]=1 THEN GOSUB DEVICE_2
IF FLAG[3]=1 THEN GOSUB DEVICE_3
IF FLAG[4]=1 THEN GOSUB DEVICE_4
IF FLAG[5]=1 THEN GOSUB DEVICE_5
IF FLAG[6]=1 THEN GOSUB DEVICE_6
IF FLAG[7]=1 THEN GOSUB DEVICE_7
GOTO MAIN
END

SCAN :
IF PORTD.0=1 THEN
MINUTE[0]=SYSTEM_MINUTE : SECOND[0]=SYSTEM_SECOND
FLAG[0]=1 : PORTB.0=1 : PAUSE 150
ENDIF
IF PORTD.1=1 THEN
MINUTE[1]=SYSTEM_MINUTE : SECOND[1]=SYSTEM_SECOND
FLAG[1]=1 : PORTB.1=1 : PAUSE 150
ENDIF
IF PORTD.2=1 THEN
MINUTE[2]=SYSTEM_MINUTE : SECOND[2]=SYSTEM_SECOND
FLAG[2]=1 : PORTB.2=1 : PAUSE 150
ENDIF

۴
www.Ir-micro.com ‫ ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬، ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ‬
IF PORTD.3=1 THEN
MINUTE[3]=SYSTEM_MINUTE : SECOND[3]=SYSTEM_SECOND
FLAG[3]=1 : PORTB.3=1 : PAUSE 150
ENDIF
IF PORTD.4=1 THEN
MINUTE[4]=SYSTEM_MINUTE : SECOND[4]=SYSTEM_SECOND
FLAG[4]=1 : PORTB.4=1 : PAUSE 150
ENDIF
IF PORTD.5=1 THEN
MINUTE[5]=SYSTEM_MINUTE : SECOND[5]=SYSTEM_SECOND
FLAG[5]=1 : PORTB.5=1 : PAUSE 150
ENDIF
IF PORTD.6=1 THEN
MINUTE[6]=SYSTEM_MINUTE : SECOND[6]=SYSTEM_SECOND
FLAG[6]=1 : PORTB.6=1 : PAUSE 150
ENDIF
IF PORTD.7=1 THEN
MINUTE[7]=SYSTEM_MINUTE : SECOND[7]=SYSTEM_SECOND
FLAG[7]=1 : PORTB.7=1 : PAUSE 150
ENDIF
RETURN

INT:
DISABLE
SYSTEM_SECOND=SYSTEM_SECOND+1
IF SYSTEM_SECOND=60 THEN
SYSTEM_SECOND=0
SYSTEM_MINUTE=SYSTEM_MINUTE+1
ENDIF
IF SYSTEM_MINUTE=60 THEN SYSTEM_MINUTE=0
TMR1H=TMR1H+$80
PIR1.0=0
RESUME
ENABLE

DEVICE_0:
TEMP_1=(MINUTE[0]*60)+SECOND[0]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_0 THEN PORTB.0=0 : FLAG[0]=0
RETURN

DEVICE_1:
TEMP_1=(MINUTE[1]*60)+SECOND[1]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_1 THEN PORTB.1=0 : FLAG[1]=0
RETURN

DEVICE_2:
TEMP_1=(MINUTE[2]*60)+SECOND[2]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND

۵
www.Ir-micro.com ‫ ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬، ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ‬
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_2 THEN PORTB.2=0 : FLAG[2]=0
RETURN

DEVICE_3:
TEMP_1=(MINUTE[3]*60)+SECOND[3]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_3 THEN PORTB.3=0 : FLAG[3]=0
RETURN

DEVICE_4:
TEMP_1=(MINUTE[4]*60)+SECOND[4]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_4 THEN PORTB.4=0 : FLAG[4]=0
RETURN

DEVICE_5:
TEMP_1=(MINUTE[5]*60)+SECOND[5]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_5 THEN PORTB.5=0 : FLAG[5]=0
RETURN

DEVICE_6:
TEMP_1=(MINUTE[6]*60)+SECOND[6]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_6 THEN PORTB.6=0 : FLAG[6]=0
RETURN

DEVICE_7:
TEMP_1=(MINUTE[7]*60)+SECOND[7]
TEMP_2=(SYSTEM_MINUTE*60)+SYSTEM_SECOND
IF TEMP_1 > TEMP_2 THEN TEMP_2=TEMP_2+3600
IF (TEMP_2 - TEMP_1) >= DELAY_7 THEN PORTB.7=0 : FLAG[7]=0
RETURN

۶
www.Ir-micro.com ‫ ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬، ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ‬
‫ﺗﻬﻴﻪ ﮐﻨﻨﺪﻩ ‪:‬‬
‫ﺣـــﺎﻣــﺪ ﻣــﻈــﺎﻫــﺮﯼ‬
‫‪Hamed.Mazaheri@Gmail.com‬‬

‫‪۷‬‬
‫‪www.Ir-micro.com‬‬ ‫ﻭﺏ ﺳﺎﻳﺖ ﺟﺎﻣﻊ ﺍﻟﮑﺘﺮﻭﻧﻴﮏ ‪ ،‬ﺑﺮﻕ ﻭ ﮐﺎﻣﭙﻴﻮﺗﺮ‬

You might also like