📄 main.c
字号:
#include<REG922.h>
#include <absacc.h>
#include "string.h"
#include "intrins.h"
#include "ports.h"
#include "osc.h"
#include "uart.h"
#include "rtc.h"
#include "power.h"
#include "watchdogrtc.h "
#include "IAP_LITE.H"
bit T_flag=0,set=0,set_ok;
void Send_ok(unsigned char key);
unsigned char ADDR,RX_addr=0,key_tem=01;
unsigned char wring_send_times=0;
//************************程序用的变量********************
unsigned char data RXtem[6], RXdata[6];//程序接收数据缓冲区
unsigned char data RXNOM,RXSTAT=0;
unsigned char data RXTimerOUT,i; //接收超时
bit rxok; // 接收完成标志
/****************************************************************************/
void Delay100ms(unsigned char x)
{
unsigned char i,j;
while(x-- != 0)
{
for (j = 0;j < 114; j++)
{
if(rxok)
{
rxok=0;
Send_ok(key_tem);
i=0;
}
for (i = 0;i < 88; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;};
}
}
}
/****************************************************************************/
void Delay1ms(unsigned char idata x)
{
unsigned char i;
while(x-- != 0)
{
if(rxok)
{
rxok=0;
Send_ok(key_tem);
i=0;
}
for (i = 0;i < 89; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;};
}
}
/****************************************************************************/
void Delay1msa(unsigned char idata x)
{
unsigned char i;
while(x-- != 0)
{
for (i = 0;i < 89; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
_nop_() ;_nop_() ;_nop_() ;};
}
}
/***********************************************************************
DESC: Initializes UART for mode 1
Baudrate: 9600
RETURNS: Nothing
CAUTION: If interrupts are being used then EA must be set to 1
after calling this function
************************************************************************/
void uart_init(void)
{
// configure UART
// clear SMOD0
PCON &= ~0x40;
SCON = 0x50;
// set or clear SMOD1
PCON &= 0x7f;
PCON |= (0 << 8);
SSTAT = 0x00;
// enable break detect
AUXR1 |= 0x40;
// configure baud rate generator
BRGCON = 0x00;
BRGR0 = 0xF0;
BRGR1 = 0x02;
BRGCON = 0x03;
// TxD = push-pull, RxD = input
P1M1 &= ~0x01;
P1M2 |= 0x01;
P1M1 |= 0x02;
P1M2 &= ~0x02;
// initially not busy
// set isr priority to 0
IP0 &= 0xEF;
IP0H &= 0xEF;
// enable uart interrupt
ES = 0;
} // uart_init
/***********************************************************************
DESC: Initializes the ports
RETURNS: Nothing
CAUTION: Call before the initialization functions of other peripherals
************************************************************************/
void ports_init(void)
{
P0M1 &= 0xF0;
P0M2 &= 0xF0;
P1M1 |= 0x2C;
P1M2 &= 0xDF;
P1M2 |= 0x0C;
} // ports_init
//*******************add**********************************************
/****************************************************************************
* *
* Function: START_T0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void START_T0(unsigned char x)
{
ET0 = 0 ;
TR0 = 0;
RXTimerOUT = x ;
TL0 = 0;
TH0 = 0;
TR0 = 1;
ET0 = 1 ;
}
/****************************************************************************
* *
* Function: CALL_isr_T0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void CALL_isr_T0(void)
{
TR0 = 0;
RXTimerOUT = 0;
TF0 = 1;
}
//********************串口中断处理程序**************************************************************
void ub1ISR(void) interrupt 4 using 1
{
unsigned char c;
if ( RI ) // Receive Command
{
// RXTimerOUT=10;
RI = 0;
c = SBUF;
switch(RXSTAT)
{
case 0: //接受帧头02
if(c==0x55)
{RXSTAT=1;START_T0(20);}
else
CALL_isr_T0();
break;
case 1: //接收
if(c==0xaa)
{
RXSTAT=2;
START_T0(20);
}
else
{
if(c==0xbb)
{
if(!ISP)
{
set=1;
RXSTAT=2;
START_T0(20);
}
}
else
{
RXSTAT=0;
CALL_isr_T0();
}
}
// RXSTAT=0;
break;
case 2:
if(c==ADDR)
{
RXSTAT=3;
START_T0(20);
}
else
{
RXSTAT=0;
CALL_isr_T0();
}
i=0;
break;
case 3:
if(c==ADDR)
{
if(set)
{
RXSTAT=4;
START_T0(20);
}
else
{
RXSTAT=0;
rxok=1;
CALL_isr_T0();
}
}
break;
case 4:
RX_addr=c;
set_ok=1;
set=0;
RXSTAT=0;
CALL_isr_T0();
break;
default:
RXSTAT=0;
break;
}
}
else
{
TI=0;
}
}
/*************************原有的函数需改变*************************************
* *
* Function: isr_timer0 *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void isr_timer0(void) interrupt 1 using 2
{
TR0=0;
if(RXTimerOUT!=0) //此if{}else{} 为新加入的判断超时功能
{
RXTimerOUT--;
}
else
{
RXSTAT=0;
RXNOM=0;
set=0;
}
TH0=0Xac;
TL0=0X95;
TR0=1;
}
//**********************************************************
void Send_ok(unsigned char key)
{
unsigned char i;
ES=0;
TX_EN=1;
Delay1msa(10);
for(i=0;i<3;i++)
{
SBUF = 0x88; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
SBUF = 0xff; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
SBUF = key; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
SBUF = key; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
}
if(key_tem==0x02)
{
wring_send_times--;
if(wring_send_times==0)
{
key_tem=0x01;
}
}
else
{
key_tem=0x01;
}
TX_EN=0;
Delay1msa(4);
ES=1;
}
/******************************************************************
* 名称:UART_SendByte
* 功能:向串口发送字节数据。
* 入口参数:dat 待发送的数据
* 出口参数:无
******************************************************************
void UART_SendByte(uint8 dat)
{ SBUF = dat; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
}
/******************************************************************
* 名称:UART_SendCode
* 功能:读取FLASH中的数据,并发送到串口。
* 入口参数:addr 读取的起始地址
* no 读取的数据个数
* 出口参数:无
******************************************************************
void UART_SendCode(uint16 addr, uint16 no)
{ uint8 code *readp;
readp = addr;
for(; no>0; no--)
{ UART_SendByte(*readp++); // 读取数据并发送
}
}
*/
void flash_led(unsigned char j )
{
char i;
for(i=0;i<j;i++)
{
LED=0;
Delay1ms(50);
LED=1;
Delay1ms(50);
}
LED=1;
}
//******************************************************************
//**********************************************************
void Setok(void)
{
ES=0;
SBUF ='O'; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
SBUF = 'K'; // 发送数据
while(0==TI); // 等待发送完毕
TI = 0; // 清除发送标志
ES=1;
}
//**************************************************************
void main(void)
{
unsigned char Link_ok=0,j,CS_state=0;
ports_init();
if(ISP)
{
user_uart_init();//用户串口初始化
watchdog_init();//初始化看门狗
}
else
{
uart_init(); //进入ISP模式
FLASH_WriteByte(0xc04, 0);
}
osc_init();
rtc_init();
EA=1;
ES=1;
CS=0;
TX_EN=0; //接收状态
PWR =1;
//rtc_start();
LED=0;
Delay100ms(2);
LED=1;
if((FLASH_ReadByte(0XC05)==0x55)&(FLASH_ReadByte(0XC06)==0xaa))//初始化模块的ID
{
EA=0;
ADDR=FLASH_ReadByte(0XC04);
EA=1;
//FLASH_WriteByte(0xc04, 0);
}
else
{
ADDR=0;
EA=0;
FLASH_WriteByte(0xc04, 0);
FLASH_WriteByte(0xc05, 0x55);
FLASH_WriteByte(0xc06, 0xAA);
EA=1;
}
//ADDR=0;
while(1)
{
if(ISP)
{
watchdog_start();
if(!KEY){wring_send_times=3; key_tem=0x02; LED=0; Delay100ms(2); LED=!LED;LED=0; Delay100ms(2); LED=!LED;}//有键按下
watchdog_feed();
if(rxok)
{
rxok=0;
Send_ok(key_tem);
flash_led(4);
i=0;
LED=1;
Link_ok=1;
watchdog_feed();
}
if(set_ok)//设置模块的ID
{
watchdog_feed();
set_ok=0;
Send_ok(key_tem);
watchdog_feed();
EA=0;
FLASH_WriteByte(0xc04,RX_addr); //存入新ID
EA=1;
ADDR=RX_addr;
LED=0;
flash_led(4);
i=0;
LED=1;
Link_ok=1;
watchdog_feed();
}
rtc_start();
switch(CS_state)
{
case 0:
CS=0;
if(T_flag)
{
watchdog_feed();
rtc_stop();
T_flag=0;
i++;
if(i>3)
{
i=0;
watchdog_feed();
if(Link_ok)
{
Link_ok=0;
watchdog_feed();
}
else
{
LED=0;
Delay1ms(50);
LED=1;
j++;
watchdog_feed();
CS_state=1;
if(j>10)
{
j=0;
DIVM =0x00;
watchdog_feed();
power_mode(POWER_TOTALPOWERDOWN);//休眠
}
}
}
}
break;
case 1:
CS=1;
if(T_flag)
{
watchdog_feed();
rtc_stop();
T_flag=0;
i++;
if(i>3)
{
i=0;
watchdog_feed();
if(Link_ok)
{
Link_ok=0;
watchdog_feed();
}
else
{
LED=0;
Delay1ms(50);
LED=1;
j++;
watchdog_feed();
CS_state=0;
if(j>10)
{
j=0;
DIVM =0x00;
watchdog_feed();
power_mode(POWER_TOTALPOWERDOWN);//休眠
}
}
}
}
break;
default:
CS_state=0;
break;
}//end swtich
}
else
{
LED=!LED;
Delay100ms(10);
if(set_ok)//设置模块的ID
{
watchdog_feed();
set_ok=0;
EA=0;
FLASH_WriteByte(0xc04,RX_addr); //存入新ID
EA=1;
ADDR=RX_addr;
LED=0;
flash_led(4);
i=0;
LED=1;
Link_ok=1;
watchdog_feed();
Setok();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -