📄 main.c
字号:
#include "STC12C2052AD.H"
#include <comm.h>
extern void _nop_(void);
//void comminit(void);
void sendbyte(unsigned char a[],unsigned char const size);
void sendbyteforyk(unsigned char a[],unsigned char const size);
//void testled(unsigned char times);
unsigned char code code6[6] = {0x11,0x00,0x00,0x04,0x01,0x02};
unsigned int ls;
unsigned char getkeycode(void);
unsigned char isuartlink(void);
void delay_50us(unsigned int _50us);
unsigned char writecode4toeeprom(unsigned char code4[]);
void readcode4foreeprom(unsigned char code4[]);
unsigned char iscode6(unsigned char ls[]);
unsigned char cal_crcm8(unsigned char ptr[], unsigned char len);
static bit procsucc = 1;
static bit iscommon1 = 0;
//EEPROM参数定义
#define READCMD 1
#define WRITECMD 2
#define ERASECMD 3
#define MYISPCONTR 0x83
//按键信号定义,低电平有效
sbit OPENDOOR0 = P3^4;
sbit CLOSEDOOR0 = P1^3; //锁门键
sbit QUIETORRXD0 = P3^5; //静音键
sbit COVERCTRL0 = P3^7;
//串口插入确认,低电平有效
sbit UARTACK0 = P3^3;
sbit UARTRUN0 = P1^5;//在对接交换码时输出长3秒的低电平
//遥控器指示灯
sbit LED0 = P1^2;
//遥控信号发射口
sbit REMOTECTRL = P1^4;//摇控发射口
//串口通讯:
//对换机制: 主机发送 55 55 f0 01 02 03 04 CRC8 01 02 03 04 05 06
// 遥控器接收到后先判断与本机的固定码是否相同,如果相同再校验CRC8,如果也正确,
//写入自已的eeprom
//读出EEPROM然后,然后发送55 55 f0 eeprom四个变码,固定码,crc8
//主机收到反回信息后,比较,如果无误发送55 55 12个a5(ACK) 给遥控器确认,当遥控器接收正确后,休眠机子
//如果遥控器没收到任意信号,延时1秒后退出,
//如果错误或没收到信号,主机将延时500ms,重发三次, 55 55 f0 01 02 03 04 01 02 03 04 05 06 CRC8,等待主机
//
//
//************************************通讯处理**************************************
void comminit(void);
static volatile unsigned char commcmdbuffer[3];//通讯缓冲
static volatile unsigned char commbuffer[11];//通讯缓冲
static bit iscmd0data1 = 0;
volatile unsigned char revpoint = 0;
void COMMISR (void) interrupt 4 using 1//串行通讯
{
if(RI)
{
RI = 0;
//如果头不为5555的话,恢复两个指针
if(!iscmd0data1)
{//地址
if(revpoint == 0)
{
commcmdbuffer[0] = SBUF;
revpoint++;
}
else if(revpoint == 1)
{
commcmdbuffer[1] = SBUF;
if(commcmdbuffer[0] != 0x55 || commcmdbuffer[1] != 0x55)
{
revpoint = 0;
}
else
{
revpoint++;
}
}
else
{
if(revpoint < 3)
{
commcmdbuffer[revpoint] = SBUF;
revpoint++;
}
}
if(revpoint == 3)
{
if((commcmdbuffer[2] & 0x0f) == ((~commcmdbuffer[2]) >> 4))
{//命令对
switch(commcmdbuffer[2] & 0x0f) //开关
{
case 0://查询固定码
ES = 0;
EX1 = 0;
iscommon1 = 1;
break;
case 1://交换申请
EX1 = 0;
iscmd0data1 = 1;
revpoint = 0;
iscommon1 = 1;
break;
default:
revpoint = 0;
break;
}
}
else
{//命令不对
// for(ls = 0;ls < 150;ls++)
// {
// LED0!=LED0;
// delay_50us(9000);
// }
revpoint = 0;
}
}
}
else
{//数据码
if(revpoint < 11)
{
commbuffer[revpoint] = SBUF;
revpoint++;
}
}
}
}
#define SENDCODE6ADDR 0x0177
#define SWAPCODE4ADDR 0x0199
//*******************************************************************************************
//******************************************主函数*******************************************
void main(void)
{
unsigned int lsi;
static bit isfirstrun;
unsigned char comtimeover;
//初始化程序
//P1M1 |= 0x10;
REMOTECTRL = 0;
TMOD=0x21;//时钟0为16位计数器
PCON = 0;
procsucc = 1;
isfirstrun = 1;
while(procsucc)//主循环
{
LED0 = 1;
//键盘扫描及处理程序
switch(getkeycode())
{
case 1://开门,命令编码为e1
LED0 = 0;
_nop_();_nop_();_nop_();
LED0 = 0;
readcode4foreeprom(commbuffer);
commbuffer[4] = code6[0];
commbuffer[5] = code6[1];
commbuffer[6] = 0xe1;
sendbyteforyk(commbuffer,7);
REMOTECTRL = 0;
//每个操作后应该休眠CPU以降低功耗
PCON |= 0x2;
while(1);
break;
case 2://关门,命令编码为d2
LED0 = 0;
_nop_();_nop_();_nop_();
LED0 = 0;
readcode4foreeprom(commbuffer);
commbuffer[4] = code6[0];
commbuffer[5] = code6[1];
commbuffer[6] = 0xd2;
sendbyteforyk(commbuffer,7);
REMOTECTRL = 0;
PCON |= 0x2;
while(1);
break;
case 3://车厢盖控制键,命令编码为c3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -