📄 main.c
字号:
/****************************************************************************
* File: MAIN.C *
* Version: 1.0 *
* Created: 21.06.2005 *
* Last Change: 22.06.2005 *
* Author: yuanjun yin *
* Compiler: KEIL C51 uVision2 V2.23 *
* Description: 89C54RD+-Firmware for MFRC500 Demo Serial Reader *
****************************************************************************/
#include <stc89c54rd+.h>
#include "main.h"
unsigned int key_time;
uchar rxhead;
uint txhead=0;
uchar xdata receive_buf1[20];
unsigned char xdata send_buf1[20];
unsigned char data datalen;
unsigned int senddatalen;
unsigned char bell_sec;
unsigned int timecounter;
unsigned char callnumber=0;
uchar idata phonecode[]={1,3,3,8,10,10,9,9,1,1,6,0};// 本人通信号码
/////////////////////////////////////
sbit BELL=P4^1;
sbit CSE=P4^0;
sbit RSE=P2^1;
sbit WRE=P3^6;
sbit RDE=P3^7;
//sbit INT=P3^3;
sbit IRQ_PIN=P3^3;
///////////////////////////////////
void init(void);
unsigned char CMP_STRING(unsigned char *pt1,
unsigned char *pt2,unsigned char len);
unsigned char output(uchar hhh);
void write_eeprom(unsigned int addrdata,unsigned char data2);
void write_pagedata(unsigned char pagenumber);
unsigned char read_eeprom(unsigned int addrdata);
void erase_eeprom(unsigned char sectors);
void bell1(unsigned char dd);
void time2init(void);
void command_press(void);
uchar readsr(void);
void writesr(uchar a);
uchar readdata(void);
void writedata(uchar a);
void init_mt8888(void);
void dtmfout(void);
void delayms(uint n);
void sendDTMFdata(uchar d);
uchar GetDTMFdata(void);
void sendPhone(uchar *arr);
void open_power(void);
unsigned char bdata flag;
// sbit out_flag=flag^0;
// sbit up_flag=flag^1; //上活门标志
// sbit down_flag=flag^2; //下活门标志
// sbit life_flag=flag^3; //生死门标志
// sbit second_flag=flag^4; //输出二次标志
// sbit reset_flag=flag^5;
// sbit display_flag=flag^6;
// sbit desk_flag=flag^7;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
unsigned char bdata flag1;
// sbit M_FLAG=flag1^0;
// sbit HALF_FLAG=flag1^1;
// sbit SHORT_FLAG=flag1^2;
// sbit RCV_BIT=flag1^3;
// sbit M_DATA_FLAG=flag1^4;
sbit receive_flag=flag1^5;
// sbit R_MRC=flag1^6;
unsigned char bdata flag2;
sbit phone_flag=flag2^0;
sbit off_flag=flag2^1;
sbit on1_flag=flag2^2;
sbit off1_flag=flag2^3;
// sbit st_a4=flag2^4;
// sbit st_a5=flag2^5;
// sbit st_a6=flag2^6;
unsigned char bdata flag3;
// sbit st_e=flag3^0;
// sbit st_e1=flag3^1;
// sbit st_e2=flag3^2;
// sbit st_e3=flag3^3;
// sbit st_e4=flag3^4;
// sbit st_e5=flag3^5;
// sbit st_e6=flag3^6;
// sbit key_9=flag3^7;
unsigned char bdata flag4;
// sbit X_BIT=flag4^0;
// sbit M_KPFLG=flag4^1;
sbit bell_flag=flag4^2;
// sbit sec4=flag4^3;
// sbit sec5=flag4^4;
// sbit sec6=flag4^5;
// sbit sec7=flag4^6;
// sbit c_bit=flag4^7;
/****************************************************************************
****************************************************************************/
void main (void)
{
unsigned char counter,counter2,ttt;
unsigned char mfout=2;//readbuf[16];
unsigned char tt1[2];
unsigned char tt;
unsigned int i;
unsigned int count,yyjj;
init();
yyjj=12;
bell1(1);
// yyjyj=0;
ONTEL=0;
OUT1=1;
OUT2=1;
delayms(500);
init_mt8888();
OUT1=1; //打开电源
OUT2=1;
// sendPhone(phonecode);
// dtmfout();
for(;;)
{
if(phone_flag==1)
{
phone_flag=0;
open_power();
ONTEL=0;
}
// {
// delayms(60);
// i=GetDTMFdata();
// i=i&0x0f;
// if(i==5)
// {
// OUT1=!OUT1;
// OUT2=!OUT2;
/// }
// }
// i=10;
}
}
void open_power(void)
{
unsigned int ii;
OUT1=0;
OUT2=0;
for(ii=0;ii<65533;ii++);
for(ii=0;ii<65533;ii++);
OUT1=1;
OUT2=1;
}
/****************************************************************************
****************************************************************************/
void init (void)
{
IP=0x00;
TCON=1;
TMOD=0x21; //定时器0为8位自动重装;定时器1为16位计数器工作方式
time2init();
//外部中断0的触发方式为边沿方式
SCON=0x50;
PCON|=0x80; //dual 4800X2=9600
TH1=TL1=0xfa; //TH1=TL1=256-(11059200/4800/32/12+0.5)
// TH1=0xf8;
// TL1=0xa3;
TH0=0xfc;
TL0=0x21;
ET0=1;
EX0=1;
TR1=1;
TR0=1;
PS=1;
PX0=1;
ES=1;
EA=1;
}
void time2init(void)
{
T2MOD &= 0xFC; /* T2OE=0;定时器2输出不允许 */
T2MOD |= 0x01; /* DCEN=1;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/
EXF2=0; /* reset flag 定时器2外部标志位清除*/
TCLK=0;
RCLK=0; /* disable baud rate generator 不用于波特率发生器*/
EXEN2=0; /* ignore events on T2EX 视T2EX(P1.1)端信号无效*/
TH2=0xFd;//MSB_reload_value; /* Init msb_value 填入初始化值*/
TL2=0x16;//LSB_reload_value; /* Init lsb_value */
RCAP2H=0xfd;//MSB_reload_value; /* reload msb_value重载值 */
RCAP2L=0x16;//LSB_reload_value; /* reload lsb_value */
C_T2=0; /* timer mode 定时模式*/
CP_RL2=0; /* reload mode 重载模式*/
// EA=1; /* interupt enable 中断允许*/
ET2=1; /* enable timer2 interrupt 允许T2中断*/
TR2=1; /* timer2 run 开始计时*/
}
////////////////////////////////////////////////
void bell1(unsigned char dd)
{
if(dd==0)return;
else
{
bell_flag=1;
BELL=0;
bell_sec=dd;
}
}
///////////////////////////////////////////////////////////////////////////
void timer2(void) interrupt 5 using 3
{
key_time++;
timecounter++;
if(key_time>30000){callnumber=0;ONTEL=0;}
if(callnumber>200)
{
// OUT1=0;
// OUT2=0;
callnumber=0;
// ONTEL=1;
phone_flag=1;
}
TF2=0;
}
///////////////////////////////////////
void delay_10ms (uint _10ms)
{
ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
while (_10ms--)
{
while (!TF2)
{
// if (CmdValid || CmdReceived)
{
TR2 = FALSE;
TF2 = FALSE;
return;
}
}
TF2 = FALSE;
}
TR2 = FALSE;
}
/****************************************************************************
****************************************************************************/
void isr_timer0(void) interrupt 1 using 1
{
EA=0;
TL0=0x21;
TH0=0xfc;
EA=1;
}
/*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
uart interrupt 4
receive_send
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
void receive_send() interrupt 4
{
unsigned char s;
unsigned char bcc=0;
ES=0;
if(RI)
{
RI=0;
s=SBUF;
if((rxhead==0)&&(s!=0x02))
{
rxhead=0;
ES=1;
return;
}
if(rxhead==3)
{
datalen=s;
}
receive_buf1[rxhead++]=s;
if(rxhead==(datalen+5))
{
if(s==0x03)
{
receive_flag=1;
datalen=rxhead-3;
ES=1;
rxhead=0;
}
else
{
rxhead=0;
ES=1;
return;
}
}
}
else if(TI)
{
TI=0;
if(txhead>senddatalen+2)
{
txhead=0;
ES=1;
return;
}
SBUF=send_buf1[txhead];
txhead++;
ES=1;
return;
}
ES=1;
}
/***************************************************************************/
void EM_REV (void) interrupt 0 using 1
{
// phone_flag=1;
// timecounter=0;
key_time=0;
callnumber++;
}
/***************************************************************************/
//;;;;;;;;;;read inter data flash(EEPROM)program ;;;;;;;;;;;;;;;;
//;;;;;;;;;;;;;;ext address data is form 0~29696;;;;;;;;;;;;;;;;;;;;
unsigned char read_eeprom(unsigned int addrdata)
{
unsigned int address;
unsigned char data1;
address=0x2000+addrdata;
ISP_ADDRH=(unsigned char)(address>>8);
ISP_ADDRL=(unsigned char)address;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_BYTE_READ;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
;;;
data1=ISP_DATA;
return data1;
}
//;;;;;;;;;;write data flash(EEPROM) program;;;;;;;;;;;;;;;;;;
//;;;;;;;;;;;ext address 0~29696 data :;;;;;;;;;;;;;;;;;;;;
void write_eeprom(unsigned int addrdata,unsigned char data2)
{
unsigned int address;
address=0x2000+addrdata;
ISP_DATA=data2;
ISP_ADDRH=(unsigned char)(address>>8);
ISP_ADDRL=(unsigned char)address;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_BYTE_PROGRAM;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
}
/////////////////////////////////////////////////////////////////////////////
void erase_eeprom(unsigned char sectors)
{
unsigned int addr;
addr=0x2000+sectors*0x200; //89c51rc is 0x2000 89c54rd+ is 0x8000
ISP_ADDRH=(unsigned char)(addr>>8);
ISP_ADDRL=(unsigned char)addr;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_SECTOR_ERASE;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
}
///////////////////////////////////////////////////////////////////////////
void command_press(void)
{
unsigned char ss;
receive_flag=0;
ss=receive_buf1[1];
switch(ss)
{
case 0x01: //写卡数据处理
bell1(3);
break;
break;
default:
break;
}
}
////////////////////////////////////////////////////
uchar readsr(void)
{
uchar b;
WRE=1;
RDE=0;
RSE=1;
CSE=0;
_nop_();
_nop_();
b=P0&0x0f;
CSE=1;
return(b);
}
void writesr(uchar a)
{
WRE=0;
RDE=1;
RSE=1;
CSE=0;
_nop_();
_nop_();
P0=a;
_nop_();
_nop_();
CSE=1;
}
uchar readdata(void)
{
uchar b;
WRE=1;
RDE=0;
RSE=0;
CSE=0;
_nop_();
_nop_();
b=P0&0x0f;
CSE=1;
return(b);
}
void writedata(uchar a)
{
WRE=0;
RDE=1;
RSE=0;
CSE=0;
_nop_();
_nop_();
P0=a;
_nop_();
_nop_();
CSE=1;
}
void delayms(uint n)
{
uint b;
while(n>0)
{
for(b=0;b<100;b++);
n--;
}
}
void init_mt8888(void)
{
uchar a;
// P1=0;
// ONTEL=0;
delayms(100);
a=readsr();
writesr(0);
writesr(0);
writesr(8);
writesr(0);
a=readsr();
}
uchar GetDTMFdata(void) //接收一位号码
{
uchar i;
// control_status=0xfd; //设置:音频输出、DTMF、中断、下一次访问CRB
writesr(0xfd);
writesr(0);
i=readsr();
if(i&0x04)
{
//i=r_wDTMF;
i=readdata();
i&=0x0f; // 接收到有效号码
}
else
i=0;
return i; //没有接收到有效号码,返回0
}
void sendDTMFdata(uchar d) //发送一位号码
{
uchar i;
writedata(d);
IRQ_PIN=1;
while(IRQ_PIN);
// OUT1=!OUT1;
// OUT2=!OUT2;
delayms(800);
while(1)
{
i=readsr();
if(i&0x02)break;
}
OUT1=!OUT1;
OUT2=!OUT2;
}
void sendPhone(uchar *arr) //发送一个完整的电话号码,遇0停止("0"是字符数组的///////////结束标志符,而不是电话号码"0",电话号/码中//的"0"=10
{
uchar data *p;
ONTEL=1;
// control_status=0xfd;
// control_status=0; //CRB=0000
writesr(0xfd);
writesr(0);
for(p=arr;*p!=0;p++)
sendDTMFdata(*p);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -