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

標題: STC單片機IO管腳毀壞動態自檢程序 [打印本頁]

作者: 51hei森林    時間: 2016-3-15 01:55
標題: STC單片機IO管腳毀壞動態自檢程序
  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. }
復制代碼







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品成人免费一区二区在线播放 | 日韩亚洲视频 | 欧美一区二区三区,视频 | 瑟瑟免费视频 | 成人精品高清 | 亚洲欧洲在线观看视频 | 国产91中文 | 成人在线观看欧美 | 国产福利91精品一区二区三区 | 91精品久久久 | 久久成人免费 | 欧美精品一区二区在线观看 | 久久免费精品视频 | 亚洲国产网址 | 亚洲精品一区二区三区中文字幕 | 一级黄a视频 | 免费av一区二区三区 | www.久久久久久久久久久 | 亚洲精品1 | 日本高清中文字幕 | 成人久久18免费网站麻豆 | www日本高清| 欧美精品在线观看 | 色综合99| 欧美精品一区二区三区在线播放 | 中文字幕一区二区三区在线观看 | 色婷婷在线视频 | 在线婷婷| 九色在线视频 | 伊人久操 | 中文字幕一区二区三区乱码在线 | 亚洲一区二区三区免费视频 | 丝袜美腿一区二区三区 | 国产日韩一区二区三区 | 国产高清精品在线 | 黄色一级大片在线免费看产 | 日韩伦理一区二区 | 国产中文在线观看 | 国产精品国产三级国产aⅴ入口 | 亚洲综合中文字幕在线观看 | 在线观看免费高清av |