原创 笔记六:续电器的控制实验

2009-10-27 15:18 3625 5 7 分类: 汽车电子

笔记五六:续电器的控制实验<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


续电器在CAN学习板众多的外围之中,是我最喜爱的。CAN学习板搭配它是在是太对了,现在不是感动的时间,还是开始实验吧


04e7b511-ed7d-4640-8197-ed95b4f904c3.JPG



以上原理图是续电器在CAN学习板的硬件连接。我们最主要的就是控制它那个INT0引脚(老实说这个引脚连接有点不太合适了,怎么这样说?在编写源码的时候就会知道了),换句说就是要抛弃外部中断请求0了。但是这个问题不限制我们继续作实验。



3ba09441-4efe-4349-9c0b-9356c70a4c70.JPG


实验内容


CAN点对点为基础,不过有少许改变,节点一是主机,节点二是从机,节点二接收来自节点一发送的报文,报文中包含对继电器控制的数据。当节点二接收到0x01时,激活继电器Led Green打亮,反之接收到0x00时关闭继电器,Led Red打亮。节点一的数码管指示当前发送对继电器控制的数据01或者00,而节点二的数码管则显示目前继电器的状态00还是01.




数据


继电器状态


00


关闭命令|关闭状态


01


启动命令|启动状态




节点一(主机)源码:


//00-继电器控制实验(节点一).c


//主机角色


//akuei2 20-10-09



#include "reg52.h"


#include "sja1000.h"


#define uchar unsigned char



sbit SJACS=P2^0;


sbit SJARST=P2^3;



uchar code Led_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};


uchar code Led_Select[]={0xef,0xdf,0xbf,0x7f}; 



uchar ACR[4],AMR[4],TXD_Buffer[13],RXD_Buffer[13],TXD_Data,RXD_Data;


bit Click=0;



void Display(void);


void CAN_TXD(void);



//50微秒延迟函数


void Delay_50us(int t)


{


uchar j; 


    t--;


for(;t>0;t--)  


    for(j=19;j>0;j--);


    


}



void Init_Data(void)


{


int i;



ACR[0]='C';


ACR[1]='A';


ACR[2]='N';


ACR[3]='1';


AMR[0]=0x00;


AMR[1]=0x00;


AMR[2]=0x00;


AMR[3]=0x03;



TXD_Buffer[0]=0x88;


TXD_Buffer[1]='C';


TXD_Buffer[2]='A';


TXD_Buffer[3]='N';


TXD_Buffer[4]='2';


TXD_Buffer[5]=TXD_Data;


TXD_Buffer[6]=0x00;


TXD_Buffer[7]=0x00;


TXD_Buffer[8]=0x00;


TXD_Buffer[9]=0x00;


TXD_Buffer[10]=0x00;


TXD_Buffer[11]=0x00;


TXD_Buffer[12]=0x00;



for(i=0;i<13;i++)


{


RXD_Buffer=0x00;


}



TXD_Data=0x00;


RXD_Data=0x00;


}



void Init_CPU(void)


{


SJACS=1;


SJARST=1;



IT0=1;


EX0=1;



EA=1;


}



void Init_CAN(void)


{


   unsigned char bdata temp;   //建立存储在bdata中的临时变量temp



   do


   {


      MODR=0x09; 


  temp=MODR;  //模式寄存器-设置复位模式而且单验收滤波模式


   }


   while(!(temp&0x01));  //判断



   CDR=0x88;     //时钟分频寄存器-设置PeliCAN模式,Clock off有效


   BTR0=0x31;    //总线时序寄存器-波特率为10kbps


   BTR1=0x1c;


   IER=0x01;      //中断使能寄存器-全部关闭


   OCR=0xaa;     //输出控制寄存器-借签...


   CMR=0x04;     //命令寄存器-释放RXFIF0



   ACR0=ACR[0];      //接收代码寄存器-本节点地址位CAN0 


   ACR1=ACR[1]; 


   ACR2=ACR[2]; 


   ACR3=ACR[3];



   AMR0=AMR[0];    //接收屏蔽寄存器-无任何屏蔽


   AMR1=AMR[1]; 


   AMR2=AMR[2]; 


   AMR3=AMR[3];   //最后两位为无用位,必须设置为逻辑1



   do


   {


      MODR=0x08; 


  temp=MODR;   //模式寄存器-退出复位模式,保持单验收滤波模式


   }


   while(temp&0x01);   //判断...


}   



