找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 920|回复: 0
打印 上一主题 下一主题
收起左侧

单片机定时器心跳没有心跳,串口没有通是怎么回事哪里有错吗?求大哥帮忙看下

[复制链接]
跳转到指定楼层
楼主
ID:249703 发表于 2019-11-19 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的stc15w4k32s4,两个输入接开关,程序是检测开关,然后输出两个电机,串口测试不通,定时器中断里LED不闪
  1. /*
  2.    GPIO P.21、P2.2为输入
  3.    GPIO P2.3、P2.0、P4.7为输出
  4.         PxM0 PxM1
  5.           0          0                 双向
  6.           0   1                 输入
  7.           1   0                 输出
  8.           1   1                 开漏
  9. */
  10. #include "intrins.h"
  11. #include  <string.h>
  12. #include "STC15W4K32S4.h"
  13. #include "main.h"
  14. #include "eep.h"
  15.            


  16. #define HR2           P21
  17. #define HR1         P22        
  18. #define LED                P23        
  19. #define DJ                P20
  20. #define SB                P37

  21. #define IAP_ADDRESS 0x0000
  22.                                 
  23. #define         AD_TEMP 100
  24. #define SB_TIME 24
  25. //
  26. #define S1_S0 0x40              //P_SW1.6
  27. #define S1_S1 0x80              //P_SW1.7



  28. #define T1MS (65536-FOSC/1000)      //10T模式


  29. typedef unsigned char uchar;
  30. unsigned char uart_rec[MAX],busy,point,sb_time;
  31. unsigned int num;


  32. void clear_uart_buf(char len)
  33. {
  34.     char i;
  35.     for(i=0;i<=len;i++)
  36.         uart_rec[i]='\0' ;
  37.     point=0;
  38. //        num=0;
  39. }


  40. char AscToHex(char *Asc)
  41. {
  42.     uchar temp[2],i;
  43.     for(i=0;i<2;i++)
  44.     {
  45.         if((*Asc>='0')&&(*Asc<='9'))
  46.             temp[i]= *Asc-'0';
  47.                 else if((*Asc>='A')&&(*Asc<='F'))
  48.                         temp[i]= *Asc-55;
  49.             Asc++;
  50.     }
  51.     temp[0]=(temp[0]<<4)+temp[1];
  52.     return temp[0];
  53. }


  54. void SendData(char dat)
  55. {
  56.         while(busy);
  57.         busy=1;
  58.         SBUF=dat;
  59. }

  60. void uart_send(char *s)
  61. {   
  62.     while (*s)                  //检测字符串结束标志
  63.     {
  64.         SendData(*s++);         //发送当前字符
  65.     }

  66. }

  67. void Delay1ms(int n)                //@11.0592MHz
  68. {
  69.         unsigned int  j;
  70.           while(n--)
  71.         {
  72.                 _nop_();
  73.                 _nop_();
  74.                 _nop_();
  75.                 j = 400;
  76.                         while (--j);
  77.         }
  78. }

  79. void UartInit(void)                //9600bps@11.0592MHz
  80. {
  81.         ACC = P_SW1;
  82.     ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  83.     P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)

  84.                 SCON = 0x50;
  85.     AUXR |= 0x40;               
  86.     TMOD |= 0x20;               
  87.     TL1 = (256 - (FOSC/4/BAUD));   
  88.     TH1 = (256 - (FOSC/4/BAUD));
  89.     TR1 = 1;                    
  90.     ES = 1;                  
  91.     EA = 1;         
  92. }


  93. void time0_init()
  94. {
  95.         
  96.         AUXR |= 0x80;                   //定时器0为1T模式
  97.         //  AUXR &= 0x7f;                   //定时器0为12T模式

  98.     TMOD |= 0x00;                    //设置定时器为模式0(16位自动重装载)
  99.     TL0 = T1MS;                     //初始化计时值
  100.     TH0 = T1MS >> 8;
  101.     TR0 = 1;                        //定时器0开始计时
  102.     ET0 = 1;                        //使能定时器0中断
  103.     EA = 1;
  104. }


  105. void GPIO_init(void)
  106. {
  107.         P2M1 = 0x06;
  108.         P2M0 = 0x09;
  109.         P3M1 = 0x00;
  110.         P3M0 = 0x80;
  111.         SB = 0;
  112.         DJ = 0;
  113.         LED = 0;
  114. }

  115. void moto_start(uchar i,uchar t)
  116. {
  117.         DJ=1;
  118.         if(i==0)
  119.                 {while(t--)
  120.                         {while(HR2==1)
  121.                         ;
  122.                         }
  123.                 }
  124.         if(i==1)
  125.                 {while(t--)
  126.                         {while((HR2==1)&&(HR1==1))
  127.                         ;
  128.                         }
  129.                 }
  130.         DJ=0;
  131. }
  132. void moto_SB(unsigned int t)        
  133. {
  134.         sb_time=t;
  135.         SB = 1;
  136.         while(sb_time)
  137.                 ;
  138.         SB = 0;
  139. }        
  140. void write_eep()
  141. {
  142.                 IapEraseSector(IAP_ADDRESS);
  143.           sb_time=AscToHex(uart_rec+7);
  144.           IapProgramByte(IAP_ADDRESS,sb_time);
  145. }
  146. void read_eep()
  147. {
  148.         sb_time=IapReadByte(IAP_ADDRESS);
  149.         if(sb_time==0xff)
  150.                 sb_time=SB_TIME;
  151. }
  152. void Command()
  153. {
  154.         char com;
  155.              com=40;
  156. //        if((num==0)&&(num>100))
  157. //        {                        
  158.         if(strcmp(uart_rec,"ADD1"))                  
  159.                         com=1;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
  160.         else if(strcmp(uart_rec,"ADD2"))         
  161.                         com=2;        
  162.                                 else if(strcmp(uart_rec,"ADD3"))         
  163.                         com=3;        
  164.         else if(strcmp(uart_rec,"ADD4"))                  
  165.                         com=4;
  166.         else if(strcmp(uart_rec,"ADD5"))         
  167.                         com=5;        
  168.                                 else if(strstr(uart_rec,"ADD6"))         
  169.                         com=6;        
  170.         else if(strcmp(uart_rec,"ADD7"))                  
  171.                         com=7;
  172.         else if(strcmp(uart_rec,"ADD8"))         
  173.                         com=8;                        
  174.         else if(strcmp(uart_rec,"SETTIME"))         
  175.                         com=9;
  176.                 switch(com)
  177.                 {

  178.                         case 1:
  179.                                 uart_send("OK");
  180.                                 moto_start(0,1);
  181.                           moto_SB(sb_time);        
  182.                                 clear_uart_buf(MAX);
  183.                                 break;                        
  184.                         case 2:
  185.                                 uart_send("OK");
  186.                                 moto_start(0,2);
  187.                           moto_SB(sb_time);        
  188.                           clear_uart_buf(MAX);
  189.                                 break;                        
  190.                         case 3:
  191.                                 uart_send("OK");
  192.                                 moto_start(0,3);
  193.                           moto_SB(sb_time);        
  194.                           clear_uart_buf(MAX);        
  195.                         case 4:
  196.                                 uart_send("OK");
  197.                                 moto_start(0,4);
  198.                           moto_SB(sb_time);
  199.                                 clear_uart_buf(MAX);
  200.                                 break;                                
  201.                         case 5:
  202.                                 uart_send("OK");
  203.                                 moto_start(0,5);
  204.                           moto_SB(sb_time);        
  205.                                 clear_uart_buf(MAX);
  206.                                 break;        
  207.                         case 6:
  208.                                 uart_send("OK");
  209.                                 moto_start(0,6);
  210.                           moto_SB(sb_time);
  211.                                 clear_uart_buf(MAX);
  212.                                 break;                                
  213.                         case 7:
  214.                                 uart_send("OK");
  215.                                 moto_start(0,7);
  216.                           moto_SB(sb_time);        
  217.                                 clear_uart_buf(MAX);
  218.                                 break;        
  219.                         case 8:
  220.                                 uart_send("OK");
  221.                                 moto_start(1,8);
  222.                           moto_SB(sb_time/2);        
  223.                                 clear_uart_buf(MAX);
  224.                                 break;               
  225.                         case 9:
  226.                                 uart_send("OK");
  227.                                 write_eep();
  228.                                 clear_uart_buf(MAX);
  229.                                 break;               
  230.                         default:
  231. //                          clear_uart_buf(MAX);
  232.                                 break;                                 
  233.                   }
  234. //        }
  235.                    return;
  236. }

  237. void system_init()
  238. {
  239.         UartInit();
  240.         time0_init();
  241.         GPIO_init();
  242.         read_eep();
  243.         busy=0;
  244.         clear_uart_buf(MAX);
  245. }
  246. void main()
  247. {

  248.     system_init();                                                                    
  249.         uart_send("start ok\n\r");
  250.     while(1)
  251.     {
  252.                 Command();
  253.         }

  254. }


  255. /* Timer0 interrupt routine */
  256. void tm0_isr() interrupt 1         using 1
  257. {
  258.         num++;
  259.         if((num%1000) == 0)
  260.                 {                        
  261.                         sb_time--;        
  262.                         LED=!LED;
  263.                         num = 0;                        
  264.                 }
  265. }

  266. /*----------------------------
  267. UART 中断服务程序
  268. -----------------------------*/
  269. void Uart() interrupt 4 using 1
  270. {
  271.     if (RI)
  272.     {
  273.                         RI = 0;                 //清除RI位
  274.                         uart_rec[point] = SBUF; //P0显示串口数据
  275.                         point++;      
  276.                         num=0;
  277.     }
  278.     if (TI)
  279.     {
  280.         TI = 0;                 //清除TI位
  281.         busy = 0;               //清忙标志
  282.     }
  283. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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