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

📄 main.c

📁 由华邦单片机w78e516bc1来控制RC531设计的一款读写器
💻 C
字号:
/****************************************************************/
/* 	主程序文件
/* 	主要功能
/* 	1. 主程序入口
/* 	2. 初始化MCU
/* 	3. 中断服务程序
/* 	编制:
/* 	时间:
/* 
/* 	修改:wangwenqing 
/* 	时间:2003年9月05日
/****************************************************************/

#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include "main.h"
#include "globe.h"
#include "comm.h"
#include "lcd.h"
#include "rc531.h"
#include "key_drv.h"
#include "menu.h"
//w78e58管脚定义
sbit	LCD_LED=P1^0;
sbit	MFINT=P1^1;
sbit	WD=P1^2;
sbit	MFRST=P1^3;

/****************************************************************/
/* 函数名:initsys												*/
/* 功能说明:初始化MCU各个寄存器子程序							*/
/* 入口参数:N/A												*/
/* 出口参数:N/A												*/
/* 时间:  														*/
/* 作者:  														*/
/****************************************************************/
void initsys(void)
{
	TMOD = 0x21;			//定时器0,1工作在方式1,定时器1,1工作在方式2	
	TH0 = TM0_HIGH; 		//TIME0:4毫秒中断
	TL0 = TM0_LOW;			//初始化值=0Xf060
	TL1 = 0xFD;				//11.05M晶振, BPS=19200
	TH1 = 0xFD;				//定时器1,1工作在方式2,波特率发生器
	PCON = 0x80;			//SMOD=1,波特率加倍
	SCON = 0x40;			//UART串行口工作方式1,8位数据位,波特率与TIMER1有关
	REN = 1;				//允许串行口接收
	TR0 = 1;				//定时器0运行控制位
	TR1 = 1;				//定时器1运行控制位
	ES = 1;					//开放串行通道中断
	ET0 = 1;				//开放定时器0中断
	EA = 1;					//开总中断
	Keyscan_rdy=0;			//
}

/****************************************************************/
/* 函数名:TIMER0_ISR											*/
/* 功能说明:定时器0中断处理程序								*/
/* 入口参数:N/A												*/
/* 出口参数:N/A												*/
/* 时间:  														*/
/* 作者:  														*/
/****************************************************************/
void TIMER0_ISR(void) interrupt 1 using 1	//定时器0中断服务程序
{	
	 
	WD=~WD;					//喂狗
	TH0 = TM0_HIGH; 				//TIME0时间常数重载
	TL0 = TM0_LOW;
	Keyscan_rdy=1;					//允许键盘扫描
	if (LCD_LED==0)
	{
		ledcnt=ledcnt+1;
		if (ledcnt==1000)
		{
			LCD_LED=1;
			ledcnt=0;
		}
	}
	
	if (RS_RECVSTATUS > 1)
	{
		Timer0_Count ++;			//超时计数器+1
		if (Timer0_Count > TIMEOUT)		
		{
			Timer0_Count = 0;	
			RS_RECVSTATUS = 0;		//通信超时处理
			RS_RecvPoint = 0;		//接收指针清零
		}
	}
}

/****************************************************************/
/* 函数名:UART_TX_ISR											*/
/* 功能说明:UART中断处理程序									*/
/* 入口参数:N/A												*/
/* 出口参数:N/A												*/
/* 时间:  														*/
/* 作者:  														*/
/****************************************************************/
void UART_TX_ISR(void) interrupt 4 using 1	//串口中断服务程序
{
	uchar comm_buff;
	
    if (TI == 1)
    {
        TI = 0;
		if (RS_SENDSTATUS != 0)				//发送数据
		{
	        if(RS_SendPoint < RS_SendLen)
	        {
	            SBUF = PRO_SendBuf[RS_SendPoint++];
	        }
	        else
	        {
	            RS_SENDSTATUS = 0;
	        }
		}
    }
	
    if (RI == 1)
    {
        RI = 0;
		comm_buff = SBUF;						//UART数据寄存器
		switch (RS_RECVSTATUS)					//当前通信状态
		{
			case 0: 							//空闲状态
				if (comm_buff == DLE)			//第一个字符为DLE(0X10)
				{
					RS_SendPoint = 0;
					RS_SendLen = 0;
					SBUF = DLE;
					RS_RecvPoint = 0;			//接收指针清零
				}
				else if (comm_buff == STX)		//没有DLE照常命令操作
				{
					RS_RecvPoint = 0;			//接收指针清零
					RS_RECVSTATUS = 2;
					Timer0_Count = 0;			//定时器0计数器
				}
				break;
			case 1:
				RS_RecvPoint = 0;				//接收指针清零
				if (comm_buff == STX)			//Point=0;判断帧头字节02H
				{
					RS_RECVSTATUS = 2;
					Timer0_Count = 0;			//定时器0计数器
				}
				break;
			case 2: 							//Point=1;数据交换包序号
				PRO_RecvBuf[RS_RecvPoint++] = comm_buff;
				RS_RECVSTATUS = 3;
				break;
			case 3: 							//Point=2;通信命令字
				PRO_RecvBuf[RS_RecvPoint++] = comm_buff;
				RS_RECVSTATUS = 4;
				break;
			case 4: 							//Point=3;帧数据长度
				PRO_RecvBuf[RS_RecvPoint++] = comm_buff;
				RS_RecvLen = comm_buff; 		//数据长度字节
				RS_RecvLen++;					//长度+1包括BCC校验字
				RS_RECVSTATUS = 5;
				break;
			case 5: 							//Point=4 TO 4+LEN;帧数据内容
				PRO_RecvBuf[RS_RecvPoint++] = comm_buff;
				RS_RecvLen--;
				if (RS_RecvLen == 0)			//数据内容是否已到指定长度
				{
					RS_RECVSTATUS = 6;
				}
				break;
			case 6: 							//帧尾ETX字符
				if (comm_buff == ETX)
				{
					RS_RECVSTATUS = 7;
				}
				else
				{
					RS_RecvPoint = 0;
					RS_RECVSTATUS = 0;
				}
				break;
			default:
				RS_RecvPoint = 0;
				RS_RECVSTATUS = 0;
				break;
		}
    }
} 

//键盘处理程序
void testkey(void)
{
		_nop_();
		if(Keyscan_rdy==1)
		{
			Keyscan_rdy=0;
			Key_Scan();
		}
		if(Key_Waitpro==1)
			Key_Process();

}
//RC531初始化程序
void Init_RC531()
{	
	uchar	idata  temp;
	uchar	i;
	MFRST = 1;		//reset 531
	for (i=0;i<50;i++)
		_nop_();
	MFRST = 0;
	for (i=0;i<50;i++)
		_nop_();
	
	while(Command!=0)
	{
		WD=~WD;
		_nop_();
	}
	WD=~WD;
	Rc531_Bus_Sel();		//RC531总线选择	
	TxControl=0x5b;			//开启TX1、TX2
	TimerClock=0x0b;		//151us/per
	TimerControl=0x02;		//发送结束开定时器,接收开始关定时器
	TimerReload=0x42;		//10ms定时	
	InterruptEn=0x7f;		//关所有中断
	temp=InterruptEn;
	Int_Req=0x7f;			
	
}


/*************************************************************************/
/*函数名:main															*/
/*功能说明:主程序入口													*/
/*入口参数:N/A															*/
/*出口参数:N/A															*/
/* 时间:  																*/
/* 作者:  																*/
/************************************************************************/
void main(void)
{	
	WD=~WD;
	initsys();
	WD=~WD;
	InitLCD();
	WD=~WD;
	Init_TXBuf();
	WD=~WD;
	Init_RC531();
	WD=~WD;
	KeySet=0;			//密码验证模式默认为 KEY A
//	test531();
	MIF_Halt();
	Init_menu();
	Show_Str(1,1,str1);
	Show_Str(2,1,str2);
//	Disp_menu();
	while(1)
	{	
		testkey();
		RS_Proc();					//RS-232串口通信解帧处理
	}
		
}


	




































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -