📄 sd.c
字号:
//ICC-AVR application builder : 2007-04-05
// Target : M8
// Crystal: 11.0592
//手机模块块是 HD31A
#include <iom8v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 11059200 //晶振频率
#define baud 9600 //串行通讯波特率
#define Call_Phon (PIND&0x08) //启动定时器 PD3 输入
#define signe (PIND&0x10) //安全信号检测 PD4 输入
#define keys (PIND&0x04) //安全信号检测 PD2 输入
#define number (PINB&0x3f) //设置目的手机号码 PB口
#define wdt_reset() asm("wdr") //看门狗复位 //清零
void wdt_disable(void); //看门狗禁止
void wdt_enable(uchar value); //看门狗使能
void timer1_init(void); //定时器1初始化
void timer1_ovf_isr(void);//定时器1中断服务函数
void uart0_init(void); //串口初始化
void USART_Tranbuffer( uchar i ); //串口发送一个字节
void USART_Transmit( unsigned char data );//串口发送data个数据
void uart0_rx_isr(void);//串口中断服务函数
void port_init(void); //端口初始化
void delay(void); //延时函数
uchar Read_EEPROM(uint Address);//读一个字节
void Write_EEPROM(uchar Data,uint Address); //写一个字节
//ber0[]发送短信方式 方式2 带目的号码发送短信 11 00 0D 0A XX YY YY YY CC CC CC
//XX表示电话号码的长度 YY电话号码 CC表示要发送的内容 最大140字节 返回08 01 0D 0A表示发送成功 返回08 00 0D 0A发送不成功
//如果以时间为结束标志不加结束符
//如果以结束符为结束标志则也加上结束符 0D 0A 加在发送结束的末尾
const uchar ber0[]={0x11,0x00,0x0D,0x0A,0x0B,//短信头
/*电话号码ASCASC十六进制*/ 0x31,0x33,0x38,0x32,0x30,0x35,0x32,0x31,0x36,0x38,0x36,//电话号码
/*发送内容以及结束符*/ 0x8b,0x66,0x62,0xa5,0x5d,0xf2,0x54,0x2f,0x52,0xa8,0x00,0x2c,
0x67,0x09,0x60,0xc5,0x51,0xb5,0x53,0xd1,0x75,0x1f,0x00,0x21};//发送内容
//警 报 已 启 动 , 有 情 况 发 生 !
/*=========================================================================================*/
//ber1[]发送短信方式 方式1 指向电话本中的某个位置号码发送短信 01 XX 0D 0A YY YY YY YY YY
//XX表示在电话本中的位置最大不能超过20 YY是发送内容 返回与2一样
const uchar ber1[]={0x01,0x00,0x0D,0x0A,//短信头
/*发送内容以及结束符*/ // 现 在 进 行 通 讯 测 试
0x73,0xb0,0x57,0x28,0x8f,0xdb,0x88,0x4c,0x90,0x1a,0x8b,0xaf,0x6d,0x4b,0x8b,0xd5,0x00,0x21};//结束
/*=========================================================================================*/
//ber2[]发送短信方式 方式3默认向SIM卡中的第一个位置的电话号码发送短信
//YY YY YY YY YY…………YY是发送内容 返回与2一样
const uchar ber2[]={0x31,0x30,0x36,0x36,0x36,0x34,0x31,0x39,0x38};//发送内容
/*=========================================================================================*/
//ber3[]
const uchar ber3[]={0x11,0x00,0x0D,0x0A,0x0B,
/*电话号码**/ 0x31,0x30,0x36,0x30,0x32,0x32,0x38,0x35,0x36,0x36,0x34,0x31,0x39,0x38,//电话号码
/*发送内容以及结束符*/ 0x4f,0x60,0x59,0x7d,0x00,0x11,0x12,0x13,0x14,0x15,0x16,};
/*=========================================================================================*/
//ber4[]
const uchar ber4[]={0x11,0x00,0x0D,0x0A,0x0B,
/*电话号码**/ 0x31,0x30,0x36,0x30,0x32,0x32,0x38,0x35,0x36,0x36,0x34,0x31,0x39,0x38,//电话号码
/*发送内容以及结束符*/ 0x4f,0x60,0x59,0x7d,0x00,0x11,0x12,0x13,0x14,0x15,0x16,};
/*=========================================================================================*/
// 设置命令 1
//uchar ber1[10]={1,2};
//uchar ber2[10]={1,2};
//uchar ber3[10]={1,2};
/*=========定义变量=========*/
uchar berx[20]={0};
uint time_timer;// 存放次数 到达存放结果后 换下一个字继续存放 满一天存放一次
//现在可定义存放一年或500天后 换下一个字放
uchar buf; //接收缓冲
uint time_9h; //计时量 每10分钟存放一次 当有看门狗复位或其他外界干扰引起复位时
//可读出eeprom里的内容并 相应的增加累积10分钟 避免到达时间断电
//而这边还没有在定时时间之内
//6480*5=9h
//==============================================================================
void main()
{ uchar i;
time_9h=0;
CLI();
port_init();
uart0_init();
// timer1_init();
wdt_disable();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04; //timer interrupt sources
SEI();
//PORTD&=0xff;
//Call_Phon
while(1)
{
// if()开始计时 打开定时器
// if(keys==0x00)
// SEI();
//if((PIND&0x04)==0x00)
// { delay();
// if(time_9h/2)
//USART_Transmit(time_9h/256);
//USART_Transmit(time_9h%256);
// if((PIND&0x04)!=0x00)
if(time_9h<20) //6480没有到定时时间 则检测线路状态
{// PORTD=0x7f;
if(keys==0x00)//(signe==0x00) //检测到断线情况
{ delay();
if(keys==0x00)//(signe==0x00); //等待键抬起 // if((PIND&0x04)!=0x00) //检测到断线情况
{
// USART_Tranbuffer(40);
for(i=0;i<20;i++)
{berx[i]=ber1[i];
}
switch(number) //PB0 PB1 PB2 PB3 PB4 PB5
{ case 62:berx[1]=0x01;break;
case 61:berx[1]=0x02;break;
case 59:berx[1]=0x03;break;
case 55:berx[1]=0x04;break;
case 47:berx[1]=0x05;break;
case 31:berx[1]=0x06;break;
default:berx[1]=0x00;break ;
}
//USART_Transmit(number);
//delay();delay();delay();delay();delay();
if(berx[1]!=0x00)
{
USART_Tranbuffer(20);
}
// CLI();
// const uchar ber1[]={0x01,0x01,0x0D,0x0A,//短信头
// /*发送内容以及结束符*/ 0x4f,0x60,0x59,0x7d,0x00,0x11,0x12,0x13,0x14,0x15,0x16,};//结束
//ber1[]发送短信方式 方式1 指向电话本中的某个位置号码发送短信 01 XX 0D 0A YY YY YY YY YY
//XX表示在电话本中的位置最大不能超过20 YY是发送内容 返回与2一样
//time_9h=0;
}
}
}
else
{
time_9h=0;
// CLI();
}
// delay();
}
}
//==============================================================================
//extern void timer1_ovf_isr(void); //定时中断服务程序
//extern void timer1_init(void); //定时器初始化
//TIMER1 initialize - prescale:8
void timer1_init(void)
{
TCCR1B = 0x00; //setup
TCNT1H = 0x2D; //stop5ms
TCNT1L = 0x11;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
void USART_Transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1<<UDRE)) );
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
void USART_Tranbuffer( uchar i )
{
uchar j;
for(j=0;j<i;j++)
{ USART_Transmit(berx[j]);
}
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCNT1H = 0x2D; // 5s setup
TCNT1L = 0x11; //
time_9h++;
//PORTD^=0x80;
USART_Transmit(time_9h/256);
USART_Transmit(time_9h%256);
}
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0x7F; //m103 output only
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0xff;
}
// desired baud rate: 9600// actual: baud rate:9600 (0.0%)//UART0 initialisation
// char size: 8 bits// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL)|(3<<UCSZ0);
UBRRL = (fosc/16/(baud+1))%256;; //set baud rate lo
UBRRH = (fosc/16/(baud+1))/256; //set baud rate hi
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
// UCR = BIT(RXEN) ;
}
void delay()
{
unsigned char i,j,m,n;
for (i=0;i<250;i++)
for (j=0;j<10;j++)
// for (m=0;m<250;m++)
for (n=0;n<250;n++);
}
//call this routine to initialise all peripherals
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{uchar i;
// while ( !(USR&0x80)) /* wait for incomming data */
CLI(); //disable all interrupts /* return the data */
//buf=UDR; //uart has received a character in UDR
//berx[0]=buf;
// for(i=1;i<4;i++)
// { while (!(UCSRA&(1<<RXC)));
// { berx[i]=UDR;
// }
//}
//delay();
//if(buf==0x08)
// if((berx[0]==0x91)&&(berx[1]==0x01)&&(berx[2]==0x0d)&&(berx[3]==0x0A))
// {
// for(i=0;i<4;i++)
// USART_Transmit(berx[i]);
//PORTD=0x7f;
// }
USART_Transmit(UDR);
//else PORTD=0xbf; //USART_Transmit(0x88); //错误指示
SEI();
}
//===============看门狗函数==================
void wdt_enable(uchar value)
{ WDTCR=BIT(WDCE)|BIT(WDE);
//WDTCR=BIT(WDE)|BIT(WDP2)|BIT(WDP1); //使能watchdog,1024K分频,典型溢出时间5V时1S
WDTCR|=value;//value 为0 到7(16ms--2s)
}
void wdt_disable( )
{ WDTCR=BIT(WDCE)|BIT(WDE);
WDTCR=0x00; //BIT(WDE)|BIT(WDP2)|BIT(WDP1);
}
//====================================================
void Write_EEPROM(uchar Data,uint Address) //写一个字节
{//CLI();
wdt_reset();
while(EECR&0x02);// (1<<EEWE));/* 等待上一次写操作结束 */
EEAR=Address;/* 设置地址和数据寄存器*/
EEDR=Data;
EECR|=0x04;//(1<<EEMWE);/* 置位EEMWE */
EECR|=0x02;//(1<<EEWE);/* 置位EEWE 以启动写操作*/
///SEI();
}
//========================================================
uchar Read_EEPROM(uint Address)//读一个字节
{uchar i;
CLI();
while(EECR&0x02);
EEAR=Address;/* 设置地址寄存器*/
EECR|=0x01;//(1<<EERE);/* 设置EERE 以启动读操作*/
i=EEDR; /* 自数据寄存器返回数据 */
SEI();
return(i);
}
//===========================================================
//////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -