📄 2260.c
字号:
//ICC-AVR application builder : 2008-6-24 22:38:41
// Target : M32
// Crystal: 4.0000Mhz
#include <iom32v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//==============================================================================
//口线定义
#define wuxian_js PA3 //无线接收
#define bjkz PC1 //报警
#define zhuangtai_d PC7 //LED
#define power_led PC6
//==============================================================================
//EEPROM地址安排
#define mima 0 //密码
#define bianma1 mima+20 //无线遥控编码1
#define bianma2 bianma1+20 //无线遥控编码2
#define chetai bianma2+20 //无线遥控编码3
//==============================================================================
uchar dingshi=0;//
uchar zhishi_ys=0;//指示灯延时
uchar baojing_bz=0;//有报警事件标志
uchar shefang_b=0;//设撤防标志
uchar chengxu_s=0;
uint yaokong_s1=0,yaokong_s2=0;//遥控解码时间
uchar yaokong_hc[12];
uchar yaokong_hc1[12];
uchar deng_b=0;
uchar chishu=0,shijian=0;
//==============================================================================
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//Watchdog initialize
// prescale: 1024K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//==============================================================================
void eeprom_writ(uchar dz,uchar sj) //写EEPROM
{
CLI(); //清总中断
while(EECR & (1<<EEWE)){;}
EEARH=0x00;
EEARL=dz;
EEDR=sj;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
SEI();
}
//==============================================================================
uchar eeprom_read(uchar dz) //读EEPROM
{
CLI(); //清总中断
while(EECR & (1<<EEWE)){;}
EEARH=0x00;
EEARL=dz;
EECR |= (1<<EERE);
SEI();
return(EEDR);
}
//TIMER2 initialize - prescale:8
// desired value: 100uSec
// actual value: 100.000uSec (0.0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0xCE; //setup
OCR2 = 0x32;
TCCR2 = 0x02; //start
}
#pragma interrupt_handler timer2_ovf_isr:10
void timer2_ovf_isr(void)
{
TCNT2 = 0xCE; //reload counter value
if(yaokong_s1<65535){++yaokong_s1;}
if(yaokong_s2<65535){++yaokong_s2;}
}
//==============================================================================
//TIMER1 initialize - prescale:1024
// desired value: 100mSec
// actual value: 99.840mSec (0.2%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFE; //setup
TCNT1L = 0x7A;
OCR1AH = 0x01;
OCR1AL = 0x86;
OCR1BH = 0x01;
OCR1BL = 0x86;
ICR1H = 0x01;
ICR1L = 0x86;
TCCR1A = 0x00;
TCCR1B = 0x05; //start
}
#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFE; //reload counter high value
TCNT1L = 0x7A; //reload counter low value
++dingshi;
if(zhishi_ys!=0){--zhishi_ys;}
if(dingshi>9)
{//秒
dingshi=0;
if(chengxu_s!=0){--chengxu_s;}//程序中死等时间
}
}
//**********************************************
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
watchdog_init();
timer1_init();
timer2_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x44; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//***************************************************
void dengshan(uchar chishu)
{
uchar i,deng_b;
zhishi_ys=3;
for(i=0;i<chishu;++i)
{
if(zhishi_ys==0)
{
if(deng_b==0){PORTC&=~(1<<zhuangtai_d);zhishi_ys=3;deng_b=1;}
else if(deng_b==1){PORTC|=(1<<zhuangtai_d);zhishi_ys=3;deng_b=0;}
}
}
}
//******************************************************
void kuaishan(void)
{
uchar i,deng=10;
DDRC|=(1<<zhuangtai_d);PORTC&=~(1<<zhuangtai_d);
for(i=0;i<9;++i)
{
if(PINC&(1<<zhuangtai_d)){PORTC&=~(1<<zhuangtai_d);zhishi_ys=--deng;}
else{PORTC|=(1<<zhuangtai_d);zhishi_ys=--deng;}
//while(1){WDR();
if(zhishi_ys==0){break;}//}
}
for(i=0;i<100;++i)
{
if(PINC&(1<<zhuangtai_d)){PORTC&=~(1<<zhuangtai_d);yaokong_s1=0;}
else{PORTC|=(1<<zhuangtai_d);yaokong_s1=0;}
//while(1){WDR();if(yaokong_s1>500){break;}}
}
PORTC|=(1<<zhuangtai_d);
}
//*********************************************
uchar yaokongjieshou(void)//遥控解码接收
{
uchar wei1,wei2,i,j,k=0,hc,deng_b;
DDRA&=~(1<<wuxian_js);PORTA|=(1<<wuxian_js);
yaokong_s2=0;deng_b=0;
while(1)
{
if(yaokong_s2>250){return(0xff);}
hc=PINA&(1<<wuxian_js);WDR();
if(deng_b==1){break;}
while(hc==0)
{
yaokong_s1=0;WDR();if(yaokong_s2>250){return(0xff);}
while(1)
{
hc=PINA&(1<<wuxian_js);WDR();if(yaokong_s2>250){return(0xff);}
if(hc!=0)
{
if(yaokong_s1>78&&yaokong_s1<84)
{
deng_b=1;break;
}
else{deng_b=0;break;}
}
}
break;
}
if(deng_b==1){break;}
}
for(i=0;i<12;++i)
{
k=0;
for(j=0;j<2;++j)
{
yaokong_s1=0;
while(1)
{
hc=PINA&(1<<wuxian_js);WDR();
if(hc==0){break;}
if(yaokong_s1>200)
{
return(0xff);
}
}
if(k==0){if(yaokong_s1>1&&yaokong_s1<5){wei1=0;}else{wei1=1;}k=1;}
else{if(yaokong_s1>1&&yaokong_s1<5){wei2=0;}else{wei2=1;}}
yaokong_s1=0;
while(1)
{
WDR();
hc=PINA&(1<<wuxian_js);
if(hc!=0){break;}
if(yaokong_s1>200)
{
return(0xff);
}
}
}
if(wei1==0&&wei2==0){yaokong_hc[i]=0;}
else if(wei1==1&&wei2==1){yaokong_hc[i]=1;}
else if(wei1==0&&wei2==1){yaokong_hc[i]=2;}
else if(wei1==1&&wei2==0){yaokong_hc[i]=3;}
}
return(1);
}
//*****************************************************
void yaokongcaxun(void)//遥控接收
{
uchar chishu=0,hc,i,deng_b,jiao,men;
DDRC&=~(1<<bjkz);PORTC|=(1<<bjkz);
if(shefang_b==0)
{//记忆遥控编码
jiao=PINC&(1<<bjkz);
if(jiao==0)
{
chengxu_s=15;
kuaishan();
chishu=6;
chengxu_s=10;deng_b=0;
while(chishu>5)
{
while(1)
{
deng_b=yaokongjieshou();
if(chengxu_s==0){dengshan(10);return;}
WDR();
if(deng_b==1){break;}
}
for(i=0;i<15;++i){yaokong_hc1[i]=yaokong_hc[i];}
while(1)
{
deng_b=yaokongjieshou();
if(chengxu_s==0){dengshan(10);return;}
WDR();
if(deng_b==1){break;}
}
for(i=0;i<10;++i){if(yaokong_hc1[i]!=yaokong_hc[i]){break;}}
if(i==10){deng_b=1;break;}
}
if(deng_b==1)
{
//保存编号eeprom_writ(uchar dz,uchar sj)
for(i=0;i<10;++i)
{
eeprom_writ((bianma1+i),yaokong_hc[i]);WDR();
}
kuaishan();
chengxu_s=10;deng_b=0;
while(chishu>5)
{
while(1)
{
deng_b=yaokongjieshou();
if(chengxu_s==0){dengshan(10);return;}
WDR();
if(deng_b==1){break;}
}
for(i=0;i<15;++i){yaokong_hc1[i]=yaokong_hc[i];}
while(1)
{
deng_b=yaokongjieshou();
if(chengxu_s==0){dengshan(10);return;}
WDR();
if(deng_b==1){break;}
}
for(i=0;i<10;++i){if(yaokong_hc1[i]!=yaokong_hc[i]){break;}}
if(i==10){deng_b=1;break;}
}
if(deng_b==1)
{
for(i=0;i<10;++i)
{
eeprom_writ((bianma2+i),yaokong_hc[i]);WDR();
}
PORTC|=(1<<zhuangtai_d);
zhishi_ys=10;
while(1){WDR();if(zhishi_ys==0){break;}}
PORTC&=~(1<<zhuangtai_d);
if(deng_b<600){deng_b=0;}else{deng_b=1;}
eeprom_writ(chetai,deng_b);
}
return;
}
// else{return;}
}
}
deng_b=yaokongjieshou();
if(deng_b==1)
{
deng_b=1;
for(i=0;i<8;++i)
{if(eeprom_read(bianma1+i)!=yaokong_hc[i]){deng_b=0;break;}}
if(deng_b==0)
{
deng_b=1;
for(i=0;i<8;++i)
{if(eeprom_read(bianma2+i)!=yaokong_hc[i]){deng_b=0;break;}}
}
}
if(deng_b==1)
{
if(yaokong_hc[8]==1)//设防
{PORTC|=(1<<zhuangtai_d);}
else if(yaokong_hc[11]==1)//撤防
{PORTC&=~(1<<zhuangtai_d);}
else if(yaokong_hc[9]==1)//打开电锁
{
PORTC|=(1<<zhuangtai_d);
}
else if(yaokong_hc[10]==1)//讯车
{
PORTC&=~(1<<zhuangtai_d);
}
}
}
//==============================================================================
void main(void)
{
init_devices();
DDRC|=(1<<power_led);PORTC&=~(1<<power_led);
//DDRC|=(1<<zhuangtai_d);PORTC&=~(1<<zhuangtai_d);
PORTC|=(1<<bjkz);DDRC&=~(1<<bjkz);
while(1)
{
// kuaishan();
zhishi_ys=3;
while(1)
{
WDR();
yaokongjieshou();
// yaokongcaxun();//遥控接收
}
}
}
//==============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -