// **************************************************************
// *** 广 州 天 河 双 龙 电 子 公 司 ***
// *** http://www.sl.com.cn ***
// *** 实验:SL-RFMOD写E5550卡 ***
// *** 作者:zxy@sl.com.cn ***
// *** 2006年3月28日 ***
// *** 目标MCU:MEGA48 晶振:外部(INT)8MHZ ***
// **************************************************************
//写入卡的数据为tab[4]数组的内容
#include <iom48v.h>
#include <macros.h>
#define fosc 8000000
#define baud 19200
#define sbit(y,x) (y |=(1<<x))
#define clr(y,x) (y &= ~(1<<x))
unsigned char tab[4]={0x12,0x34,0x80,0x28}; //写入卡内的数据
/* 微秒级延时程序 */
void delay_us(int time)
{
do
{
time--;
}
while (time>1);
}
/* 毫秒级延时程序 */
void delay_ms(unsigned int time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
/* UART初始化 */
void uart_init(void)
{
UCSR0A=0x00;
UCSR0B=0x00;
UBRR0L=(fosc/16/(baud+1))%256;//对波特率寄存器预置数
UBRR0H=(fosc/16/(baud+1))/256;
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//8位数据+1位STOP位
UCSR0B=(1<<RXEN0)|(1<<TXEN0);//允许发送和接收
}
/* 字符输出函数 */
void putchar(unsigned char c)
{
while (!(UCSR0A&(1<<UDRE0))); //置usart数据寄存器空,系统复位时,udre位置1,表示数据发送已准备好
UDR0=c;//数据寄存器
}
/* 字符输入函数 */
unsigned char getchar(void)
{
while(!(UCSR0A& (1<<RXC0)));//将第七位RXC置1,表示USART接受完成
return UDR0;//数据寄存器udr0
}
void puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0d);//回车换行
putchar(0x0a);
}
void timer1_init(void)//定时器初始化
{
TCCR1B = 0x00;
TCNT1 = 0x00;
TCCR1A = 0x00;
TCCR1B = 0x02; //8分频
}
void port_init(void)//F口初始化
{
DDRC = 0x05;
PORTC = 0x00;
PORTB = 0x02;
DDRB = 0x02;
clr(DDRD,0);
sbit(DDRD,1);
}
//开始和停止
void StartStop(void)
{
unsigned int cnt,i;
clr(PORTC,2);
cnt=0;
i=1;
TCNT1 = 0x00;
while(i)
{
cnt=TCNT1;
if(cnt>256)i=0;
}
}
//写1
void write_1(void)
{
unsigned int cnt,i;
sbit(PORTC,2);
cnt=0;
i=1;
TCNT1 = 0x00;
while(i)
{
cnt=TCNT1;
if(cnt>384)i=0;
}
}
//写0
void write_0(void)
{
unsigned int cnt,i;
sbit(PORTC,2);
cnt=0;
i=1;
TCNT1 = 0x00;
while(i)
{
cnt=TCNT1;
if(cnt>128)i=0;
}
}
//关场
void close_F(void)
{
unsigned int cnt,i;
clr(PORTC,2);
cnt=0;
i=1;
TCNT1 = 0x00;
while(i)
{
cnt=TCNT1;
if(cnt>256)i=0;
}
}
void IDIC_write(unsigned char adr)
{
signed int cnt,i,j,k,n,date[32];
sbit(PORTC,2);//启动RF
delay_ms(200); //延时25MS在8M晶振下
//****启始*******************
StartStop(); ////开始
//*****操作码=10及L=0********
write_1();//写1
close_F();
write_0();//写0
close_F();
write_0();//写0
close_F();
//*****数据段****************
n=0;
for(j=0;j<4;j++)
for(k=8;k>0;k--)
{
k--;
date[n]=(tab[j]>>k)&0x01;
if(date[n]==1)
write_1();
if(date[n]==0)
write_0();
close_F();
n++;
k++;
}
//*****地址段001***************
for(i=2;i>=0;i--)
{
cnt=(adr>>i)&0x01;
if(cnt==1)
{
write_1();//写0
}
if(cnt==0)
{
write_0();//写0
}
close_F();
}
close_F();
sbit(PORTC,2);////写卡完成
delay_ms(20); //延时
}
void main(void)
{
unsigned char adr; //写入卡内的数据
port_init();
timer1_init();
uart_init();
sbit(PORTC,0);//启动RF模块
sbit(PORTC,2);//启动RF
while(1)
{
adr=getchar();
adr=adr-0x30;
if((adr>0)&&(adr<8))//写数据块1-7
{
IDIC_write(adr);
PORTB &=~(1<<PB1);//发出蜂鸣信号
delay_ms(100); //延时
PORTB |=(1<<PB1);
putchar(adr+0x30);
}
else if(adr==0)
{
puts("BLOCK0设置内容(程序中的tab[4])是否正确?是,请输入“Y”写BLOCK0,其他键退出");
adr=getchar();
if(adr==0X59)//Y
{
IDIC_write(adr);
PORTB &=~(1<<PB1);//发出蜂鸣信号
delay_ms(100); //延时
PORTB |=(1<<PB1);
putchar(0x30);
}
else
puts("退出成功,请输入写卡地址0-7");
}
else
puts("非法地址,请清空重新输入正确的地址");
}
}
评论1