void main(void)


{


Init_Data();


Init_CPU();


Init_CAN();


while(1)


{


Display();


}


}



//数码管显示函数


void Display(void)


{


int Digit[4],i;


Digit[3]=TXD_Data/10; //第一个数码管取千位


Digit[2]=TXD_Data%10; //第二个数码管取百位


Digit[1]=RXD_Data/10; //第三个数码管取十位


Digit[0]=RXD_Data%10; //第四个数码管取个位


for(i=0;i<4;i++)


{


P0=Led_Code[Digit[3-i]]; //送数码管码


P2=Led_Select; //送位选码


Delay_50us(20); //延迟1微秒


}


}



void CAN_TXD(void)


{


unsigned char bdata temp;



do


{


  temp=SR;         //判断报文接收完毕?


}


while(temp&0x10);    //SR.4=0 发送闲置,SR.4=1 发送状态中



do


{


  temp=SR;         //判断最后报文请求?


}


while(!(temp&0x08));  //SR.3=0 没有余报文请求,SR.3=1 还存在报文请求



do


{


  temp=SR;         //判断TXFIFO是否锁定?


}


while(!(temp&0x04));  //SR.2=0 锁定,SR.2=1 开放



TBSR0=TXD_Buffer[0];


TBSR1=TXD_Buffer[1];


TBSR2=TXD_Buffer[2];


TBSR3=TXD_Buffer[3];


TBSR4=TXD_Buffer[4];


TBSR5=TXD_Buffer[5];


TBSR6=TXD_Buffer[6];


TBSR7=TXD_Buffer[7];


TBSR8=TXD_Buffer[8];


TBSR9=TXD_Buffer[9];


TBSR10=TXD_Buffer[10];


TBSR11=TXD_Buffer[11];


TBSR12=TXD_Buffer[12];



CMR=0x01;       //命令寄存器-发送请求


}




void Ir_EX0(void) interrupt 0


{


EA=0;


EX0=0;


Click=~Click;


TXD_Buffer[5]=TXD_Data=Click;


CAN_TXD();


EX0=1;


EA=1;


}



=================================================================================


节点二(从机角色)源码:



//01-继电器控制实验(节点二).c


//从机角色


//akuei2 20-10-09



#include "reg52.h"


#include "sja1000.h"


#define uchar unsigned char



sbit SJACS=P2^0;


sbit SJARST=P2^3;


sbit Relay=P3^2;


sbit LedRed=P2^1;


sbit LedGreen=P2^2;



uchar code Led_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};


uchar code Led_Select[]={0xef,0xdf,0xbf,0x7f}; 



uchar ACR[4],AMR[4],TXD_Buffer[13],RXD_Buffer[13],TXD_Data,RXD_Data;


bit Relay_Flag=0;



void Display(void);


void Check_Relay(void);


void CAN_RXD(void);



//50微秒延迟函数


void Delay_50us(int t)


{


uchar j; 


    t--;


for(;t>0;t--)  


    for(j=19;j>0;j--);


    


}



void Init_Data(void)


{


int i;



ACR[0]='C';


ACR[1]='A';


ACR[2]='N';


ACR[3]='2';


AMR[0]=0x00;


AMR[1]=0x00;


AMR[2]=0x00;


AMR[3]=0x03;



for(i=0;i<13;i++)


{


RXD_Buffer=0x00;


}



TXD_Data=0x00;


RXD_Data=0x00;


}



void Init_CPU(void)


{


SJACS=1;


SJARST=1;



IT1=0;


EX1=1;



EA=1;


}



void Init_CAN(void)


{


   unsigned char bdata temp;   //建立存储在bdata中的临时变量temp



   do


   {


      MODR=0x09; 


  temp=MODR;  //模式寄存器-设置复位模式而且单验收滤波模式


   }


   while(!(temp&0x01));  //判断



   CDR=0x88;     //时钟分频寄存器-设置PeliCAN模式,Clock off有效


   BTR0=0x31;    //总线时序寄存器-波特率为10kbps


   BTR1=0x1c;


   IER=0x01;      //中断使能寄存器-接收中断使能


   OCR=0xaa;     //输出控制寄存器-借签...


   CMR=0x04;     //命令寄存器-释放RXFIF0



   ACR0=ACR[0];      //接收代码寄存器-本节点地址位CAN0 


   ACR1=ACR[1]; 


   ACR2=ACR[2]; 


   ACR3=ACR[3];



   AMR0=AMR[0];    //接收屏蔽寄存器-无任何屏蔽


   AMR1=AMR[1]; 


   AMR2=AMR[2]; 


   AMR3=AMR[3];   //最后两位为无用位,必须设置为逻辑1



   do


   {


      MODR=0x08; 


  temp=MODR;   //模式寄存器-推出复位模式,保持单验收滤波模式


   }


   while(temp&0x01);   //判断...


}   



void main(void)


{


Init_Data();


Init_CPU();


Init_CAN();


while(1)


{


Display();


}


}



//数码管显示函数


void Display(void)


{


int Digit[4],i;


Digit[3]=TXD_Data/10; //第一个数码管取千位


Digit[2]=TXD_Data%10; //第二个数码管取百位


Digit[1]=RXD_Data/10; //第三个数码管取十位


Digit[0]=RXD_Data%10; //第四个数码管取个位


for(i=0;i<4;i++)


{


P0=Led_Code[Digit[3-i]]; //送数码管码


P2=Led_Select; //送位选码


Delay_50us(20); //延迟1微秒


}


}



void CAN_RXD(void)


{


unsigned char temp;



temp = IR;


if( temp & 0x01)                   //判断是否接收中断


{


RXD_Buffer[0]=RBSR0;         //读取RXFIFO


RXD_Buffer[1]=RBSR1;


RXD_Buffer[2]=RBSR2;


RXD_Buffer[3]=RBSR3;


RXD_Buffer[4]=RBSR4;


RXD_Buffer[5]=RBSR5;


RXD_Buffer[6]=RBSR6;


RXD_Buffer[7]=RBSR7;


RXD_Buffer[8]=RBSR8;


RXD_Buffer[9]=RBSR9;


RXD_Buffer[10]=RBSR10;


RXD_Buffer[11]=RBSR11;


RXD_Buffer[12]=RBSR12;



CMR = 0X04;                  //释放RXFIFO中的空间


temp = ALC;                   //释放仲裁随时捕捉寄存器


temp = ECC;                   //释放错误代码捕捉寄存器


}



IER = 0x01;// .0=1--接收中断使能;



}



void Ir_EX1(void) interrupt 2


{


EA=0;


EX1=0;


CAN_RXD();


RXD_Data=RXD_Buffer[5];


if(RXD_Data==0x01) //继电器控制


{


Relay=0;


LedRed=1;


LedGreen=0;


}


else if(RXD_Data==0x00)


{


Relay=1;


LedRed=0;


LedGreen=1;


}


EX1=1;


EA=1;


}




在节点二源码中,继电器的控制代码编写在外部中断1函数里,这是为了更能保障继电器不被影响。


源码的程度很简单,就不多说了,自己看着办吧。


 


源码下载


https://static.assets-stash.eet-china.com/album/old-resources/2009/10/23/beea9b20-fb55-440f-9218-5650bd5eba34.rar


PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1609127 2009-10-23 20:38

PIAE大大这是一定的~ 因为时间的关系,目前俺只能以博客方式更新...见谅

用户393569 2009-10-23 19:24

写得非常好,就是图片看不到,非常期待博主能够把你的CAN学习的文章发表在我们的CAN学习小组中。
相关推荐阅读
用户1609127 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
用户1609127 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
用户1609127 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
用户1609127 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
用户1609127 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
用户1609127 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
EE直播间
更多
我要评论
2
5
关闭 站长推荐上一条 /3 下一条