定時器加特殊標志位存儲器
⑴ 51單片機定時器1方式2怎麼設置為什麼TMOD=0x20(是怎麼換算得) 定時器0方式2TMOD又是多少
1、首先第一步是定時器2是新增資源,也是51單片機定時器裡面功能最強大的一個定時器。注意的是掌握好定時器2還是非常有必要的。
⑵ 關於單片機定時器設置標志位問題
明確告訴你這樣做是可以的,但是是不推薦的。所有的中斷都應盡量簡化。
檢測口是否為0完全可以放在主程序。不明白你為什麼非要隔一段時間掃描一次。唯一的可能是你計算好時間認為此時就是會為0?如果這樣你太相信CPU時鍾了。。。雖然定時器精確但是只是相對普通的循環DEALY而已,其實遠不夠精確的。
⑶ mcs-51系列單片機中的定時器/計數據有哪幾個特殊功能寄存器作用是什麼怎樣
不包含計數器本身,兩個特殊功能寄存儲器,TCON 和TMOD,TMOD用來設置工作方式,是8位還是16位,是內部計數還是對外部計數,TCON用來控制啟停及存放溢出標志。
⑷ 如何運用西門子PLC的變數存儲器及什麼程序能用到
用西門子PLC的變數存儲器V只有S7- 200中才有。相當於300中的M變數。按v1,v2,v3 位元組搞下去。
變數存儲器(V)(相當於內輔繼電器)PLC執行程序過程中,會存在一些控制過程的中間結果,這些中間數據也需要用存儲器來保存。變數存儲器就是根據這個實際的要求設計的。變數存儲器是S7-200CPU為保存中間變數數據而建立的一個存儲區,用V表示。可以按位、位元組、字、雙字四種方式來存取。(1)按「位」方式:從V0.0~I5119.7,共有40960點。CPU221、CPU222變數存儲器只有2048個位元組,其變數存儲區只能到V2047.7位。(2)按「位元組」方式:從VB0~VB5119,共有5120個位元組(3)按「字」方式:從VW0~VW5118,共有2560個字(4)按「雙字」方式:從VD0~VD5116,共有1280個雙字
(1) S7-200存儲器類型
S7-200 PLC可以採用多種形式的存儲器來進行PLC程序與數據的存儲,以防止數據的丟失。S7-200可以使用的存儲器主要有如下類型:
①RAM: CPU模塊本身帶有動態數據存儲器(RAM)。RAM用於存儲PLC的運算、處理結果等數據。根據需要,RAM的數據可以通過電容器或電池盒(選件)進行保持,但其存儲時間較短,一般只能保持幾天。
②EEPROM(或Flash ROM):除RAM外,CPU模塊本身帶有的保持型存儲器(EEPROM或Flash ROM),可以進行數據的永久性存儲。保持型存儲器用於存儲PLC用戶程序、PLC參數等重要數據;根據需要,也可以將PLC程序執行過程中所產生的局部變數V、內部標志M、定時器T、計數器C等保存在保持型存儲器中。
③存儲器卡:存儲器卡在S7-200中為可選件,用戶可以根據需要選用。存儲器卡為保持型存儲器,可以作為PLC保持型存儲器的擴展與後備,用於保存PLC用戶程序、PLC參數、變數V、內部標志M、定時器T、計數器C等。 (2)存儲器分區
S7-200的內部存儲器分為程序存儲區、數據存儲區、參數存儲區。其中,程序存儲區用於存儲PLC用戶程序;數據存儲區用於存儲PLC運算、 處理的中間結果(如輸入/輸出映像,標志、變數的狀態,計數器、定時器的中間值等);參數存儲區用於存儲PLC配置參數(包括程序保護密碼、地址分配設 定、停電保持區域的設定等)。
⑸ 一個定時器如何設定多個時間標志位
我想你大概是想如何用一個定時器同時給多個事件定時。如果是這樣的話,你可以給定時器一個基準定時,比方說100ms,然後每定時中斷一次就判斷每個事件的定時次數不就行了
⑹ MCS-51系列單片機中的定時器有哪幾個專用寄存器它們各自的作用是什麼
要講定時離不開中斷,兩者結合使用的。定時計數器主要用到TMOD工作模式寄存器,TCON定時器的控制寄存器,EA中斷允許控制寄存器,IP中斷優先順序寄存器 定時器控制寄存器TCON (88H)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONTF0/TF1:定時器0/定時器1溢出中斷申請標志位: =0:定時器未溢出; =1:定時器溢出申請中斷,進中斷後自動清零。TR0/TR1:定時器運行啟停控制位: =0:定時器停止運行; =1:定時器啟動運行。TCON:Timer控制寄存器,是管理定時器工作的SFR(其中低4位管外部中斷)定時器控制寄存器TCON (88H)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONIE0/IE1:外部中斷申請標志位: =0:沒有外部中斷申請; =1:有外部中斷申請。IT0/IT1:外部中斷請求的觸發方式選擇位: =0:在INT0/INT1端申請中斷的信號低電平觸發; =1:在INT0/INT1端申請中斷的信號負跳變觸發.TCON:Timer控制寄存器,低4位管理外部中斷�8�4在CPU已經開放了外部中斷允許的前提下:�8�4在INT0/INT1引腳輸入一個負脈沖或低電平, �8�4TCON寄存器中的IE0/IE1標志位自動變「1」, 檢測到IE0/IE1變「1」後,將產生指令:執行中斷服務程序,�8�4並將IE0/IE1標志位自動清「0」,以備下次申請。外部中斷(INT0,INT1)申請過程 單片機的定時/計數器定時器計數器的概念一、計數的概念
選票:畫「正」。這就是計數,生活中計數的例子處處可見。比如一個水盆在水龍頭下,水龍沒關緊,水一滴滴地滴入盆中。水滴持續落下,盆的容量是有限的,過一段時間之後,水就會逐漸變滿。51單片機中有兩個計數器,分別稱之為T0和T1,這兩個計數器分別是由兩個8位的RAM單元組成的,即每個計數器都是16位的計數器,最大的計數量是65536。
二、定時
計數器是如何作為定時器來用的呢?比如一個鬧鍾,將它定時在1個小時後響鬧,我們也能說成是秒針走了(3600)次,所以時間就轉化為秒針走的次數的,也就是計數的次數了,可見,計數的次數和時間之間十分相關。那麼它們的關系是什麼呢?也就是秒針每一次走動的時間要正好是1秒。
只要計數脈沖的間隔相等,則計數值就代表了時間的流逝。由此,單片機中的定時器和計數器是同一個東西,只不過計數器是記錄的外部的觸發脈沖,而定時器則是由單片機供給一個非常穩定的計數源。供給定時器的是計數源是機器周期也就是由單片機的晶體震盪器經過12分頻後獲得的一個脈沖源(機器周期)。晶振的頻率是很准確的,所以這個計數脈沖的時間間隔也很准。一個12M的晶振,它供給給計數器的脈沖時間間隔是1微秒。計數脈沖的間隔與晶振有關,12M的晶振,計數脈沖的間隔是1微秒。這是邏輯圖,可以看到T1是一個單刀雙擲開關,說明定一個定時/計數器同一時刻要麼作定時用,要麼作計數用,不能同時用;接通T1引腳時作為外部計數用。(T0的引腳是P3.4,T1的引腳是P3.5)。
比如滴水的例子,當水持續落下,盆中的水逐漸變滿,最終會有一滴水使得盆中的水全滿了。這個時候如果再有一滴水落下,水會漫出來,用術語來講就是「溢出」,而每一滴水落下,用術語來說就是發出一個計數脈沖。 水溢出是流到地上,而計數器溢出後就會引發一個定時中斷事件,就象定時的時間一到,鬧鍾就會響一樣。 現在另一個問題是:要有多少個計數脈沖才會產生事件。 剛才已研究過,計數器的容量是16位,也就是最大的計數值到65536,因此計數計到65536就會產生溢出。這個沒有問題,問題是我們現實生活中,經常會有少於65536個計數值的要求,如制葯廠包裝線上,一瓶葯片為100粒,500瓶為一箱 那麼怎麼樣來滿足這個要求呢?舉例 如果是一個空的水盆要1萬滴水滴進去才會滿,我在開始滴水之前就先放入一勺水,還需要10000滴嗎?對了,這時我們就採用預置數的辦法,我要計 100,那我就先放進65436,再來100個脈沖,不就到了65536了嗎。定時也是如此,每個脈沖是1微秒,則計滿65536個脈沖需時65.536 毫秒,但現在我只要10毫秒,怎麼辦?10個毫秒為10000個微秒,所以,只要在計數器裡面放進55536就可以了。溢出的概念和設置任意定時計數的方法3個16位定時器/計數器 ——(51系列有2個16位Timer少一個T2)定時器:對片內機器時鍾(周期方波)進行計數計數器:對Tx引腳輸入的負脈沖進行計數與Timer工作有關的特殊功能寄存器: TCON 和 TMODAT89S52單片機的定時器/計數器單片機定時/計數器內部結構單片機定時/計數器內部結構圖定時器的2個特殊功能寄存器(TCON)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0定時器控制寄存器TCON (88H)TF0/TF1: 定時器0/1計數溢出標志位。 =1 計數溢出; =0 計數未滿 TF0/TF1標志位可用於申請中斷或供CPU查詢。 在進入中斷服務程序時會自動清零;但在 查詢方式時必須軟體清零。TR0/TR1: 定時器0/1運行控制位。 =1 啟動計數; =0 停止計數TR0/TR1:定時器0/1運行控制位: TR0/TR1 =0 時,Timer0/1停止計數 TR0/TR1 =1 時,Timer0/1啟動計數定時器T0/T1 中斷申請過程�8�4 在已經開放T0/T1中斷允許且已被啟動的前提下:�8�4 T0/T1加滿溢出時 TF0/TF1標志位自動置「1」 �8�4 檢測到TCON中TF0/TF1變「1」後,將產生指令: 執行中斷服務程序,�8�4 TF0/TF1標志位會自動清「0」,以備下次中斷申請。 定時/計數器可按片內機器周期定時,也可對由T0/T1引腳輸入一個負脈沖進行加法計數TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCON (88H)GATE C / T M1 M0 GATE C / T M1 M0定時器方式寄存器TMOD (89H)T1T0M1,M0:工作方式定義位 ( 定義4 種方式 ):C/T :計數器/定時器選擇位 = 1 外部事件計數器。對T0/T1引腳的負脈沖計數; = 0 片內時鍾定時器。對機器周期脈沖計數定時0 0:13位 定時器——幾乎不用0 1:16位 定時器——經常用到1 0:可自動重裝的 8位 定時器——經常用到1 1:T0 分為2個8位 Timer;T1 此時不工作 ——幾乎不用GATE C / T M1 M0 GATE C / T M1 M0T1T0GATE門控位: Timer可由軟體與硬體兩者控制 �8�4 GATE = 0 ——普通用法 Timer的啟/停由軟體對TRx位寫「1」/「0」控制定時器方式寄存器TMOD(89H)�8�4 GATE = 1 ——門控用法 Timer的啟/停由軟體對TR0/TR1位寫「1」/「0」 和在INT0/INT1引腳上出現的信號的高/低共同控制GATE=0時,定時/計數是否工作,只取決於TR0是否為1。GATE=1,只有TR0為1,且INT0管腳也是高電平,定時/計數才工作。 從電路上看到GATE是一個非門,它與INTx組成一個或門,這個或門與TR0又組成一個與門。當GATE=0時,則~GATE=1(非門),此時無論INT0為高或低,它們相或之後必然為1,此時只要TR0=1,則工作,TR0=0則不工作,不受INT0的影響。當GATE=1時,~GATE=0,則INT0=1時,它們相或為1,此時定時器是否工作受TR0影響;若INT0=0,則無論TR0為什麼,定時器都不能工作,即當GATE=0時,定時器受INT0和TR0共同的作用。 所以,GATE位的狀態決定定時器運行控製取決於TR0的一個條件還是TR0和INT0引腳這兩個條件。當GATE=1時,由於GATE信號封鎖了與門,使引腳 INT0信號無效。而這時候如果TR0=1,則接通模擬開關,使計數器進行加法計數,即定時/計數工作。而TR0=0,則斷開模擬開關,停止計數,定時 /計數不能工作。 當GATE=0時,與門的輸出端由TR0和INT0電平的狀態確定,此時如果TR0=1,INT0=1與門輸出為1,允許定時/計數器計數,在這 種情況下,運行控制由TR0和INT0兩個條件共同控制,TR0是確定定時/計數器的運行控制位,由軟體置位或清「0」。振盪器�8�112TLx THx (8位) (8位)TFx申請中斷Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制 開關或門與門非門定時器結構與工作方式工作方式1:——16位的定時/計數器在工作方式1下,計數器的計數值范圍是: 1~65536(216)
當為定時工作方式1時,定時時間的計算公式為:
(216—計數初值)╳晶振周期╳12或 (216—計數初值)╳機器周期
其時間單位與晶振周期或機器周期相同。
�8�4 THx/TLx賦初值:THx賦高8位,TLx賦低8位工作方式1 的編程要點: �8�4 TMOD選方式: 寫「M1,M0」=01 選方式1�8�4 若不用門控位,直接用軟體寫TRx控制啟/停�8�4 若使用門控位,先置位TRx,然後由INTx端 的高/低電平來控制其啟/停�8�4 若要允許中斷,還須先置位ETx、EA等中斷 允許控制位,並編寫中斷服務程序�8�4 若不用中斷,可查詢「計數溢出標志TFx」 的方式工作,但溢出標志TFx須軟體清0工作方式2:——8 位自動重裝的定時/計數器振盪器�8�112TLx (8位)TFx申請中斷Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制 =1開關接通或門與門THx (8位)溢出位門開�7�4 THx/TLx賦相同初值 在TLx計數達到0FFH 再加「1」時,TL0 將溢出,進位位直接進入「TFx」去申請 中斷,同時打開三態門,使THx中的值 自動重裝(Copy)進TLx工作方式 2 的編程:�7�4 TMOD寄存器選方式: 寫「M1,M0」 = 10選中方式2�7�4 其他用法與各種方式1完全相同T0: 組織成TL0和TH0兩個8位定時/計數器Timer工作方式 3 ——幾乎無用T1: 不再是定時/計數器了 T1 的TR1和TF1出借給TH0當控制位使用, 剩下的TH1/TL1寄存器只能當作普通寄存 器用。振盪器�8�112TL0 (8位)TF0申請中斷T0端TR0位GATE位INT0端≥1&C/T=0C/T=1控制 =1開關接通或門與門TH0 (8位)TF1申請中斷TR1位控制 =1Timer工作方式 3 結構:�7�4T0成為雙 8位Timer �7�4T1不再有Timer功能 �7�4TF1,TR1出借給TH0 定時器小結: (2個16位加法計數器)�7�4運行/停止由TRx位控制,(當GATE=1時: 由TRx位和Tx引腳上的信號共同控制)�7�4工作方式由TMOD決定; 計數/定時由C/T位決定 工作方式0(13位) 永遠不用 工作方式3(T0拆為雙8位) 幾乎無用 工作方式1(16位) 經常用到 工作方式2(8位自動重裝) 經常用到�7�4從初值按機器周期或外部脈沖遞加,溢出位 TFx申請中斷;中斷允許由ETx位和EA位控制,定時器/計數器的定時/計數范圍 工作方式0:13位定時/計數方式,因此,最多能計到2的13次方,也就是8192次。 工作方式1:16位定時/計數方式,因此,最多能計到2的16次方,也就是65536次。 工作方式2和工作方式3,都是8位的定時/計數方式,因此,最多能計到2的8次方,也說是256次。 預置值計算:用最大計數量減去需要的計數次數即可
⑺ 單片機 TCON 每一位:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 表示什麼意思0或1代表什麼謝謝,百度百科都沒
這里TF、TR、IE、IT後面跟的0和1是對單片機寄存器中位的命名,因為有兩個定時/計數器、兩個中斷,所以用0、1來區分。
各位的定義如下:
TF1、TF0:分別是定時器1、定時器0的溢出標志位。當定時器x計滿溢出時,由硬體使TFx位置「1」,並申請中斷。進入中斷服務程序後,由硬體自動清「0」,在查詢方式下用軟體清「0」。
TR1、TR0:分別是定時器1、定時器0的運行控制位。由軟體清「0」關閉定時器。當GATE=1,且INTx為高電平時,TR置「1」啟動定時器;當GATE=0,TRx置「1」啟動定時器。
IE1、IE0:分別為外部中斷1、外部中斷0的請求標志位。
IT1、IT0:分別為外部中斷1、外部中斷0的觸發方式選擇位。當ITx=0,為低電平觸發方式;當ITx=1,為下降沿觸發方式。
(7)定時器加特殊標志位存儲器擴展閱讀:
TCON初始化:
1、確定工作方式(即對TMOD賦值);
2、預置定時或計數的初值(可直接將初值寫入TH0、TL0或TH1、TL1);
3、根據需要開放定時器/計數器的中斷(直接對IE位賦值);
4、啟動定時器/計數器(若已規定用軟體啟動,則可把TR0或TR1置「1」;若已規定由外中斷引腳電平啟動,則需給外引腳加啟動電平。當實現了啟動要求後,定時器即按規定的工作方式和初值開始計數或定時)。
⑻ 怎麼使用STC89c52的第三個定時器,要設置哪幾個特殊功能寄存器
/*AT89S52和STC單片機引腳是通用的,程序可以直接移植
晶振:12MHZ
引腳連接方式見下面定義,該程序經過我仔細調試,只要連接上即可直接運行,*/
#include<reg52.H>
#define seg_data P1 //數碼管顯示數據輸出埠
sbit K1 = P3^0; //按鍵引腳定義
sbit K2 = P3^1;
sbit K3 = P3^2;
sbit bit1 = P2^0; //數碼管位選通埠定義
sbit bit2 = P2^1;
sbit bit3 = P2^2;
/*共陽數碼管0-9 */
const unsigned char seg[10]=;
unsigned char seg_data1=0,seg_data2=0,seg_data3=0,delaytime=0;
struct boolean_variable //定義布爾型變數,每個變數只佔用一個bit RAM
{
char a :1;
char b :1;
char c :1;
char d :1;
char e :1;
char f :1;
}variable1;
/******************************************************************************
定時器初始化
******************************************************************************/
void time0_time1_initialize()
{
TMOD=0X11; //T0模式1,T1模式1 相當於00010001B
ET0=1; //T0開中斷
ET1=1; //T1開中斷
PT0=1; //T0為高優先順序
PT1=0; //T1為低優先順序
EA=1; //中斷總開關打開
TH1=0XF8; ////T1裝入初值,實現2ms定時
TL1=0X30;
TH0=0X3c; //T0裝入初值,實現50ms定時
TL0=0Xb0;
TR1=1; //開啟T1
}
#define bit1_shanshuo variable1.c
#define bit2_shanshuo variable1.d
#define bit3_shanshuo variable1.e
#define jishu_key variable1.f
/******************************************************************************
動態掃描顯示程序
******************************************************************************/
unsigned char judge_segdata=1;
void seg_display()
{
if (jishu_key == 1)
{
if (judge_segdata > 6)
judge_segdata =1;
switch (judge_segdata)
{
case 1: seg_data=seg[seg_data1];bit1 = 1;break;
case 2: seg_data=seg[seg_data1];bit1 = 0;break;
case 3: seg_data=seg[seg_data2];bit2 = 1;break;
case 4: seg_data=seg[seg_data2];bit2 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 1;break;
case 6: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (jishu_key == 0)
{
if (judge_segdata >200)
judge_segdata =1;
if (bit1_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data1];bit1 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data1];bit1 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data2];bit2 = 1;bit1 = 0;break;
case 3: seg_data=seg[seg_data2];bit2 = 0;break;
case 4: seg_data=seg[seg_data3];bit3 = 1;bit1 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 0;break;
case 6: seg_data=seg[seg_data2];bit2 = 1;bit1 = 0;break;
case 7: seg_data=seg[seg_data2];bit2 = 0;break;
case 8: seg_data=seg[seg_data3];bit3 = 1;bit1 = 0;break;
case 9: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (bit2_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data2];bit2 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data2];bit2 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data1];bit1 = 1;bit2 = 0;break;
case 3: seg_data=seg[seg_data1];bit1 = 0;break;
case 4: seg_data=seg[seg_data3];bit3 = 1;bit2 = 0;break;
case 5: seg_data=seg[seg_data3];bit3 = 0;break;
case 6: seg_data=seg[seg_data1];bit1 = 1;bit2 = 0;break;
case 7: seg_data=seg[seg_data1];bit1 = 0;break;
case 8: seg_data=seg[seg_data3];bit3 = 1;bit2 = 0;break;
case 9: seg_data=seg[seg_data3];bit3 = 0;break;
}
goto S;
}
if (bit3_shanshuo == 1)
{
if (judge_segdata == 1)
{
seg_data=seg[seg_data3];bit3 = 1;
goto S;
}
if (judge_segdata == 100)
{
seg_data=seg[seg_data3];bit3 = 0;
goto S;
}
if (judge_segdata == 200)
goto S;
switch (judge_segdata%10)
{
case 2: seg_data=seg[seg_data1];bit1 = 1;bit3 = 0;break;
case 3: seg_data=seg[seg_data1];bit1 = 0;break;
case 4: seg_data=seg[seg_data2];bit2 = 1;bit3 = 0;break;
case 5: seg_data=seg[seg_data2];bit2 = 0;break;
case 6: seg_data=seg[seg_data1];bit1 = 1;bit3 = 0;break;
case 7: seg_data=seg[seg_data1];bit1 = 0;break;
case 8: seg_data=seg[seg_data2];bit2 = 1;bit3 = 0;break;
case 9: seg_data=seg[seg_data2];bit2 = 0;break;
}
}
}
S: judge_segdata++;
}
/******************************************************************************
定時計數器1的中斷服務子程序, 用於定時掃描數碼管
******************************************************************************/
unsigned char dc1=1;
void time1_interrupt() interrupt 3 using 2
{
TH1=0XF8; //T1重新裝入初值
TL1=0X30;
dc1++;
if (dc1 == 100) //200ms到了?數碼管計數加1
{
dc1 = 0;
if (jishu_key == 1)
{
seg_data1++;
if (seg_data1 == 10)
{
seg_data1 = 0;
seg_data2++;
}
if (seg_data2 == 10)
{
seg_data2 = 0;
seg_data3++;
}
if (seg_data3 == 10)
seg_data3 = 0;
}
}
seg_display();
}
#define second variable1.a
static unsigned char dc2=0;
/******************************************************************************
定時計數器0的中斷服務子程序, 用於定時掃描數碼管
******************************************************************************/
void time0_interrupt() interrupt 1 using 3
{
TH0=0X3c; //T0裝入初值,繼續50ms定時
TL0=0Xb0;
dc2++; //50ms計數變數加1
if (dc2 == delaytime) //2s到了?
{
second = 1; //布爾型變數second置位
dc2=0;
}
}
/******************************************************************************
延時程序
******************************************************************************/
void delay(int time0)
{
unsigned char i;
for(;time0 >= 0;time0--)
{
for(i=0;i<120;i++);
}
}
/******************************************************************************
按鍵執行程序
******************************************************************************/
#define timedelay1 50
void key_function()
{
unsigned char j=0;
bit1_shanshuo = 1; //數碼管第一位閃爍
delay(500); //延時500ms
delaytime = 100 ; //定時器0 定時100*50ms = 5000ms=5s
TH0=0X3c;
TL0=0Xb0;
TR0 = 1; //開啟T0,定時5s
while(!second) //如果5秒內沒有按鍵,則按鍵設置程序返回
{
if (K1 == 0)
{
dc2 = 0; //清零T0十秒計數變數
j++;
}
if (j > 3)
j=1;
switch (j)
{
case 1:bit1_shanshuo = 1;bit2_shanshuo = 0;bit3_shanshuo = 0;break;
case 2:bit1_shanshuo = 0;bit2_shanshuo = 1;bit3_shanshuo = 0;break;
case 3:bit1_shanshuo = 0;bit2_shanshuo = 0;bit3_shanshuo = 1;break;
default: break;
}
if (K2 == 0)
{
dc2 = 0; //清零T0十秒計數變數
switch (j)
{
case 1: seg_data1++;if (seg_data1>9) seg_data1=0;break;
case 2: seg_data2++;if (seg_data2>9) seg_data2=0;break;
case 3: seg_data3++;if (seg_data3>9) seg_data3=0;break;
}
}
if (K3 == 0)
{
dc2 = 0; //清零T0十秒計數變數
switch (j)
{
case 1: seg_data1--;if (seg_data1>9) seg_data1=0;break;
case 2: seg_data2--;if (seg_data2>9) seg_data2=0;break;
case 3: seg_data3--;if (seg_data3>9) seg_data3=0;break;
}
}
delay(400); //延時400ms
}
jishu_key = 1; //數碼管繼續計數
TR0 = 0;
}
/******************************************************************************
K1鍵掃描程序
******************************************************************************/
void key_press()
{
if (K1 == 0) //key1按下?
{
jishu_key = 0; //數碼管停止計數
delaytime = 40; //定時器1定時40*50ms = 2s
TH0=0X3c;
TL0=0Xb0;
TR0 = 1; //T0開始定時
delay(10); //消除鍵盤抖動
while (!K1) //等待
{
if (second == 1)//兩秒計數變數為1?
{
TR0 = 0; //關閉T0
second = 0;
key_function();
return;
}
}
TR0 = 0;
jishu_key=1;
}
}
void main()
{
K1 = 1;
K2 = 1;
K3 = 1;
second = 0;
jishu_key = 1;
bit1_shanshuo =0;
bit2_shanshuo =0;
bit3_shanshuo =0;
time0_time1_initialize();
while(1) //不斷執行
key_press();
}
花了我一整個上午的時間,再給我70分
⑼ cpu224plc有哪些元件
1、輸入映像寄存器
2、輸出映像寄存器
3、變數存儲器V
4、內部標志位存儲器M
5、特殊標志位存儲器SM
6、局部變數存儲器L
7、定時器T
8、計數器C
9、高數計數器HC
10、累加器AC
11、順序控制繼電器S
12、模擬量輸入/輸出映像寄存器(AI/AQ)
⑽ 怎麼樣利用定時器、計數器和特殊存儲器位實現長延時
利用定時器定時或延時,其實就是利用計數器對內部時鍾信號或機器周期計數,但時間都不長。實現長延時的方法很簡單,對每一次定時計數,計數到某一個數時,即為一定時間。例如,定時器可定時20ms,每20ms到,或中斷,或查詢,並計數,計數到50次,定時的時間就是20ms×50=1000ms=1秒,再計60秒,得到1分,計60分得1小時。依此,可以實現時鍾計時。