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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2386|回復: 0
打印 上一主題 下一主題
收起左側

STC單片機IO管腳毀壞動態自檢程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:108935 發表于 2016-3-15 01:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <REGX52.h>
  2. #include <stdio.h>
  3. #include <absacc.h>
  4. #include <intrins.h>
  5. #include <string.h>

  6. #pragma NOAREGS
  7. //STC ISP_V2.0 PCB的晶振為18.432MHz

  8. #define WdtTime_71_1mS   0x30 //71.1mS
  9. #define WdtTime_141_2mS  0x31 //141.2mS
  10. #define WdtTime_284_4mS  0x32 //284.4mS
  11. #define WdtTime_568_8mS  0x33 //568.8mS
  12. #define WdtTime_1_1377S  0x34 //1.1377S
  13. #define WdtTime_2_755S   0x35 //2.755S

  14. #define T2_5mS -1536*5//5ms 18.432MHz


  15. /*------------------------------------------------
  16. AT89S5X
  17. --------------------------------------------------*/
  18. sfr   AUXR      = 0x8e;
  19. sfr   WDTRST    = 0xa6;
  20. sfr16 TIMEER2   = 0xcc;
  21. sfr16 RCAP      = 0xca;
  22. /*------------------------------------------------
  23. STC89C5XRC
  24. --------------------------------------------------*/
  25. sfr   WDT_CONTR = 0x0e1;

  26. //全局變量定義
  27. typedef struct Systemstruct{//系統數據結構
  28.   unsigned char TimeCount;
  29.   unsigned int  RamTest;
  30.   unsigned char SioTxCount;
  31.   unsigned char SioTxSum;
  32.   unsigned char SioRxCount;
  33.   unsigned char SioTxBuff[32];
  34. //  unsigned char SioRxBuff[32];
  35. }SystemData;

  36. data SystemData SystemBuffers;//申請系統數據結構






  37. void MainInit(void);//系統初始化
  38. void SystemInit(void);//系統初始化
  39. void SystemSetup(void);//系統設置
  40. void SystemIoInit(void);//系統接口初始化
  41. void TimeInit(void);//定時器定時參數設置
  42. void UserSetup(void);//用戶運行環境設置
  43. void ClrWdt(void);//喂狗
  44. void IoPinTest(void);
  45. unsigned char Port0Test(void);
  46. unsigned char Port1Test(void);
  47. unsigned char Port2Test(void);
  48. unsigned char Port3Test(void);



  49. void main(void)
  50. {
  51.   MainInit();//系統初始化
  52.   while (1) {//主循環
  53.     IE   |= 0xb2;//保證中斷可靠EA,ET2,ES,ET0
  54.     TCON |= 0x55;//保證定時器開
  55.     PCON |= SMOD_ + GF0_ + IDL_;//進入空閑狀態并喂軟件狗
  56.     _nop_();
  57.     _nop_();
  58.   }
  59. }

  60. void MainInit(void) using 0//系統初始化
  61. {
  62.   ClrWdt();//清除看門狗計數器
  63.   SystemIoInit();//系統接口初始化
  64.   SystemInit();//系統上電初始化
  65.   SystemSetup();//系統運行環境設置
  66.   UserSetup();//用戶運行環境設置
  67. }

  68. void SystemInit(void) using 0//系統初始化
  69. {
  70.   if (SystemBuffers.RamTest != 0x55aa) {//內存初始化
  71.     SystemBuffers.RamTest = 0x55aa;
  72.   }
  73.   else {
  74.   }
  75. }

  76. void SystemSetup(void) using 0//系統設置
  77. {
  78.   TimeInit();
  79. }

  80. void SystemIoInit(void) using 0
  81. {
  82.   IE = 0x00;//關閉中斷
  83.   P2 = 0xff;//P2口初始化
  84.   P0 = 0xff;//P0口初始化
  85.   P1 = 0xff;//P1口初始化
  86.   P3 = 0xff;//P3口初始化
  87. }


  88. void TimeInit() using 0
  89. {
  90. //  TCON = 0x55;//啟動定時器
  91. /*----------------------------------
  92.       定時器0定時參數設置
  93. ----------------------------------*/
  94.   TL0 = 0;
  95.   TH0 = 0;
  96.   TR0 = 1;//啟動定時器0
  97. /*----------------------------------
  98.       定時器1定時參數設置
  99. ----------------------------------*/
  100.   TMOD = 0x20;
  101.   TH1 =  0xfb;//Fosc=18.432MHz  th1=tl1=0xfb bps=9600
  102.   TL1 =  TH1;
  103.   SCON = 0x58;
  104.   PCON = 0x80;//2*bps=9600*2=19200
  105.   TR1 = 1;//啟動定時器1
  106. /*----------------------------------
  107.       定時器2定時參數設置
  108. ----------------------------------*/
  109.   TIMEER2 = T2_5mS;
  110.   RCAP    = T2_5mS;
  111.   TR2     = 1;//啟動定時器2
  112. }

  113. void UserSetup(void) using 0//用戶運行環境設置
  114. {
  115.   SystemBuffers.SioTxCount = 0;
  116. }

  117. void ClrWdt(void)  using 0//喂狗
  118. {
  119.   WDT_CONTR = WdtTime_1_1377S;//1.1377S喂狗
  120. }


  121. /*------------------------------------
  122.               P0端口測試
  123. 主要測試管腳接電源或地及相臨管腳的短路
  124. 注意:此函數必須配合P0口上拉電阻!!!
  125. -------------------------------------*/
  126. unsigned char Port0Test(void)
  127. {
  128. unsigned char testval;
  129.   P0 = 0x55;//奇數管腳發低電平
  130.   _nop_();//延時
  131.   testval = P0 ^ 0x55;//比較發送及接收結果
  132.   P0 = 0xaa;//偶數管腳發低電平
  133.   _nop_();//延時
  134.   testval |= P0 ^ 0xaa;//比較發送及接收結果(2次的)
  135.   P0 = 0xff;//釋放P0口,防止外部接入電源
  136.   return testval;//測試成功返回0
  137. }


  138. /*------------------------------------
  139.               P1端口測試
  140. 主要測試管腳接電源或地及相臨管腳的短路
  141. -------------------------------------*/
  142. unsigned char Port1Test(void)
  143. {
  144. unsigned char testval;
  145.   P1 = 0x55;//奇數管腳發低電平
  146.   _nop_();//延時
  147.   testval = P1 ^ 0x55;//比較發送及接收結果
  148.   P1 = 0xaa;//偶數管腳發低電平
  149.   _nop_();//延時
  150.   testval |= P1 ^ 0xaa;//比較發送及接收結果(2次的)
  151.   P1 = 0xff;//釋放P1口,防止外部接入電源
  152.   return testval;//測試成功返回0
  153. }

  154. /*------------------------------------
  155.               P2端口測試
  156. 主要測試管腳接電源或地及相臨管腳的短路
  157. -------------------------------------*/
  158. unsigned char Port2Test(void)
  159. {
  160. unsigned char testval;
  161.   P2 = 0x55;//奇數管腳發低電平
  162.   _nop_();//延時
  163.   testval = P2 ^ 0x55;//比較發送及接收結果
  164.   P2 = 0xaa;//偶數管腳發低電平
  165.   _nop_();//延時
  166.   testval |= P1 ^ 0xaa;//比較發送及接收結果(2次的)
  167.   P2 = 0xff;//釋放P2口,防止外部接入電源
  168.   return testval;//測試成功返回0
  169. }


  170. /*------------------------------------
  171.               P3端口測試
  172. 主要測試管腳接電源或地及相臨管腳的短路
  173. -------------------------------------*/
  174. unsigned char Port3Test(void)
  175. {
  176. unsigned char testval;
  177.   P3 = 0x55;//奇數管腳發低電平
  178.   _nop_();//延時
  179.   testval = P3 ^ 0x55;//比較發送及接收結果
  180.   P3 = 0xaa;//偶數管腳發低電平
  181.   _nop_();//延時
  182.   testval |= P3 ^ 0xaa;//比較發送及接收結果(2次的)
  183.   P3 = 0xff;//釋放P1口,防止外部接入電源
  184.   return testval;//測試成功返回0
  185. }



  186. void IoPinTest(void)
  187. {
  188. unsigned char i, err = 0, pin = 0;
  189. //  if (pin = Port0Test()) err = 1;//如果P0口上拉可開放此行
  190.   if (pin = Port1Test()) err = 2;
  191.   if (pin = Port2Test()) err = 3;
  192.   if (pin = Port3Test()) err = 4;
  193.   if (err) {
  194.     if ((TI == 0) && (SystemBuffers.SioTxCount == 0)) {
  195.       for (i = 0; i < 8; i++) {
  196.         if (pin & 1) break;
  197.         pin >>= 1;
  198.       }
  199.       strcpy(SystemBuffers.SioTxBuff, "P0_0 is Bad!!!\n");
  200.       SystemBuffers.SioTxBuff[1] += err - 1;
  201.       SystemBuffers.SioTxBuff[3] += pin;
  202.       SystemBuffers.SioTxCount = strlen(SystemBuffers.SioTxBuff);
  203.       SystemBuffers.SioTxSum = SystemBuffers.SioTxCount;
  204.       TI = 1;
  205.     }
  206.   }
  207. }



  208. /*------------------------------------
  209.          定時器T0中斷服務程序
  210. ------------------------------------*/
  211. void t0proc() interrupt TF0_VECTOR using 1
  212. {
  213. }

  214. /*------------------------------------
  215.          定時器T1中斷服務程序
  216. ------------------------------------*/
  217. void t1proc() interrupt TF1_VECTOR using 1
  218. {
  219. }

  220. /*------------------------------------
  221.          定時器T2中斷服務程序(5mS)
  222. ------------------------------------*/
  223. void t2proc() interrupt TF2_VECTOR using 0
  224. {
  225.   TF2 = 0;
  226.   if (PCON & GF0_) {//中斷是從主循環內跳入的才能喂狗
  227.     ClrWdt();//清除看門狗計數器
  228.     PCON &= ~GF0_;//清除標志
  229.   }
  230.   IoPinTest();
  231. }

  232. /*------------------------------------
  233.          串口中斷服務程序(錯誤報告)
  234. ------------------------------------*/
  235. void sioproc() interrupt SIO_VECTOR using 1
  236. {
  237. //unsigned char i;
  238.   if (RI) {//接收中斷
  239.     RI = 0;
  240.   }
  241.   if (TI) {//發送中斷
  242.     TI = 0;
  243.        if (SystemBuffers.SioTxCount) {//允許串口發送數據
  244.       SBUF = SystemBuffers.SioTxBuff[SystemBuffers.SioTxSum - SystemBuffers.SioTxCount];//串口顯示
  245.       SystemBuffers.SioTxCount --;
  246.     }
  247.   }
  248. }

  249. /*------------------------------------
  250.          外部INT0中斷服務程序
  251. ------------------------------------*/
  252. void int0proc() interrupt IE0_VECTOR using 0
  253. {
  254. }

  255. /*------------------------------------
  256.          外部INT1中斷服務程序
  257. ------------------------------------*/
  258. void int1proc() interrupt IE1_VECTOR using 0
  259. {
  260. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品欧美精品系列 | 国产一区二区在线播放视频 | 天天曰夜夜操 | 久久久久国产精品 | 一区二区三区视频在线免费观看 | 欧美精| 日韩欧美一区二区三区四区 | 久久久精品网 | 麻豆亚洲 | 国产精品久久 | 欧美日韩中文字幕 | 免费福利视频一区二区三区 | 黄色网络在线观看 | 亚洲一区二区三区四区在线观看 | 一级片免费在线观看 | 亚洲一区二区在线电影 | av男人的天堂在线 | 东方伊人免费在线观看 | 日韩在线观看 | 911精品国产 | 国产精品美女久久久久久不卡 | 成人精品一区二区三区中文字幕 | h片在线观看网站 | www视频在线观看 | 国产一区欧美 | 国产精品久久久久久久久久久久午夜片 | 久久er精品 | 天天射中文 | 男女午夜激情视频 | 日韩视频区 | 国产精品久久久精品 | 日韩av看片 | 亚洲精品在线免费看 | 美女黄视频网站 | 天天干天天操天天看 | 华丽的挑战在线观看 | 精品国产1区2区3区 一区二区手机在线 | 成人一级毛片 | 免费看大片bbbb欧美 | 久久久久久天堂 | 99成人|