久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2401|回復: 0
收起左側

單片機電話撥號防盜報警器程序設計

[復制鏈接]
ID:556863 發表于 2020-11-18 18:09 | 顯示全部樓層 |閱讀模式

硬件系統方案設計

圖2.1為電話撥號報警器的系統構成方框圖,由單片機控制器、鍵盤輸入、數碼管顯示、觸發電路、撥號電路及電源等6部分組成。

單片機控制器是整個系統的核心,負責控制檢測輸入/輸出顯示、模擬摘機、撥號摘機、撥號報警、掛機等一系列的程序動作。這里使用了小引腳、高性能、低價位的AT89S2052。

  鍵盤輸入電路負責輸入電片機中一系列工作參數及功能設定。

  發光二極管數碼管顯示器在整個系統工作過程中充當一個簡單的人機界面,用以顯示工作狀況及輸入/輸出的數據等。

  電話撥號防盜報警器的觸發電路用磁性開關(門磁開關),簡單可靠,也可用紅外探測器或無線門磁,以實現全方位遠距離監測。報警器應采用隱蔽安裝,防止小偷發現。

  撥號及報警電路用來完成模擬摘機、撥號、發出報警音、掛機等工作過程,它的工作由單片機控制。

  電源部分負責對整個系統供電。平時由電話線上取得工作電流并對后備電池充電,撥號報警時轉由后備電池供電。

                         圖2.1 電話撥號防盜報警器方框圖

2.1.2脈沖撥號原理

脈沖撥號是目前電話機兩種撥號方式中的一種,另一種為雙音多頻撥號方式。

脈沖撥號就是指在電話機上撥入的電話號碼以脈沖個數的形式發出,也就是說,在已經通以直流電流的回路上,利用撥號盤及發號電路將回路斷開、再接通而形成的脈沖信號,來完成輸入電話號碼的發送。在操作中,若用戶撥1,則送出1個脈沖,回路中斷一次、接通一次;撥2,則發出2個脈沖,回路斷一次、接通一次、再斷一次;……;而撥0時,則發出10個脈沖,回路斷、接通輪流10次。圖2.2為電話號碼“32”的脈沖波形。

                    圖2.2  電話號碼“32”的脈沖波形


   正常撥號時,電路電流中斷的時間一般在58~65ms之間,視斷續比的不同而不同。快速撥號時,只要取一半時間即可。電路電流接通的時間(即在同一位號碼中的2個斷脈沖之間的接通電流時間)約在32~42ms之間,視斷續比的不同而不同。快速撥號時,只要取一半時間即可。顯然脈沖周期等于脈沖中斷時間和脈沖接通時間之和,每一個周期的時間為100ms左右。快速撥號時,在50ms左右。2位號碼(即2組脈沖串)之間的最小時間間隔,通常為800ms左右;而快速撥號時,其值減半,為400ms左右。

我國目前采用的電話脈沖撥號的速率是10PPS(每秒的脈沖數),即每秒發出10個脈沖,因此上述各參數不存在快速撥號時的值。

   為了提高撥號的可靠性及穩定性,這里設計時選定更低的脈沖撥號速率:1個脈沖代表播出1,2個脈沖代表撥出2,……,10個脈沖代表撥出0,每個脈沖的寬度和間隔為100ms。工作時首先進行模擬摘機,然后開始脈沖撥號,撥出1位號碼后停頓500ms(保持接通)再撥下一位,直至全部撥完后再發報警音,……,最后掛機。


2.1.3  脈沖撥號實現過程

圖2.3為脈沖撥號的實現電路。平時電話線上的電壓約為50~60V左右。未撥號時電片機的P3.0、P3.1 均輸出低電平。

撥號過程如下:

①單片機的P3.0輸出高電平,使TR1導通,由于電話線路上接入了負載R1,這樣電話線的電壓下降,模擬摘機。

②單片機的P3.0開始輸出撥號脈沖,使電話線的電壓(電平)也呈高、低變化。1個脈沖代表撥出1,2個脈沖代表撥出2,……,10個脈沖代表撥出0,每個脈沖的寬度和間隔均為100ms。撥出1位號碼后停頓500ms(保持P3.0高電平)再撥下一位,直至全部撥完。

③P3.0 保持高電平(保持電話線路接通),P3.1輸出1KHz的報警音脈沖驅動TR2,以2Hz進行調制(即接通1kHz信號0.5s、斷開1kHz信號0.5s),這樣從接聽方的電話中就會聽到“嘟、嘟……”的報警聲。報警音的時間根據設計為60s。

④60后,P3.1輸出低電平,TR2 截止,停止報警。隨后P3.0也輸出低電平,模擬掛機。完成一次報警過程。



電路原理如圖所示,共有4個按鍵,即rst、ok、up、set。

rst:系統復位鍵。

ok:輸入數據確認鍵。

up:顯示的數字增加鍵。

set:工作模式設定鍵,可設定管機、工作、輸入時間t1、輸入時間t2及輸入電話號碼5種模式。

   磁性開關即為裝于門或窗口的防盜感應開關,門關閉時常開,門打開時閉合接通。當然也可改用其他的感應器件,如激光探測、超聲波感應、熱釋電感應、主動紅外線探測或無線門磁等,以實現全方位遠距離檢測。為了防止磁性開關離控制器較遠而產生引入干擾,使用了光耦作信號傳遞,效果良好。LED數碼管用于工作狀態指示或輸入數據指示。L1、L2接電話線,ZND為擊穿電壓120V的壓敏二極管,防止電路受雷電干擾。平時系統處于低功耗待機狀態(此時耗電僅2mA左右),由電話線上取電工作,并對3.6V/60mA鎳鉻電池充電,當輸入數據進行設定或進行撥號報警時,耗電會達到10mA,這時主要由鎳鉻電池供電。由于有鎳鉻電池后備供電,即使電話線斷電也不會使已輸入的數據丟失。該機除用于防盜報警外,若對軟件進行一些修改,也可通過電話線進行遠程數據傳遞。三極管T1、T2及電阻R1、R2構成撥號及報警電路,其工作原理前面已作詳細介紹。

4.1.2時鐘計時器的硬件電路設計描述

時鐘計時器的硬件電路,采用AT89S52單片機最小化應用設計,顯示采用共陽七段LED顯示器,P0口輸出段數碼數據,P2.0~P2.5口作列掃描輸出,P1.0,P1.1和P1.2口接三個按鈕開關用以實現調時,調分功能.為了提供共陽LED數碼管的驅動電壓,用三極管8550作電源驅動輸出。采用12MHZ晶振有利于提高秒計時的精確性。硬件電路圖如圖3.2示。


系統的軟件設計

3.1電話撥號防盜報警器程序設計

3.1.1主程序設計

主程序的工作過程為:先進行初始化工作,隨后根據輸入的鍵值分別散轉輸入的鍵值分別散轉至對應的子程序(管機、警戒工作、輸入時間t1、輸入時間t2、輸入電話號碼)循環工作。T0為100ms定時中斷服務子程序,它實現精確的撥號脈沖時序。INT0外中斷服務子函數用于實現功能選擇;而INT1外中斷服務子函數則檢測防盜觸發開關的狀態。

   主程序狀態流程圖如圖3.6所示。INT0外中斷服務子函數狀態流程圖及INT1外中斷服務子函數的狀態流程圖分別如圖3.7、圖3.8所示。

                                                                                                         - 1 -


3.2 時鐘顯示程序設計

3.2.1主函數

  本設計中計時采用定時器T0中斷完成,其余狀態循環調用顯示子函數及鍵掃描子函數,當端口開關按下時,轉入相應調時功能。其主函數執行流程如圖3.3所示。



3.2.2 LED顯示子函數

  數碼管顯示的數據存放在內存單元dis[0]~dis[5]中,其中dis[0]~dis[1]存放秒數據,dis[2]~dis[3]存放分數據,dis[4]~dis[5]存放時數據,每一單元內均為十進制BCD碼。由于采用軟件動態掃描實現數據顯示功能,顯示用的十進制BCD碼數據的對應段碼存放在ROM表(dis7[11])中,顯示時,先取出dis[0]~dis[5]中的某一數據,然后查得對應得顯示段碼從P0口輸出,P2口將對應得數碼管選中供電,就能顯示該地址單元的數據值。

3.2.3定時器T0中斷函數

  定時器T0用于時間計時。定時溢出中斷周期可設為50ms,中斷進入后先判斷,中斷計時累計20次(即1ms)時對妙計數單元進行加1操作。時鐘計數單元在 義的6個單元(timedata[6])中。timedata[0]~timedata[1]存放秒數據,timedata[2]~timedata[3]存放分數據,timedata[4]~timedata[5]存放時數據。最大計時值為23小時59分59秒。在計數單元中采用十進制BCD碼計數,秒,分、時之間滿60進位。T0中斷服務程序執行流程如圖3.4所示。







3.2.4中斷函數

  T1中斷服務程序用于指示調整數字單元的亮閃,在時間調整狀態下,每過0.4s,將對應單元的顯示數據換成“熄滅符”數據(0x0a)。這樣,在調整時間時,對應調整單元的顯示數據會間隔閃亮。

3.2.5功能函數

  調時功能函數的設計方法是:按下T0鍵,進入調分狀態,時鐘停止走動;按T1或T2鍵可進行加1或減1操作 ;繼續按T0鍵可分別進行分十位、時個位和時十位調整;最后按T0建將退出調整狀態,時鐘開始計時運行。



系統的調試部分

4.1 時鐘系統的調試

4.1.1時鐘系統的硬件調試

硬件調試時可先檢查印制板及焊接的質量情況,在檢查無誤后可通電檢查LED顯示器的點亮狀況。若亮度不理想,可以調整P0口的電阻大小,一般情況下取200歐姆電阻即可獲得滿意的亮度效果。

4.1.2時鐘系統的件調試

軟件調試Keil C51編譯器,源程序編譯及仿真調試應分段或以子函數為單位一個個地進行,最后可結合硬件實時運行調試。

4.1.3性能分析

按照設計程序分析,LED顯示器動態掃描頻率約為167Hz,實際使用觀察時完全沒有閃爍,實際計時時精度較高,可滿足一般場合的應用需要。


4.2撥號報警器功能調試

通電前應檢查焊接質量,確認無短路、虛焊等故障。將撥碼開關J2指向下側,即斷開3.6V鎳鉻電池與系統的連接。將外部直流可調穩壓電源調整為3.6V。接入系統的Vcc與地。如果系統耗電小于15mA為正常,否則應檢查是否有短路、元器件不良或錯焊現象存在。隨后取下外接直流穩壓電源,恢復3.6V鎳鉻電池與系統的連接,進行軟、硬件統調測試。

由于AT89S52的I/O引腳有限,故數碼管只設一位,因此輸入數字時只能分階段一位一位輸入。

假設需輸入t1=061,t2=025,電話號碼=12345678,在此詳述如下:

地1步:接上電話線(也即接上電源)后,數碼管顯示“E”,意為數據錯誤,因為此時我們尚未輸入任何數據。

第2步:

①點按一下set鍵,鍵值加1,即此時set=1.這時數碼管最下的一橫點亮,顯示“_”,意為可輸入時間t1,點按ok鍵確認(小數點被同時點亮)。然后數碼管顯示數字“0”。

②按下up鍵后,數字開始從0~9循環遞增,調至0后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時百位數字“0”存入內存。

③按下up鍵后,數字開始循環遞增,調至1后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時十位數字“6”存入內存。

④按下up鍵后,數字開始循環遞增,調至1后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時個位數字“6”存入內存。

這樣就完成了將061(代表t1=61s)存入內存的過程。同時數碼管又恢復顯示“_”

第3步:

①點按一下set鍵,鍵值加1,即此時set=2。這時數碼管下面的二橫點亮,顯示“二”,意為可輸入時間t2,點按ok鍵確認(小數點被同時點亮)。然后數碼管顯示數字“0”。

②按下up鍵后,數字開始從從0~9循環遞增,調至0后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時百位數字“0”存入內存。

③按下up鍵后,數字開始循環遞增,調至2后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時十位數字“2”存入內存。

④按下up鍵后,數字開始循環遞增,調至5后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時個位數字“5”存入內存。

這樣就完成了將025(代表t1=25s)存入內存的過程。同時數碼管又恢復顯示“二”

以后的調試同前面的方法相同。


(1) 電話撥號報警程序
程序設計時需要設立3個數組DATA[20]、X[3]、Y[3]。DATA[20]用于存放電話號碼(最長20位),X[3]用于存放時間t1(000~999s),Y[3]用于存放時間t2(000~999s)。
  另外還要設立3個軟件計數器data_flag、t1_flag、t2_flag。Data_flag用于統計輸入的電話號碼位長,t1_flag用于統計輸入的時間t1位長,t2位長。
  1. uchar DATA[20];     /*存放電話號碼的數組*/
  2. uchar X[3];         /*存放時間t1數組*/
  3. uchar Y[3];         /*存放時間t2數組*/
  4. uchar flag;         /*RAM區防干擾標志*/
  5. uchar data_flag=0; /*輸入電話號碼計數器(最長20位)*/
  6. uchar set=0;     /*功能鍵值*/
  7. uchar m=0;      //全局變量
  8. uchar n=0;
  9. uint f;
  10. uchar t1_flag=0;     /*輸入時間t1計數器(最長3位)*/
  11. uchar t2_flag=0;     /*輸入時間t2計數器(最長3位)*/
  12. uchar cnt_1=0;        /*時間t1單元數學運算后暫存單元*/
  13. uchar cnt_2=0;       /*時間t2單元數學運算后暫存單元*/
  14. /*定時器T0初始化*/
  15. viod init_timer()
  16. {
  17. TMOD=0x01;             //定時器T0方式1
  18. TH0=-(50000/256);      //裝載100ms定時初值
  19. TL0=-(50000%256);
  20. IE=0x82;               //開中斷
  21. }
  22.   啟動報警器子程序模塊

  23. /*---啟動報警器進入警戒---*/
  24. void work()
  25. {uchar h;
  26. p1=0xdf;    /*數碼管左上角顯示“1”*/
  27. delay(1);
  28. if(set==1)   /*進入時間1循環*/
  29. {while(cnt<=x[0]*100+X[1]*10+X[2])
  30.      {
  31.       delay(1000);
  32.       cnt_1++;                 /*計數器cnt_1累加*/
  33.       if(set!=1){EX1=0;cnt_1=0;break;}
  34.       }                         /*如按下Set鍵,則推出此循環*/
  35. }
  36. else {EX1=1;PCON=0x00;}
  37. if(set==1)
  38. {if(cnt_1>=X[0]*100+X[1]*10+X[2])
  39.    {EX1=1;cnt_1=0;}   /*時間1到,打開外中斷1,計數器歸零*/
  40. /*進入待機。若有1s以上開關動作,退出待機*/
  41. while(1)
  42. {PCON=0x01;if(f>=5{PCON=0x00;break;})
  43. }
  44. /*-----------------------------------------------------------*/
  45. EX1=0;  /*關閉外中斷1*/
  46. if(set==1)    /*進入時間2循環*/
  47. {while(cnt_2<=Y[0]*100+Y[1]*10+Y[2])
  48.    {
  49.      delay(1000);
  50.      cnt_2++;   /*計時器cnt_2累加*/
  51.      if(set!=1){cnt_2=0;break;}
  52.    }           /*如按下Set鍵,則退出此循環*/
  53. }
  54. if(set==1)
  55. {
  56. bh();        /*時間2到,調用撥號子程序*/
  57. delay(3000);
  58. p3_7=0;    //控制輸出端為低,可驅動蜂鳴器等
  59. for(h=0;h<60;h++)   /*發出60s警音*/
  60. {   for(f=0;f<500;f++)
  61.     {f++;
  62.      P3_1=! P3_1;P1=0x5f;
  63.      delay(1);
  64.      }
  65.     P3_1=0;P1=0x7f;delay(500);
  66. }
  67. P3_7=1;//控制輸出端恢復高
  68. cnt_1=0;cnt_2=0;   /*有關計數器、端口回到初始狀態*/
  69. P3_0=0;P3_1=0;P1_7=1;
  70. for(f=0;f<3;f++)delay(60000);  /*關閉3min,讓接警人進行手機或電話座機報警*/
  71. }
  72. }

  73.      撥號脈沖子程序模塊

  74. /*---撥號---*/
  75. void bh()
  76. {data_flag=0;   /*電話號碼計數器(20位)歸零*/
  77.    P3_0=1;     /*接通線路*/
  78.    p1_7=0;     /*數碼管小數點亮*/
  79.    delay(1000);
  80. while (DATA[data_flag]<10)  /*號碼小于10進入循環撥號狀態*/

  81. {
  82.   if(DATA[data_flag]==0)    /*若號碼為0*/
  83.   {TR0=1;                 /*啟動T0定時器*/
  84.     if(n==20){data_flag++;   /*進行20次中斷,產生10個脈沖*/
  85.       n=0;TR0=0;
  86.       P3_0=1;P1_7=0;
  87.       delay(500);
  88.               }
  89. }
  90. if(DATA[data_flag]>0)   /*若號碼〉0但<10*/
  91. {TR=1;                 /*啟動T0定時器*/
  92. if(n==((DATA[data_flag]*2))   /*進行號碼x2次中斷,產生號碼個脈沖*/
  93.       {data_flag++;
  94.         n=0;TR0=0;
  95.         P3_0=1;P1_7=0;
  96.         delay(500);
  97.        }
  98. }
  99. }
  100. TR0=0;
  101. }

  102.       關機子程序模塊

  103. void stop()             //*關機子程序
  104. {if(flag==0x55)P1=0xfb; //*若標志為55H,說明內存區未受干擾,數碼
  105.                         //管右下角顯示“1”
  106.     else P1=0x86;      //否則數碼管顯示“E”
  107. delay(1);               //延時1ms再判
  108. if(flag==0x55)PCON=0x01; //進入低耗節電待機狀態
  109. delay(1);    //延時1ms
  110. }

  111.      完整代碼

  112. #include<AT89x052.H>   //器件配置文件
  113. #define uchar unsigned char  //變量類型的宏定義
  114. #define uint unsigned int
  115. uchar code DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99
  116.                           0x92,0x82,0xF8,0x80,0x90,}; /*0~9數碼管段碼*/
  117. uchar DATA[20]; /*存放電話號碼的數組*/
  118. uchar x[3];    /*存放時間t2數組*/
  119. uchar flag;   /*RAM區防干擾標志*/
  120. uchar data_flag=0;   /*輸入電話號碼計數器(最長20位)*/
  121. uchar set=0;    /* 功能鍵值*/
  122. uchar m=0;  //全局變量
  123. uchar n=0;
  124. uint f;
  125. uchar t1_flag=0;    /*輸入時間1計數器(最長3位)*/
  126. uchar t2_flag=0;   /*輸入時間2 計數器(最長3位)*/
  127. uchar cnt_1=0;     /*時間t1單元數學運算后暫存單元*/
  128. uchar cnt_2=0;     /*時間t2單元數學運算后暫存單元*/
  129. /*************************************************/
  130. void delay(uint k);   /*延時子函數聲明*/
  131. void stop();          /*關機子函數聲明*/
  132. void bh();           /*撥號子函數聲明*/
  133. /*************************************************/
  134. /*定時器T0初始化*/
  135. void init_timer()
  136. {
  137. TMOD=0x01;
  138. TH0=-(50000/256);
  139. TL0=-(50000%256);
  140. IE=0x82;
  141. }
  142. /***********************************************************/
  143. /*100ms定時中斷服務子函數*/
  144. void zd0()interrupt 1
  145. {
  146. P3_0=! P3_0;   //P3.0每100ms取反一次,送出脈沖
  147. P1_7=! P1_7;   //數碼管小數點同步閃爍
  148. n++;
  149. TH0=-(50000/256);
  150. TL0=-(50000%256);
  151. }
  152. /********************************************************/
  153. /*100ms定時中斷服務子函數*/
  154. void zd0()interrupt 1
  155. {
  156. p3_0=!P3_0;  //P3.0每100ms取反一次,送出脈沖
  157. P1_7=!P1_7;  //數碼管小數點同步閃爍
  158. n++;
  159. TH0=-(50000/256);
  160. TL0=-(50000%256);
  161. }
  162. /*********************************************/
  163. /*INT0中斷服務子函數*/
  164. viod zd_int0()interrupt 0
  165. {
  166. delay(10);            
  167. if(P3_2==0)set++;    //功能鍵值遞增
  168. if(set>=5)set=0;       //鍵值的范圍0~4
  169. if(set==1)flag=0x55;   //向RAM區的標志flag寫入55H
  170. PCON=0x00;f=8;
  171. again:if(P3_2==0)goto again;  //若按鍵未釋放,則等待
  172. }
  173. /*****************************************/
  174. /*INT1中斷服務子函數*/
  175. void zd_int1()interrupt 2
  176. {uchar h;
  177. f=0;
  178. for(h=0;h<10;h++)   /*檢查磁性開關(P3_3狀態)10次,共1s*/
  179. {
  180. delay(100)
  181. if(P3_3==0)f++;
  182. }
  183. }
  184. /********************************************************************/
  185. /*---關機---*/
  186. void stop()
  187. {if(flag==0x55)P1=0xfb;
  188. elsep1=0x86;                           //數碼管右下角顯示“1”。
  189. delay(1);
  190. if(flag==0x55)PCON=0x01;               /*進入節電待機狀態*/
  191. delay(1);
  192. }
  193. /*********************************************************************/
  194. /*延時1ms*K子函數*/
  195. void delay(uint k)
  196. {
  197. uint i,j;
  198. for(i=1;j<k;i++){
  199. for(j=0;j<60;j++)
  200. {;}}
  201. }
  202. /*********************************************************************/
  203. /*----輸入時間t1----*/
  204. viod in_time1()
  205. {
  206. P1=0xf7;delay(1);                    /*數碼管顯示“—”*/
  207. if(P3_5==0)
  208. {
  209.    delay(10);                        /*按下OK鍵確認并點亮小數點*/
  210.    if(P3_5==0){P1=0x7f;m=0;t1_flag=0;delay(500);}
  211. while(t1_flag<3)
  212.     {
  213.      if(P3_4==0)
  214. {delay(10);if(P3_4==0)               /*按下UP鍵數碼管作0~9遞增顯示*/
  215.             {m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
  216. }
  217. P1=DATA_7SEG[m];delay(1);           /*若不按下UP鍵數碼管也作0~9顯示*/
  218. if(P3_5==0)                        
  219. {delay(10);if(P3_5==0)              /*按下OK鍵顯示的數據存入數組X中*/
  220.    {X[t1_flag]=m;t1_flag++;P1=0x7f;delay(500);}
  221.     }
  222.    }
  223. }
  224. if(t1_flag>=3)t1_flag=0;            /*時間1計數器>=3時歸零*/
  225. }
  226. /**********************************************************************
  227. /
  228. /*-----輸入時間t2-----*/
  229. viod in_time2()
  230. {
  231. P1=0xb7;delay(1);                  /*數碼管顯示“二”*/
  232. if(P3_5==0)
  233. {
  234.    delay(10);                      /*按下OK鍵確認并點亮小數點*/
  235.    if(P3_5==0){P1=0X7f;m=0;t2_flag=0;delay(500);}
  236. while(t2_flag<3)
  237. {
  238. if(P3_4==0)
  239.    {delay(10);if(P3_4==0)           /*按下UP鍵數碼管作0~9遞增顯示*/
  240.                {m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
  241. }
  242. P1=DATA_7SEG[m];delay(1);           /*若不按UP鍵數碼管也作0~9顯示*/
  243. if(P3_5==0)
  244. {delay(10);if(P3_5==0)              /*按下OK鍵顯示的數據存入數組Y中*/
  245.   {Y[t2_flag=m;t2_flag++;P1=0x7f;delay(500);}

  246.    }
  247.   }
  248. }
  249. if(t2_flag>=3)t2_flag=0;            /*時間2計數器>=3時歸零*/
  250. }
  251. /***********************************************************************
  252. /
  253.     /*----輸入電話號碼----*/
  254. vioa in_data()
  255. {uchar g;                        
  256. P1=0xb6;delay(1);                    /*數碼管顯示三*/
  257. if(P3_5==0)
  258. {delay(10);if(P3_5==0)
  259.            {p1=0x7f;m=0;data_flag=0; /*按下OK鍵確認并點亮小數點*/
  260.            for(g=0;g<20;g++){DATA[g]=10;}
  261.            delay(500);                /*同時DATA數組中全部寫入10*/
  262.            while(1)
  263.            {
  264.            if(P3_4==0){delay(10);      /*按下UP鍵數碼管作0~9遞增顯示*/        
  265.                if(P3_4==0);{m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
  266.                       }
  267.            P1=DATA_7SEG[m];delay(1);     /*若不按UP鍵數碼管也作0~9顯示*/
  268.            if(P3_5==0)
  269.                {delay(10);
  270.                 if(P3_5==0)                /*按下OK鍵顯示的數據(號碼)存入數組DATA中*/
  271.                 {DATA[data_flag]=m;data_flag++;P1=0x7f;delay(500);}
  272.                  }                          /按下OK鍵超過2s則退出向數組DATA送入號碼*/
  273.                 if(P3_5==0){delay(2000);if(P3_5==0)break;}
  274.                 }
  275. }
  276. }
  277. F1:if(P3_5==0){delay(10);if(P3_5==0){P1=0xb6;delay(1);goto F1;}}


  278. /********************************************************************/
  279. /*--主函數--*/
  280. void main()
  281. {
  282. int_timer();   /*定時器T0初始化*/
  283. EA=1;EX0=1;    /*開總中斷,開外中斷0*/
  284. p3_0=0;        /*關閉線路(掛機)*/
  285. p3_1=0;
  286. while(1)       /*無限循環*/
  287. {
  288. switch(set)    /*根據Set標志散轉*/
  289. {
  290. case 0:stop();break;  /*關機*/
  291. case 1:work();break;  /*警戒工作*/
  292. case 3:in_time2();break; /*輸入時間t1*/
  293. case 4:in_data();break;
  294. }
  295.      if(flag!=0x55)
  296.        {p1=0x86;delay(1);}
  297. }
  298. }


  299. (2) 時鐘計時器程序
  300. /**************************************************************/
  301. //          采用6位LED動態掃描時鐘演示程序
  302. //         使用Keil C51
  303. //         2004.03.31
  304. /*************************************************************/
  305. /*使用AT89S52單片機,12MHZ晶振,P0口輸出段碼,P2口作列掃描,用共陽LED數碼管*/
  306. //key0為調時位選用,key1為加1鍵,key2為減1鍵
  307. #include "reg51.h"
  308. #define char unsigned char
  309. //
  310. char code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
  311. /*共陽LED段碼表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/
  312. char code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //列掃描控制字
  313. char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};             //計時單元數據初值,共6個
  314. char data dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,};      //顯示單元數據,共6個數據
  315. char data con1s=0x00,con04s=0x00,con=0x00;    //秒定時用
  316. sbit key0=P1^0;
  317. sbit key1=P1^1;
  318. sbit key2=P1^2;
  319. //
  320. /************/
  321. //1ms延時函數//
  322. /***********/
  323. dalaylms(int t)
  324. {
  325. int i,j;
  326. for(i=0;i<t;i++)
  327.   for(j=0;j<120;j++)
  328.   ;
  329. }
  330. /*************/
  331. //鍵掃描子函數//
  332. keyscan()
  333. {
  334. EA=0;
  335. if(key0==0)
  336. {
  337. delaylms(10);
  338. while(key0==0);
  339. if(dis[con]==10)
  340. {dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}
  341. con++;TR0=0;ET0=0;TR1=1;ET1=1;
  342. if(con >=6)
  343.   {con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
  344. }
  345. //
  346. if(con!=0)
  347. {
  348.   if(key1==0)
  349.   {
  350.    delaylms(10);
  351.   while(key1==0);
  352.   timedata[con]++
  353.   if(timedata[con]>=10)
  354.     {timedata[con]=0;}
  355. dis[con]=timedata[con];dis[6]=0x0a;

  356.     }
  357. }
  358. //
  359. if(con!=0)
  360. {
  361. if(key2==0)
  362. {
  363.   delaylms(10);
  364. while(key2==0);
  365.    if(timedata[con]==0)
  366.      {timedata[con]=0x90;}
  367.    else{timedata[con]--;}
  368. dis[con]=timedata[con];dis[6]=0x0a;

  369.   }
  370. }
  371. EA=1;
  372. }
  373. //
  374. /***********/
  375. //顯示函數//
  376. /***********/
  377. scan()
  378. {
  379. char k;
  380. for(k=0;k<6;k++)
  381. {
  382. p0=dis_7[dis[k]];p2=scan_con[k];delaylms(1);p2=0xff;
  383.   }
  384. }
  385. /*************/
  386. //初始化函數//
  387. /*************/
  388. clearmen()
  389. {
  390. int i;
  391. for(i=0;i<6;i++)
  392.   {
  393.   dis[i]=timedata[i];}
  394. TH0=0x3C;TL0=0xB0;                             //50ms定時初值(T0計時用)
  395. TH1=0x3C;TL1=0xB0;                             //50ms定時初值(T1計時用)
  396. TMOD=0X11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;
  397. }
  398. /**********/
  399. //主函數//
  400. /*********/
  401. main()
  402. {
  403. clearmen();
  404. while(1)
  405.   {
  406.    scan();
  407.    keyscan();
  408.    }
  409. }
  410. /********************/
  411. //1s中斷處理函數//
  412. /*******************/
  413. viod time_intt0(viod) interrupt 1
  414. {
  415. ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1;
  416. con1s++;
  417. if(con1s==20)
  418.   {
  419. con1s=0x00;
  420. timedata[0]++;
  421. if(timedata[0]>=10)
  422. {
  423. timedata[0]=0;timedata[1]++;
  424. if(timedata[1]>=6)
  425.   {
  426.    timedata[1]=0;timedata[2]++;
  427.      if(timedata[2]>=10)
  428.        {
  429.         timedata[2]=0;timedata[3]++;
  430.         if(timedata[3]>=6)
  431.           {
  432.            timedata[3]=0;timedata[4]++;
  433.            if(timedata[4]>=10)
  434.              {
  435.               timedata[4]=0;timedata[5]++;
  436.                  }
  437.               if(timedata[5]==2)
  438.                     {
  439.                   if(timedata[4]==4)
  440.                     {
  441.                      timedata[4]=0;timedata[5]=0;
  442.                     }
  443.                  }
  444.               }
  445.          }
  446.       }
  447.   }
  448. dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2];
  449. dis[3]=timedata[3];dis[4]=timedata[4];dis[5]=timedata[5];
  450.   }
  451. ET0=1;
  452. }
  453. /********************/
  454. //0.4S閃爍中斷函數//
  455. /*******************/
  456. viod time_intt1(viod) interrupt3
  457. {
  458. EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1;
  459. con04s++;
  460. if(con04s==8)
  461.   {
  462.    con04s=0x00;
  463.    dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
  464.    }
  465.    EA=1;
  466. }
復制代碼


以上的Word格式文檔51黑下載地址:
文檔.doc (255.5 KB, 下載次數: 15)


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧洲国产视频 | 精品视频一区二区 | 成人在线观看免费视频 | 国产精品久久久亚洲 | 成人在线免费电影 | 九色.com | 天堂一区| h视频在线免费 | 老头搡老女人毛片视频在线看 | 亚洲日韩中文字幕一区 | 欧美日韩国产欧美 | 农村妇女毛片精品久久久 | 91视频进入 | 成年人网站国产 | 国产日韩欧美一区二区 | 亚洲精品久久 | 黄久久久| 日韩一级不卡 | 欧美成人h版在线观看 | 国产高清免费视频 | 久久综合九色综合欧美狠狠 | 亚洲精品一区二区三区在线 | 日韩一区二区视频 | 亚洲不卡在线观看 | 一区二区三区国产好的精 | 日韩欧美一区在线 | 免费一区二区 | 国产成人精品一区二区 | 永久免费av| 欧美精品一区二区三区在线 | 精品视频www | 日本久久精 | 奇米av| 国产美女免费视频 | 在线成人免费观看 | 黄色精品 | 韩国理论电影在线 | 成人妇女免费播放久久久 | 久久久99国产精品免费 | 久久精品国产99国产精品 | 精品蜜桃一区二区三区 |