📄 hhh.txt
字号:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Standard
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
Project :
Version :
Date : 2006-12-10
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega88
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include "mega88.h"
#include "sleep.h"
#include "DELAY.h"
#define NULL 0
#define NOP #asm("nop");
////////下面是引脚的定义
#define SEND PORTD.1
#define REND PIND.0
#define PW PORTD.6 ////触发引脚
#define M1 PORTC.0 ///电机
#define M2 PORTC.1 ///电机
#define K1 PIND.5 ////门未关好
#define K2 PINB.7 /// //反锁
#define K3 PINB.6 ///硬开门
#define p_U2270B PINB.5 ///读卡引脚
#define TRUE 1
#define FALSE 0
#define error 1000
#define scl PORTB.1////////i2c口
#define sda PINB.0 ////////i2c口
#define LED_RED PORTC.2///红灯
#define LED_BLUE PORTC.3 ///绿灯
#define mep PORTC.4 ///报警
#define SD_DAT PINB.2///时钟芯片数据
#define SD_CLK PORTB.3///////时钟芯片时钟
#define SD_RST PORTB.4///////////时钟芯片复位
/////下面是时间芯片命令的定义
#define READ_MAIN_MEMORY 0x30
#define MODFI_MAIN_MEMORY 0x38
#define READ_ENCRYPT_MEMORY 0x31
#define COMPARE_DATAS 0x33
#define READ_TIME_SEC 0x81
#define WRITE_TIME_SEC 0x80
#define READ_TIME_MIN 0x83
#define WRITE_TIME_MIN 0x82
#define READ_TIME_HR 0x85
#define WRITE_TIME_HR 0x84
#define READ_TIME_DAY 0x87
#define WRITE_TIME_DAY 0x86
#define READ_TIME_MON 0x89
#define WRITE_TIME_MON 0x88
#define READ_TIME_YEAR 0x8d
#define WRITE_TIME_YEAR 0x8c
#define READ_CON 0x8f
#define WRITE_CON 0x8e
#define READ_RAM 0xc0
#define WRITE_RAM 0xc1
/////////////////////////全局变量的定义
bit msg=0;
unsigned char SendStrlen=0;
unsigned char ReInterMber=0;
bit mesg=0;
unsigned int a;
unsigned char b;
unsigned char c;
unsigned char gai=1;
bit message ;
unsigned char buf1[25];
unsigned char buf2[25];
unsigned char tm1[5];
unsigned int buchang;
bit message5=0;
bit bit_fans; ////设置反锁功能
bit bit_baoj; ////设置报警功能
bit bit_guas; ////挂失标志位
bit bit_krkm=1; ////限制客人卡开门志位
// bit bit_gai=1;
//*********************************
//*********************************
//*********************************
//*********************************
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];
unsigned char temp232;
#if RX_BUFFER_SIZE0<256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif
// This flag is set on USART Receiver buffer overflow
//bit rx_buffer_overflow0;
unsigned char rx_buffer_overflow0;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer0[rx_wr_index0]=data;
if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0=0;
rx_buffer_overflow0=1;
};
};
//temp232=data;
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];
#if TX_BUFFER_SIZE0<256
unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
#else
unsigned int tx_wr_index0,tx_rd_index0,tx_counter0;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter0)
{
--tx_counter0;
UDR0=tx_buffer0[tx_rd_index0];
if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer //
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
{
tx_buffer0[tx_wr_index0]=c;
if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
++tx_counter0;
}
else
UDR0=c;
#asm("sei")
}
#pragma used-
#endif
//*******************
//*********************************
void Beetmap(unsigned char i)//报警函数
{
unsigned char a;
if(i==1)
{
mep=1;
LED_BLUE=0;
// LED_RED=0;
delay_ms(300);
mep=0;
LED_BLUE=1;
//LED_RED=1;
}
else
for(a=0;a<i;a++)
{
mep=1;
LED_RED=0;
//LED_BLUE=0;
delay_ms(120);
LED_RED=1;
// LED_BLUE=1;
mep=0;
delay_ms(80);
}
/*
while(1)
{
mep=1;
LED_RED=1;
LED_BLUE=0;
delay_ms(120);
LED_BLUE=1;
mep=0;
i--;
if (i==0)return;
delay_ms(80);
}
*/
}
//***************************
//***************************
void PwmRun()//////////启动128khz的输出信号
{
PRR=0x00;
TCNT2=0x00;
OCR2A=31;
TCCR2A=0x12;
TCCR2B=0x01;
DDRD.3=1;
}
//*******************************
//*******************************
//***********************
//***********************
void PwmStop()//////////关闭128khz的输出信号
{
PORTD.3=0;
TCCR2B=0x00;
TCCR2A=0x00;
//DDRD.3=0;
}
//**********************
//**********************
//**********************
void SystemInit()///////系统初始化
{
MCUCR = 0x00;
DDRD.2=1;
PORTD.2=1;/////i2c run
DDRD.6=1;
PORTD.6=0;////jd pow
DDRC.0=1;
DDRC.1=1; //
PORTC.0=0;
PORTC.1=0;//dj+-
DDRB.6=0; //k3
PORTB.6=1;
DDRB.5=0; //pwm in
PORTB.5=1;
DDRB.7=0; //k2
PORTB.7=1;
DDRD.5=0; //K1
PORTD.5=1;
DDRC.2=1;
PORTC.2=1;//LED_RED
DDRC.3=1;
PORTC.3=1; //LED_BLUE
DDRC.4=1; //map
PORTC.4=0;
DDRD.0=0;
PORTD.0=1;
DDRD.1=1;
PORTD.1=1;
DDRC.5=0;
PORTC.5=1;
DDRD.4=1;
PORTD.4=1;
/*
DDRB=0B00011010;
PORTB=0B11111111;
DDRC=0B11011111;
PORTC=0B11101100;
DDRD=0B11011110;
PORTD=0B10111111;
*/
message5=0;
// SREG|=0x80;//enable interrupt
}
//***********************
//***********************
void Wog_Enable()////////看门狗使能
{
SREG|=0x80;
WDTCSR=0x1f;
WDTCSR=0x44;
}
//**********************
//**********************
void Wog_Disable()////看门狗禁止
{
MCUSR=0;
WDTCSR=0x18;
WDTCSR=0;
}
//************************************
unsigned int returnb(unsigned char f)//////读一个周期信号
{
unsigned int a1,c1;
DDRB.5=0;
PORTB.5=1;
a1=0;c1=0;
if(f==0)
{
L: while(p_U2270B==0){a1++;if(a1>=3000)return error;}
NOP NOP NOP NOP NOP NOP
if(p_U2270B==0)goto L;
while(1)
{
c1++;
if(p_U2270B==0)
{
NOP NOP NOP NOP
if(p_U2270B==0)
{
if(c1>=350)return error;
else if(c1>=240)return 2;
else if(c1>=140)return 1;
else return 0;
}
else c1+=2;
}
else {if(c1>=345)return error;}
}
}
///////////////////////////////////////////////////
else
{
R: while(p_U2270B==1){a1++;if(a1>=3000)return error;}
NOP NOP NOP NOP
if(p_U2270B==1)goto R;
while(1)
{
c1++;
if(p_U2270B==1)
{
NOP NOP NOP NOP NOP NOP
if(p_U2270B==1)
{
if(c1>=120)return 1;
else return 0;
}
else c1+=2;
}
else {if(c1>=350)return error;}
}
}
}
//****************************
//****************************
void delay(unsigned int a)
{
unsigned int b;
for(b=0;b<a;b++){;;;;}
}
//****************************
//****************************
unsigned char Read_Car(unsigned char *pp)////////////读卡
{
unsigned char aaa;
unsigned int ff;
unsigned char mm;
unsigned char bb;
unsigned long ccc=0;
DDRD.4=1;
PORTD.4=1;
PORTB.5=1;
for(bb=0;bb<25;bb++)pp[bb]=0;
loop:
if(ccc>800)return 0; ///800
ff= returnb(0);
if(ff==error){ccc+=10;goto loop;}
if(ff==2){if(returnb(1)==0)goto lop;else {ccc+=10;goto loop;}}
else {ccc++;goto loop;}
lop:
delay(100);
aaa=0;
for(bb=0;bb<24;bb++)
{
for(mm=0;mm<8;mm++)
{
ff=returnb(aaa);
if((ff==error)||(ff==2)){ccc+=10;goto loop;}
else if(ff==1){if(aaa==0)aaa=1;else aaa=0;}
else
{
if(aaa==0)aaa=1;else aaa=0;
ff=returnb(aaa);
if(ff==0){if(aaa==0)aaa=1;else aaa=0;}
else {ccc++;goto loop;}
}
if(aaa==1)pp[bb]=pp[bb]+(1<<(7-mm));
}
}
return 1;
}
//*******************************
//*******************************
void write_bit(unsigned char x)//向卡写一个脉冲
{
if(x==1)
{
//p_U2270B_CFE=1;
PwmRun();
delay_us(270);//448*11.0592/120=42延时448us
//p_U2270B_CFE=0;
PwmStop();
delay_us(170);//280*11.0592/120=26写1
}
else if(x==0)
{
//p_U2270B_CFE=1;
PwmRun();
delay_us(90 );//192*11.0592/120=18
//p_U2270B_CFE=0;
PwmStop();
delay_us(170);//280*11.0592/120=26写0
}
}
//********************************************
//********************************************
void Aor_Wake_up(unsigned char *password)//////////密码换醒
{
unsigned int i,j;
unsigned char DATA;
PwmStop();
delay_us(200);//stgap>330us
write_bit(1);//写操作码1:10
write_bit(0);
for(i=0;i<4;i++)//block0数据
{
DATA=password[i];
for(j=0;j<8;j++)
{
if(DATA>=0x80)write_bit(1);
else write_bit(0);
DATA=DATA<<1;
}
}
PwmRun();
}
//*******************************
//*******************************
unsigned char Read_Card(unsigned char *buf,unsigned char *bufff)//////读卡两次并比较
{
unsigned char a2;
loop: for(a2=0;a2<24;a2++)buf[a2]=bufff[a2]; LED_RED=0;
if( Read_Car(bufff)==1)
{ LED_RED=1;
for(a2=0;a2<24;a2++)
{
if(bufff[a2]!=buf[a2])goto loop;
if((bufff[a2]==buf[a2])&&(a2>=23))return TRUE;
}
}
else return FALSE;
}
//***************************
//***************************
////下面是24c16芯片的驱动程序
//*******************************
void s24()//启动i2c总线
{
PORTB.0=1;
scl=1;
delay_us(50);
PORTB.0=0;delay_us(20);
scl=0;
delay_us(50);
}
//************************************
//************************************
p24()//停止i2c总线
{
scl=1;
delay_us(20);
PORTB.0=1;
delay_us(50);
}
//*************************************************
//*************************************************
unsigned char rd24()///读一字接
{
unsigned char a;
unsigned char b;
unsigned char A=0;
DDRB.0=0;
PORTB.0=1;
for(a=0;a<8;a++)
{
scl=1;
delay_us(50);
if(sda==1)b=1;
else b=0;
delay_us(50);
scl=0;
delay_us(50);
if(b==1)A+=1<<(7-a);
}
DDRB.0=1;
return A;
}
//******************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -