Just do IT.
分类: 嵌入式
2011-08-02 18:35:32
/*485通信**EEPROM READ&WRITE SAMPLE*/
/* blog.sina.com.cn/suzhoumcu */
#include
#include
sbit gz =P1^0;
sbit led =P1^2;
sbit fjqd =P1^3;
sbit CON485 =P1^4; /*485片选*/
sbit ee_si =P1^5; /*EEPROM 数据入*/
sbit ee_sck =P1^6; /*EEPROM 时钟*/
sbit ee_so =P1^7; /*EEPROM 数据出*/
sbit ee_cs =P3^7; /*EEPROM 片选*/
/*******************************************************************/
/*寄存器参数定义*/
data unsigned char sen_cnt; /*发送指针*/
data unsigned char sen_cnt1;
data unsigned char rec_cnt; /*接收指针*/
data unsigned char dqsd;
data unsigned char count;
data unsigned char time_count;
data unsigned char sdsd;
data unsigned char ys;
data unsigned char test_sdsd;
data unsigned char test_dqsd;
data unsigned char day;
data unsigned char hour;
data unsigned char tmp_hour;
data unsigned char tmp_speed;
data unsigned char bak_speed;
data unsigned int t_s;
data unsigned int first_time;
data unsigned int ee_addr;
idata unsigned char set_para[30];
idata unsigned char send[5]; /*发送信息缓冲器*/
idata unsigned char reci[15]; /*接收信息缓冲器*/
/*******************************************************************/
/*位定义*/
bdata unsigned char flag0;
sbit run =flag0^0;
sbit stop =flag0^1;
sbit speed =flag0^2;
sbit error =flag0^3;
sbit addr =flag0^4;
sbit status =flag0^5;
sbit test_run =flag0^6;
sbit test_stop =flag0^7;
bdata unsigned char flag1;
sbit gzbz =flag1^0;
sbit firsttime =flag1^1;
sbit gld =flag1^2;
sbit t_1ms =flag1^3;
sbit t_100us =flag1^4;
sbit fjqdyx =flag1^5;
sbit fjqdyx1 =flag1^6;
sbit f_auto =flag1^7;
bdata unsigned char flag2;
sbit g_sd =flag2^0;
sbit g_addr =flag2^1;
sbit s_addr =flag2^2;
sbit w_addr =flag2^3;
sbit s_auto =flag2^4;
sbit wr_auto =flag2^5;
sbit w_auto =flag2^6;
sbit b_auto =flag2^7;
bdata unsigned char flag3;
sbit mm0 =flag3^0;
sbit mm1 =flag3^1;
sbit mm2 =flag3^2;
sbit mm3 =flag3^3;
sbit mm4 =flag3^4;
sbit mm5 =flag3^5;
sbit mm6 =flag3^6;
sbit mm7 =flag3^7;
bdata unsigned char flag4;
sbit send_end =flag4^0;
sbit g_start =flag4^1;
sbit g_stop =flag4^2;
/*******************************************************************/
void cf(void) interrupt 0 using 3
{
gld=1;
}
void timer0(void) interrupt 1 using 1
{
TH0=-(100/256)-1;
TL0=-(100%256);
if(ee_cs){ee_cs=0;_nop_();ee_cs=1;}
ys=0;
t_100us=1;
if((gld==1)&&(fjqdyx==1)&&(fjqd==1)&&(time_count<100)){
time_count++;
if(time_count==100)ys=1;
}
if((gld==1)&&(ys==0)&&(fjqdyx==1)&&(fjqd==1)&&(time_count==100)){
fjqd=0;ys=1;
}
if((gld==1)&&(ys==0)&&(fjqdyx==1)&&(fjqd==0)&&(time_count==100)){
fjqd=1;gld=0;time_count=dqsd;
}
if((gld==1)&&(fjqdyx1==1)&&(fjqd==1)&&(time_count<100)){
time_count++;
if(time_count==100)ys=1;
}
if((gld==1)&&(ys==0)&&(fjqdyx1==1)&&(fjqd==1)&&(time_count==100)){
fjqd=0;ys=1;
}
if((gld==1)&&(ys==0)&&(fjqdyx1==1)&&(fjqd==0)&&(time_count==100)){
fjqd=1;gld=0;time_count=test_dqsd;
}
count++;
if(count==10){
t_1ms=1;
count=0;
t_s++;
if(t_s==1000){
t_s=0;
if((dqsd>sdsd)&&(fjqdyx==1))dqsd--;
if((dqsd
if((test_dqsd
}
}
}
/*******************************************************************/
void serial() interrupt 4 using 2/*信息串发送和接收子程序*/
{
unsigned char y,m;
ES=0;
if(TI==1){ /*信息串发送子程序*/
CON485=1;
TI=0;
sen_cnt++;
if(sen_cnt
sen_cnt=0;
sen_cnt1=0;
CON485=0;
if(send[1]==0x20)g_start=1;
if(send[1]==0x21)g_stop=1;
if(send[1]==0x22)g_sd=1;
else if(send[1]==0x25)g_addr=1;
else if(send[1]==0x27)w_addr=1;
else if(send[1]==0x46&&send_end){wr_auto=1;send_end=0;}
}
}
if(RI==1){ /*信息串接收子程序*/
CON485=0;
RI=0;
reci[rec_cnt]=SBUF;
if(rec_cnt>2){
if(y>0){y--;rec_cnt++;}
if(y==0){
m=0;
if(reci[1]==0x25&&(reci[2]!=set_para[4]
||reci[3]!=set_para[5]||reci[4]!=set_para[6]
||reci[5]>=32))reci[1]=0xff;
for(y=0;y
if(m==0){ /*校验正确*/
if(reci[1]==0x20){run=1;set_para[3]=0x1;}
//else if(reci[1]==0x21){fjqdyx=0;set_para[3]=0x0;stop=1;}
else if(reci[1]==0x21){sdsd=50;set_para[3]=0x0;stop=1;}
else if(reci[1]==0x22){speed=1;tmp_speed=reci[3];}
else if(reci[1]==0x23)error=1;
else if(reci[1]==0x25){addr=1;set_para[1]=reci[5];}
else if(reci[1]==0x26)status=1;
else if(reci[1]==0x27){
set_para[4]=reci[2];
set_para[5]=reci[3];
set_para[6]=reci[4];
s_addr=1;
}
else if(reci[1]==0x80){
test_sdsd=60+reci[2]/3;test_dqsd=93;
test_run=1;
}
else if(reci[1]==0x50){
for(y=0;y<11;y++){set_para[7+y]=reci[3+y];}
send_end=1;f_auto=1;
}
else if(reci[1]==0x51){
for(y=0;y<11;y++){set_para[18+y]=reci[3+y];}
send_end=1;f_auto=1;
}
else if(reci[1]==0x47){
day=reci[2];hour=reci[3];
w_auto=1;
}
else if(reci[1]==0x4a){
if(reci[3]==1){
w_auto=1;t_s=0;
day=reci[4];hour=reci[5];
}
else if(reci[3]==0){
w_auto=0;t_s=0;
tmp_speed=set_para[2];
sdsd=60+set_para[2]/3;
bak_speed=0;tmp_speed=0;
}
dqsd=85;time_count=dqsd;
b_auto=1;
}
}
}
}
else if(rec_cnt==2){ /*进行风机号的比较*/
y--;
if(reci[2]==set_para[1]&&reci[2]<32)rec_cnt=3;
else if(reci[1]==0x25)rec_cnt=3;
else if(reci[1]==0x80)rec_cnt=3;
else if(reci[1]==0x81&&reci[2]==0xd5){fjqdyx1=0;test_stop=1;rec_cnt=0;}
else if(reci[1]==0x27||reci[1]==0x47)rec_cnt=3;
else rec_cnt=0;
}
else if(rec_cnt==1){ /*将在reci[1]后还须接收的字节个数写入变量x*/
switch(reci[1]){
case 0x81:y=1;rec_cnt=2;break;
case 0x20:
case 0x21:
case 0x23:
case 0x26:
case 0x80:y=2;rec_cnt=2;break;
case 0x22:
case 0x47:y=3;rec_cnt=2;break;
case 0x27:y=4;rec_cnt=2;break;
case 0x25:
case 0x4a:y=5;rec_cnt=2;break;
case 0x50:
case 0x51:y=13;rec_cnt=2;break;
default:rec_cnt=0;break;
}
}
/*如果收到的第一个字节不是0xaa则视为干扰信息丢弃*/
else if(rec_cnt==0){
if(reci[0]==0xaa)rec_cnt=1;
else rec_cnt=0;
}
}
ES=1;
}
//下篇
/*******************************************************
OPR_EE
EE_CODE:操作指令
EECODE=3,=11,读数据
EECODE=6,写允许
EECODE=2,=10,写数据
EECODE=1,写寄存器
*******************************************************/
#define WREN 0x06 /*设置写使能锁存器*/
#define WRDI 0x04 /*复位写使能锁存器*/
#define RDSR 0x05 /*读状态寄存器*/
#define WRSR 0x01 /*写状态寄存器*/
#define READ 0x03 /*读数据*/
#define WRITE 0x02 /*写数据*/
void wt_byte(unsigned char eecode) /*写入一个字节*/
/*在25045的时钟下降沿将数据送入到SI线上,并在上升沿被锁存*/
{
idata unsigned char i;
for(i=0;i<8;i++){
ee_sck=0;
eecode=eecode<<1;
ee_si=CY;
ee_sck=1;
}
ee_si=0;
}
unsigned char rd_byte() /*读取一个字节*/
/*数据由25045的时钟下降沿输出到SO线上*/
{
idata unsigned char i;
idata unsigned char eecode=0;
for(i=0;i<8;i++){
ee_sck=1;
ee_sck=0;
eecode=eecode<<1;
if(ee_so)eecode++;
}
return(eecode);
}
void wip_poll()
/*检查写入过程是否结束*/
{
data unsigned char i,j;
for(j=0;j<99;j++){
ee_sck=0;
ee_cs=0;
wt_byte(RDSR);
i=rd_byte();
ee_sck=0;
ee_cs=1;
i&=0x1;
if(i==0)break;
_nop_();
}
}
void ee_init() /*25045初始化*/
{
ee_sck=0;
ee_cs=0;
wt_byte(WRSR);
_nop_();
wt_byte(0x0);
ee_sck=0;
ee_cs=1;
_nop_();
wip_poll();
ee_sck=0;
ee_cs=0;
wt_byte(WREN);
ee_sck=0;
ee_cs=1;
_nop_();
wip_poll();
ee_sck=0;
ee_cs=0;
wt_byte(WRSR);
_nop_();
wt_byte(0x0);
ee_sck=0;
ee_cs=1;
}
void ee_read()
/*从25045中读取程序,连续读出*/
{
data unsigned char x,i;
for(i=0;i<35;i++){
ee_sck=0;
ee_cs=0;
wt_byte(READ);
wt_byte(i);
if(i>4)set_para[i-5]=rd_byte();
else rd_byte();
ee_sck=0;
ee_cs=1;
for(x=0;x<250;x++)
{_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();}
}
}
void ee_write()
/*向25045中写入程序*/
{
data unsigned char x,i;
for(i=5;i<35;i++){
wip_poll();
ee_sck=0;
ee_cs=0;
wt_byte(WREN);
ee_sck=0;
ee_cs=1;
_nop_();
ee_sck=0;
ee_cs=0;
wt_byte(WRITE);
wt_byte(i); /*地址*/
wt_byte(set_para[i-5]);
ee_sck=0;
ee_cs=1;
wip_poll();
_nop_();
for(x=0;x<250;x++)
{_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();}
_nop_();
}
}
/*******************************************************/
void data_init(void)
{
set_para[0] = 0x55; /*校验起始位*/
set_para[1] = 32; /*风机号*/
set_para[2] = 100; /*风机速度*/
set_para[3] = 0; /*自动运行标志*/
set_para[4] = 0xff; /*内部编号*/
set_para[5] = 0xff; /*内部编号*/
set_para[6] = 0xff; /*内部编号*/
set_para[7] = 0; /*周日自动运行时间*/
set_para[8] = 0; /*周日自动运行时间*/
set_para[9] = 0; /*周日自动运行时间*/
set_para[10] = 0; /*周1自动运行时间*/
set_para[11] = 0; /*周1自动运行时间*/
set_para[12] = 0; /*周1自动运行时间*/
set_para[13] = 0; /*周2自动运行时间*/
set_para[14] = 0; /*周2自动运行时间*/
set_para[15] = 0; /*周2自动运行时间*/
set_para[16] = 0; /*周3自动运行时间*/
set_para[17] = 0; /*周3自动运行时间*/
set_para[18] = 0; /*周3自动运行时间*/
set_para[19] = 0; /*周4自动运行时间*/
set_para[20] = 0; /*周4自动运行时间*/
set_para[21] = 0; /*周4自动运行时间*/
set_para[22] = 0; /*周5自动运行时间*/
set_para[23] = 0; /*周5自动运行时间*/
set_para[24] = 0; /*周5自动运行时间*/
set_para[25] = 0; /*周6自动运行时间*/
set_para[26] = 0; /*周6自动运行时间*/
set_para[27] = 0; /*周6自动运行时间*/
set_para[28] = 0; /*自动运行时间速度*/
set_para[29] = 0xaa; /*校验终止位*/
ee_write();
}
/*******************************************************/
void main (void)
{
ES=1; /*允许串行口中断*/
TMOD=0x21; /*定时器0: 16位定时器 定时器1:串行口波特率发生器*/
TH1=0xFa; /*11.0592MHZ , 9.6K*/
TL1=0xFa; /*11.0592MHZ , 9.6K*/
PCON=0x80; /*波特率加倍**/
SCON=0x50; /*10位异步,允许串行口接收*/
TR1=1;
TR0=1;
IT0=1;
EA=1;
ES=1;
ET0=1;
EX0=1;
PT0=1;
sen_cnt=0;
rec_cnt=0;
firsttime=0;
ee_init();
ee_read();
if(set_para[0]!=0x55||set_para[29]!=0xaa)data_init(); /*25045数据初始化*/
CON485=0;
fjqdyx=0;
fjqdyx1=0;
first_time=0;
/*初始化发送数据*/
if((set_para[2]>=1)&&(set_para[2]<=100))sdsd=60+set_para[2]/3;
dqsd=93;
fjqd=1;
CON485=0;
/*循环程序*/
time_count=dqsd;
while(1){
if(g_start){ee_write();g_start=0;}
if(g_stop){ee_write();g_stop=0;}
if(set_para[3]==0x1){
if(fjqdyx==0){
fjqdyx=1;dqsd=85;
}
}
else if(set_para[3]==0x0)fjqdyx=0;
if(fjqdyx==1){
if(gz==1){
if(first_time==33000){
gzbz=1;
fjqdyx=0;
fjqd=1;
led=0;
first_time=0;
}
else first_time++;
}
}
else {
if(gz==0){
if(first_time==33000){
gzbz=1;
fjqdyx=0;
fjqd=1;
led=0;
first_time=0;
}
else first_time++;
}
}
if((gz==0)&&(fjqdyx==1)){
gzbz=0;led=1;
}
if(run){
send[0]=0xaa;send[1]=0x20;
send[2]=~(send[0]+send[1])+1;
if(sdsd>50){fjqdyx=1;dqsd=85;}
sen_cnt1=3;run=0;
CON485=1;
SBUF=send[0];
}
if(test_run){
send[0]=0xaa;send[1]=0x80;
send[2]=~(send[0]+send[1])+1;
fjqdyx1=1;
test_dqsd=85;
sen_cnt1=3;test_run=0;
CON485=1;
SBUF=send[0];
}
if(stop){
send[0]=0xaa;send[1]=0x21;
send[2]=~(send[0]+send[1])+1;
sen_cnt1=3;stop=0;
CON485=1;
SBUF=send[0];
}
if(test_stop){
send[0]=0xaa;send[1]=0x81;
send[2]=~(send[0]+send[1])+1;
sen_cnt1=3;test_stop=0;
CON485=1;
SBUF=send[0];
}
if(speed){
send[0]=0xaa;send[1]=0x22;
send[2]=~(send[0]+send[1])+1;
sen_cnt1=3;speed=0;
CON485=1;
SBUF=send[0];
}
if(error){
send[0]=0xaa;
if(gzbz)send[1]=0x23;
else send[1]=0x24;
send[2]=set_para[1];
send[3]=~(send[0]+send[1]+send[2])+1;
sen_cnt1=4;error=0;
CON485=1;
SBUF=send[0];
}
if(addr){
send[0]=0xaa;send[1]=0x25;
send[2]=~(send[0]+send[1])+1;
sen_cnt1=3;addr=0;
CON485=1;
SBUF=send[0];
}
if(s_addr){
send[0]=0xaa;send[1]=0x27;
send[2]=~(send[0]+send[1])+1;
sen_cnt1=3;s_addr=0;
CON485=1;
SBUF=send[0];
}
if(status){
send[0]=0xaa;send[1]=0x26;
send[2]=set_para[1];
send[3]=0;
if(gzbz)send[3]|=0x1;
if(fjqdyx)send[3]|=0x80;
send[4]=~(send[0]+send[1]+send[2]+send[3])+1;
sen_cnt1=5;status=0;
CON485=1;
SBUF=send[0];
}
if(f_auto){
send[0]=0xaa;send[1]=0x46;
send[2]=set_para[1];
send[3]=~(send[0]+send[1]+send[2])+1;
sen_cnt1=4;f_auto=0;
CON485=1;
SBUF=send[0];
}
if(b_auto){
send[0]=0xaa;send[1]=0x4a;
send[2]=~(send[0]+send[1])+1;
sen_cnt1=3;b_auto=0;
CON485=1;
SBUF=send[0];
}
if(g_sd){
g_sd=0;
set_para[2]=tmp_speed;
ee_write();
sdsd=60+set_para[2]/3;
}
if(g_addr){
g_addr=0;
ee_write();
}
if(w_addr){
w_addr=0;
ee_write();
}
if(wr_auto){
wr_auto=0;
ee_write();
}
if(w_auto){
tmp_hour=0;
if(hour>=0&&hour<8)flag3=set_para[7+day*3];
else if(hour>=8&&hour<16){flag3=set_para[8+day*3];tmp_hour=hour-8;}
else if(hour>=16&&hour<23){flag3=set_para[9+day*3];tmp_hour=hour-16;}
tmp_speed=set_para[28];
s_auto=0;
switch(tmp_hour){
case 0:if(mm7)s_auto=1;break;
case 1:if(mm6)s_auto=1;break;
case 2:if(mm5)s_auto=1;break;
case 3:if(mm4)s_auto=1;break;
case 4:if(mm3)s_auto=1;break;
case 5:if(mm2)s_auto=1;break;
case 6:if(mm1)s_auto=1;break;
case 7:if(mm0)s_auto=1;break;
}
if(s_auto){
if(w_auto){
if(!gzbz)fjqdyx=1;
if(bak_speed!=tmp_speed){
sdsd=60+tmp_speed/3;
bak_speed=tmp_speed;
}
}
}
else fjqdyx=0;
s_auto=0;
}
}
}