📄 main.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 + -