找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2343|回复: 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 单片机教程网

快速回复 返回顶部 返回列表