大家好,我是单片机初学者,下面是我编的程序,不知道哪里有问题,正常上电应该LED闪亮,可是上电后却没有反应,因为我只是个实习生,还没有发表日志的权限,所以借用下贵楼主的宝地一用,请大家多多指教。
#include <reg51.h>
#include <string.h>
#include <intrins.h>
#include "IAP.H"
#define Time_Delay 3000 //ms 闪速延时
#define AddrEXT 255
sbit LED_OUT = P3^7; //输出
sbit LED_1 = P1^2; //指示灯
sbit LED_IN = P1^5; //输入检测
bit kg = 0;
unsigned char Addr ;
unsigned char sendBuf[16];
unsigned char receBuf[16];
unsigned char receTimeOut = 0 ;
unsigned char receCount = 0 ;
unsigned char sendPosi = 0;
unsigned char sendCount = 0 ;
unsigned int Delay_ns = 0;
bit Delay_ns_bit = 0;
bit Delay_1ms_bit = 0;
unsigned char Uart_ERR = 0;
unsigned char Uart_ERR_H = 0;
unsigned char Uart_ERR_L = 0;
unsigned char LED_in = 0;
void Uart_One_Init(void); //串口1初始化
void send_str(unsigned char str[], unsigned char len); //串口1发送一段字符
void CheckUart(void);
void Uart_One_Init(void) //串口1初始化函数,波特率9600
{
TMOD = 0x20; //设置定时器1为工作方式2(8位的常数自动重新装载的定时器/计数器)定时器0 工作方式1
TH1 = 0xfd; //设置波特率为9600
TL1 = 0xfd;
TR1 = 1;
REN = 1;
SM0 = 0;
SM1 = 1;
EA = 1;
ES = 1;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
void int_t0(void) interrupt 1 using 2//1ms
{
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
Delay_1ms_bit = 1;
Delay_ns += 1;
if(Delay_ns>Time_Delay)
{
Delay_ns = 0;
Delay_ns_bit = 1;
}
}
void main() //主函数
{
Delay(10);
Addr = IapReadByte(IAP_ADDRESS);
if(Addr == 0xff)
{
Delay(10);
IapEraseSector(IAP_ADDRESS);
Delay(10);
IapProgramByte(IAP_ADDRESS, 0x10);
Delay(10);
Addr = IapReadByte(IAP_ADDRESS);
}
Uart_One_Init();//串口1初始化
Timer0Init();
while(1) //主循环体
{
LED_in = ~LED_IN;
if(kg) //关灯
{
LED_OUT = 0; //大灯
LED_1 = ~LED_OUT; //小灯
Delay_ns = 0 ;
Delay_ns_bit = 1;
}
else
{
if(Delay_ns_bit) //开灯
{
Delay_ns_bit = 0;
LED_OUT = ~LED_OUT; //大灯
LED_1 = ~LED_OUT; //小灯
}
}
if(Delay_1ms_bit)
{
Delay_1ms_bit = 0;
if(receTimeOut > 0)
{
receTimeOut--;
if(receTimeOut == 0 && receCount > 0)
{
CheckUart();
}
}
}
}
}
void beginSend(void)
{
sendPosi = 0;
if(sendCount > 1)
sendCount--;
SBUF = sendBuf[0];
}
void Uart_One_Receive() interrupt 4
{
unsigned char k = 0;
if(TI)
{
TI = 0;
if(sendPosi < sendCount)
{
sendPosi++;
SBUF = sendBuf[sendPosi];
}
else
{
receCount = 0;
}
}
else if(RI)
{
RI = 0;
receBuf[receCount] = SBUF;
receCount++;
receCount &= 0x0f;
receTimeOut = 20;
}
}
void CheckUart(void)
{
unsigned char i;
unsigned int tempData = 0;
if((receBuf[6] == Addr) || (receBuf[6] == AddrEXT) )
{
for(i = 0; i < receBuf[3]-2; i++ )
{
tempData += receBuf[i];
}
if((receBuf[7] == (unsigned char )(tempData >> 8) ) && (receBuf[8] == (unsigned char)(tempData & 0xff) ) )
{
if((receBuf[0] == 0xcc) && (receBuf[1] == 0xcc) )
{
Uart_ERR_H = 0;
Uart_ERR_L = 0;
if(receBuf[2] == 0x4b )
{
kg = 0 ;
}
else if (receBuf[2] ==0x47 )
{
kg=1;
Uart_ERR_L=kg;
}
else if (receBuf[2]==0x43 )
{
Uart_ERR_L = LED_in ;
}
else if (receBuf[2]==0x50 )
{
kg = 1 ;
}
else if ((receBuf[2]==0x51 )&&(receBuf[6]==AddrEXT ))
{
EA = 0;
Delay(10);
IapEraseSector(IAP_ADDRESS);
Delay(10);
IapProgramByte(IAP_ADDRESS, receBuf[5]);
Delay(10);
Addr = IapReadByte(IAP_ADDRESS);
EA = 1;
}
else if ((receBuf[2] == 0x52 )&&(receBuf[6] == AddrEXT ))
{
Uart_ERR_L = Addr ;
}
else
{
Uart_ERR_H = 1;
}
}
else
{
Uart_ERR_H = 2;
}
}
else
{
Uart_ERR_H = 3;
}
sendBuf[0] = 0xCC;
sendBuf[1] = 0xCC;
sendBuf[2] = receBuf[2];
sendBuf[3] = 0x09;
sendBuf[4] = Uart_ERR_H;
sendBuf[5] = Uart_ERR_L;
sendBuf[6] = Addr ;
for(i = 0; i<(sendBuf[3]-2); i++ )
{
tempData += sendBuf[i];
}
sendBuf[7] = (unsigned char )(tempData >> 8);
sendBuf[8] = (unsigned char)(tempData & 0xff);
sendCount = 9;
beginSend();
}
receCount = 0 ;
}
|