標(biāo)題:
單片機(jī)定時器心跳沒有心跳,串口沒有通是怎么回事哪里有錯嗎?求大哥幫忙看下
[打印本頁]
作者:
小清新
時間:
2019-11-19 19:49
標(biāo)題:
單片機(jī)定時器心跳沒有心跳,串口沒有通是怎么回事哪里有錯嗎?求大哥幫忙看下
我用的stc15w4k32s4,兩個輸入接開關(guān),程序是檢測開關(guān),然后輸出兩個電機(jī),串口測試不通,定時器中斷里L(fēng)ED不閃
/*
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) //檢測字符串結(jié)束標(biāo)志
{
SendData(*s++); //發(fā)送當(dāng)前字符
}
}
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; //設(shè)置定時器為模式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 中斷服務(wù)程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
uart_rec[point] = SBUF; //P0顯示串口數(shù)據(jù)
point++;
num=0;
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙標(biāo)志
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1