⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 遥控器源程序:带加密算法的遥控器.其中涉及CRC验证.按键处理.头码。STC的一方操作等
💻 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 + -