我用的stc15w4k32s4,两个输入接开关,程序是检测开关,然后输出两个电机,串口测试不通,定时器中断里LED不闪
- /*
- GPIO P.21、P2.2为输入
- GPIO P2.3、P2.0、P4.7为输出
- PxM0 PxM1
- 0 0 双向
- 0 1 输入
- 1 0 输出
- 1 1 开漏
- */
- #include "intrins.h"
- #include <string.h>
- #include "STC15W4K32S4.h"
- #include "main.h"
- #include "eep.h"
-
- #define HR2 P21
- #define HR1 P22
- #define LED P23
- #define DJ P20
- #define SB P37
- #define IAP_ADDRESS 0x0000
-
- #define AD_TEMP 100
- #define SB_TIME 24
- //
- #define S1_S0 0x40 //P_SW1.6
- #define S1_S1 0x80 //P_SW1.7
- #define T1MS (65536-FOSC/1000) //10T模式
- typedef unsigned char uchar;
- unsigned char uart_rec[MAX],busy,point,sb_time;
- unsigned int num;
- void clear_uart_buf(char len)
- {
- char i;
- for(i=0;i<=len;i++)
- uart_rec[i]='\0' ;
- point=0;
- // num=0;
- }
- char AscToHex(char *Asc)
- {
- uchar temp[2],i;
- for(i=0;i<2;i++)
- {
- if((*Asc>='0')&&(*Asc<='9'))
- temp[i]= *Asc-'0';
- else if((*Asc>='A')&&(*Asc<='F'))
- temp[i]= *Asc-55;
- Asc++;
- }
- temp[0]=(temp[0]<<4)+temp[1];
- return temp[0];
- }
- void SendData(char dat)
- {
- while(busy);
- busy=1;
- SBUF=dat;
- }
- void uart_send(char *s)
- {
- while (*s) //检测字符串结束标志
- {
- SendData(*s++); //发送当前字符
- }
- }
- void Delay1ms(int n) //@11.0592MHz
- {
- unsigned int j;
- while(n--)
- {
- _nop_();
- _nop_();
- _nop_();
- j = 400;
- while (--j);
- }
- }
- void UartInit(void) //9600bps@11.0592MHz
- {
- ACC = P_SW1;
- ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
- P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
- SCON = 0x50;
- AUXR |= 0x40;
- TMOD |= 0x20;
- TL1 = (256 - (FOSC/4/BAUD));
- TH1 = (256 - (FOSC/4/BAUD));
- TR1 = 1;
- ES = 1;
- EA = 1;
- }
- void time0_init()
- {
-
- AUXR |= 0x80; //定时器0为1T模式
- // AUXR &= 0x7f; //定时器0为12T模式
- TMOD |= 0x00; //设置定时器为模式0(16位自动重装载)
- TL0 = T1MS; //初始化计时值
- TH0 = T1MS >> 8;
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- EA = 1;
- }
- void GPIO_init(void)
- {
- P2M1 = 0x06;
- P2M0 = 0x09;
- P3M1 = 0x00;
- P3M0 = 0x80;
- SB = 0;
- DJ = 0;
- LED = 0;
- }
- void moto_start(uchar i,uchar t)
- {
- DJ=1;
- if(i==0)
- {while(t--)
- {while(HR2==1)
- ;
- }
- }
- if(i==1)
- {while(t--)
- {while((HR2==1)&&(HR1==1))
- ;
- }
- }
- DJ=0;
- }
- void moto_SB(unsigned int t)
- {
- sb_time=t;
- SB = 1;
- while(sb_time)
- ;
- SB = 0;
- }
- void write_eep()
- {
- IapEraseSector(IAP_ADDRESS);
- sb_time=AscToHex(uart_rec+7);
- IapProgramByte(IAP_ADDRESS,sb_time);
- }
- void read_eep()
- {
- sb_time=IapReadByte(IAP_ADDRESS);
- if(sb_time==0xff)
- sb_time=SB_TIME;
- }
- void Command()
- {
- char com;
- com=40;
- // if((num==0)&&(num>100))
- // {
- if(strcmp(uart_rec,"ADD1"))
- com=1;
- else if(strcmp(uart_rec,"ADD2"))
- com=2;
- else if(strcmp(uart_rec,"ADD3"))
- com=3;
- else if(strcmp(uart_rec,"ADD4"))
- com=4;
- else if(strcmp(uart_rec,"ADD5"))
- com=5;
- else if(strstr(uart_rec,"ADD6"))
- com=6;
- else if(strcmp(uart_rec,"ADD7"))
- com=7;
- else if(strcmp(uart_rec,"ADD8"))
- com=8;
- else if(strcmp(uart_rec,"SETTIME"))
- com=9;
- switch(com)
- {
- case 1:
- uart_send("OK");
- moto_start(0,1);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- break;
- case 2:
- uart_send("OK");
- moto_start(0,2);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- break;
- case 3:
- uart_send("OK");
- moto_start(0,3);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- case 4:
- uart_send("OK");
- moto_start(0,4);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- break;
- case 5:
- uart_send("OK");
- moto_start(0,5);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- break;
- case 6:
- uart_send("OK");
- moto_start(0,6);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- break;
- case 7:
- uart_send("OK");
- moto_start(0,7);
- moto_SB(sb_time);
- clear_uart_buf(MAX);
- break;
- case 8:
- uart_send("OK");
- moto_start(1,8);
- moto_SB(sb_time/2);
- clear_uart_buf(MAX);
- break;
- case 9:
- uart_send("OK");
- write_eep();
- clear_uart_buf(MAX);
- break;
- default:
- // clear_uart_buf(MAX);
- break;
- }
- // }
- return;
- }
- void system_init()
- {
- UartInit();
- time0_init();
- GPIO_init();
- read_eep();
- busy=0;
- clear_uart_buf(MAX);
- }
- void main()
- {
- system_init();
- uart_send("start ok\n\r");
- while(1)
- {
- Command();
- }
- }
- /* Timer0 interrupt routine */
- void tm0_isr() interrupt 1 using 1
- {
- num++;
- if((num%1000) == 0)
- {
- sb_time--;
- LED=!LED;
- num = 0;
- }
- }
- /*----------------------------
- UART 中断服务程序
- -----------------------------*/
- void Uart() interrupt 4 using 1
- {
- if (RI)
- {
- RI = 0; //清除RI位
- uart_rec[point] = SBUF; //P0显示串口数据
- point++;
- num=0;
- }
- if (TI)
- {
- TI = 0; //清除TI位
- busy = 0; //清忙标志
- }
- }
复制代码 |