AVR单片机实现了232到CAN转换

发布者:dst2015最新更新时间:2015-09-08 来源: eefocus关键字:AVR单片机  CAN转换 手机看文章 扫描二维码
随时随地手机看文章
#include            //寄存器定义;   
#include            //宏定义;     
#define uchar unsigned char  //数据类型定义   
#define uint unsigned int    //数据类型定义   
   
#pragma interrupt_handler INT1_17:3 //定义INT1的中断服务程序   
#pragma interrupt_handler Timer0:10 //定义定时计数器0的中断服务程序   
#pragma interrupt_handler Usart_receive:12 //定义接收中断服务程序   
#define fosc 7372800 //晶振7.3728MHZ   
 
 
#define CANSTAT         0x0E 
#define CANCTRL         0x0F 
#define BFPCTRL         0x0C 
#define TEC             0x1C 
#define REC             0x1D 
#define CNF3            0x28 
#define CNF2            0x29 
#define CNF1            0x2A 
#define CANINTE         0x2B 
#define CANINTF         0x2C 
#define EFLG            0x2D 
#define TXRTSCTRL       0x0D 
 
 
#define RXF0SIDH        0x00 
#define RXF0SIDL        0x01 
#define RXF0EID8        0x02 
#define RXF0EID0        0x03 
#define RXF1SIDH        0x04 
#define RXF1SIDL        0x05 
#define RXF1EID8        0x06 
#define RXF1EID0        0x07 
#define RXF2SIDH        0x08 
#define RXF2SIDL        0x09 
#define RXF2EID8        0x0A 
#define RXF2EID0        0x0B 
#define RXF3SIDH        0x10 
#define RXF3SIDL        0x11 
#define RXF3EID8        0x12 
#define RXF3EID0        0x13 
#define RXF4SIDH        0x14 
#define RXF4SIDL        0x15 
#define RXF4EID8        0x16 
#define RXF4EID0        0x17 
#define RXF5SIDH        0x18 
#define RXF5SIDL        0x19 
#define RXF5EID8        0x1A 
#define RXF5EID0        0x1B 
 
 
#define RXM0SIDH        0x20 
#define RXM0SIDL        0x21 
#define RXM0EID8        0x22 
#define RXM0EID0        0x23 
#define RXM1SIDH        0x24 
#define RXM1SIDL        0x25 
#define RXM1EID8        0x26 
#define RXM1EID0        0x27 
 
 
#define TXB0CTRL        0x30 
#define TXB0SIDH        0x31 
#define TXB0SIDL        0x32 
#define TXB0EID8        0x33 
#define TXB0EID0        0x34 
#define TXB0DLC         0x35 
#define TXB0D0          0x36 
#define TXB0D1          0x37 
#define TXB0D2          0x38 
#define TXB0D3          0x39 
#define TXB0D4          0x3A 
#define TXB0D5          0x3B 
#define TXB0D6          0x3C 
#define TXB0D7          0x3D 
                          
 
#define TXB1CTRL        0x40 
#define TXB1SIDH        0x41 
#define TXB1SIDL        0x42 
#define TXB1EID8        0x43 
#define TXB1EID0        0x44 
#define TXB1DLC         0x45 
#define TXB1D0          0x46 
#define TXB1D1          0x47 
#define TXB1D2          0x48 
#define TXB1D3          0x49 
#define TXB1D4          0x4A 
#define TXB1D5          0x4B 
#define TXB1D6          0x4C 
#define TXB1D7          0x4D 
 
 
#define TXB2CTRL        0x50 
#define TXB2SIDH        0x51 
#define TXB2SIDL        0x52 
#define TXB2EID8        0x53 
#define TXB2EID0        0x54 
#define TXB2DLC         0x55 
#define TXB2D0          0x56 
#define TXB2D1          0x57 
#define TXB2D2          0x58 
#define TXB2D3          0x59 
#define TXB2D4          0x5A 
#define TXB2D5          0x5B 
#define TXB2D6          0x5C 
#define TXB2D7          0x5D 
                          
 
#define RXB0CTRL        0x60 
#define RXB0SIDH        0x61 
#define RXB0SIDL        0x62 
#define RXB0EID8        0x63 
#define RXB0EID0        0x64 
#define RXB0DLC         0x65 
#define RXB0D0          0x66 
#define RXB0D1          0x67 
#define RXB0D2          0x68 
#define RXB0D3          0x69 
#define RXB0D4          0x6A 
#define RXB0D5          0x6B 
#define RXB0D6          0x6C 
#define RXB0D7          0x6D 
                          
 
#define RXB1CTRL        0x70 
#define RXB1SIDH        0x71 
#define RXB1SIDL        0x72 
#define RXB1EID8        0x73 
#define RXB1EID0        0x74 
#define RXB1DLC         0x75 
#define RXB1D0          0x76 
#define RXB1D1          0x77 
#define RXB1D2          0x78 
#define RXB1D3          0x79 
#define RXB1D4          0x7A 
#define RXB1D5          0x7B 
#define RXB1D6          0x7C 
#define RXB1D7          0x7D 
                          
 
 
 
 
#define TXREQ           0x08 
#define TXP             0x03     
 
 
#define RXM             0x60 
#define BUKT            0x04 
 
 
#define REQOP           0xE0 
#define ABAT            0x10 
#define OSM         0x08 
#define CLKEN           0x04 
#define CLKPRE          0x03 
 
 
#define REQOP           0xE0 
#define ICOD            0x0E 
 
   
#define RX0IE           0x01 
#define RX1IE           0x02 
#define TX0IE           0x04 
#define TX1IE           0x80 
#define TX2IE           0x10 
#define ERRIE           0x20 
#define WAKIE           0x40 
#define MERRE           0x80 
 
   
#define RX0IF           0x01 
#define RX1IF           0x02 
#define TX0IF           0x04 
#define TX1IF           0x80 
#define TX2IF           0x10 
#define ERRIF           0x20 
#define WAKIF           0x40 
#define MERRF           0x80 
 
 
#define B1BFS           0x20 
#define B0BFS           0x10 
#define B1BFE           0x08 
#define B0BFE           0x04 
#define B1BFM           0x02 
#define B0BFM           0x01 
 
 
#define SJW             0xC0 
#define BRP             0x3F 
 
 
#define BTLMODE         0x80 
#define SAM             0x40 
#define PHSEG1          0x38 
#define PRSEG           0x07 
 
 
#define WAKFIL          0x40 
#define PHSEG2          0x07 
 
 
#define TXB2RTS         0x04 
#define TXB1RTS         0x02 
#define TXB0RTS         0x01 
 
 
 
  
 
#define SJW_1TQ         0x40 
#define SJW_2TQ         0x80 
#define SJW_3TQ         0x90 
#define SJW_4TQ         0xC0 
 
 
#define BTLMODE_CNF3    0x80 
#define BTLMODE_PH1_IPT 0x00 
 
#define SMPL_3X         0x40 
#define SMPL_1X         0x00 
 
#define PHSEG1_8TQ      0x38 
#define PHSEG1_7TQ      0x30 
#define PHSEG1_6TQ      0x28 
#define PHSEG1_5TQ      0x20 
#define PHSEG1_4TQ      0x18 
#define PHSEG1_3TQ      0x10 
#define PHSEG1_2TQ      0x08 
#define PHSEG1_1TQ      0x00 
 
#define PRSEG_8TQ       0x07 
#define PRSEG_7TQ       0x06 
#define PRSEG_6TQ       0x05 
#define PRSEG_5TQ       0x04 
#define PRSEG_4TQ       0x03 
#define PRSEG_3TQ       0x02 
#define PRSEG_2TQ       0x01 
#define PRSEG_1TQ       0x00 
 
 
#define PHSEG2_8TQ      0x07 
#define PHSEG2_7TQ      0x06 
#define PHSEG2_6TQ      0x05 
#define PHSEG2_5TQ      0x04 
#define PHSEG2_4TQ      0x03 
#define PHSEG2_3TQ      0x02 
#define PHSEG2_2TQ      0x01 
#define PHSEG2_1TQ      0x00 
 
#define SOF_ENABLED     0x80 
#define WAKFIL_ENABLED  0x40 
#define WAKFIL_DISABLED 0x00     
 
 
 
 
 
#define RX0IE_ENABLED   0x01 
#define RX0IE_DISABLED  0x00 
#define RX1IE_ENABLED   0x02 
#define RX1IE_DISABLED  0x00 
#define G_RXIE_ENABLED  0x03 
#define G_RXIE_DISABLED 0x00 
 
#define TX0IE_ENABLED   0x04 
#define TX0IE_DISABLED  0x00 
#define TX1IE_ENABLED   0x08 
#define TX2IE_DISABLED  0x00 
#define TX2IE_ENABLED   0x10 
#define TX2IE_DISABLED  0x00 
#define G_TXIE_ENABLED  0x1C 
#define G_TXIE_DISABLED 0x00 
 
#define ERRIE_ENABLED   0x20 
#define ERRIE_DISABLED  0x00 
#define WAKIE_ENABLED   0x40 
#define WAKIE_DISABLED  0x00 
#define IVRE_ENABLED    0x80 
#define IVRE_DISABLED   0x00 
 
 
#define RX0IF_SET       0x01 
#define RX0IF_RESET     0x00 
#define RX1IF_SET       0x02 
#define RX1IF_RESET     0x00 
#define TX0IF_SET       0x04 
#define TX0IF_RESET     0x00 
#define TX1IF_SET       0x08 
#define TX2IF_RESET     0x00 
#define TX2IF_SET       0x10 
#define TX2IF_RESET     0x00 
#define ERRIF_SET       0x20 
#define ERRIF_RESET     0x00 
#define WAKIF_SET       0x40 
#define WAKIF_RESET     0x00 
#define IVRF_SET        0x80 
#define IVRF_RESET      0x00 
 
 
#define REQOP_CONFIG    0x80 
#define REQOP_LISTEN    0x60 
#define REQOP_LOOPBACK  0x40 
#define REQOP_SLEEP     0x20 
#define REQOP_NORMAL    0x00 
 
#define ABORT           0x10 
 
#define OSM_ENABLED     0x08 
 
#define CLKOUT_ENABLED  0x04 
#define CLKOUT_DISABLED 0x00 
#define CLKOUT_PRE_8    0x03 
#define CLKOUT_PRE_4    0x02 
#define CLKOUT_PRE_2    0x01 
#define CLKOUT_PRE_1    0x00 
 
 
#define OPMODE_CONFIG   0x80 
#define OPMODE_LISTEN   0x60 
#define OPMODE_LOOPBACK 0x40 
#define OPMODE_SLEEP    0x20 
#define OPMODE_NORMAL   0x00 
 
 
 
#define RXM_RCV_ALL     0x60 
#define RXM_VALID_EXT   0x40 
#define RXM_VALID_STD   0x20 
#define RXM_VALID_ALL   0x00 
 
#define RXRTR_REMOTE    0x08 
#define RXRTR_NO_REMOTE 0x00 
 
#define BUKT_ROLLOVER    0x04 
#define BUKT_NO_ROLLOVER 0x00 
 
#define FILHIT0_FLTR_1  0x01 
#define FILHIT0_FLTR_0  0x00 
 
#define FILHIT1_FLTR_5  0x05 
#define FILHIT1_FLTR_4  0x04 
#define FILHIT1_FLTR_3  0x03 
#define FILHIT1_FLTR_2  0x02 
#define FILHIT1_FLTR_1  0x01 
#define FILHIT1_FLTR_0  0x00 
 
[page]
 
#define TXREQ_SET       0x08 
#define TXREQ_CLEAR     0x00 
 
#define TXP_HIGHEST     0x03 
#define TXP_INTER_HIGH  0x02 
#define TXP_INTER_LOW   0x01 
#define TXP_LOWEST      0x00 
     
 
 
  
 #define DLC_0          0x00 
 #define DLC_1          0x01 
 #define DLC_2          0x02 
 #define DLC_3          0x03 
 #define DLC_4          0x04 
 #define DLC_5          0x05 
 #define DLC_6          0x06 
 #define DLC_7          0x07     
 #define DLC_8          0x08 
  
 
 
 
#define CAN_RESET       0xC0 
#define CAN_READ        0x03 
#define CAN_WRITE       0x02 
#define CAN_RTS         0x80 
#define CAN_RTS_TXB0    0x81 
#define CAN_RTS_TXB1    0x82 
#define CAN_RTS_TXB2    0x84 
#define CAN_RD_STATUS   0xA0 
#define CAN_BIT_MODIFY  0x05   
#define CAN_RX_STATUS   0xB0 
#define CAN_RD_RX_BUFF  0x90 
#define CAN_LOAD_TX     0X40   
 
 
 
 
#define DUMMY_BYTE      0x00 
#define TXB0            0x31 
#define TXB1            0x41 
#define TXB2            0x51 
#define RXB0            0x61 
#define RXB1            0x71 
#define EXIDE_SET       0x08 
#define EXIDE_RESET     0x00 
 
uchar can_boud=0x07;//MCP2515在16M晶振情况,can_boud=0x00总线波特率为1M,0x01=500K,0x03=250K,0x07=125K;公式:16M/(16*(1+X))   
uint bps=38400;//定义avr单片机串口波特率   
   
uchar eflag=0;//是不是扩展帧,为1则表示接收到的是扩展帧,0表示标准帧   
uchar Tdate[10]={0};//存放要发送标准帧的数据,最大10位,前2位是ID号,后8位是数据位   
uchar TID[2]={0,0};//存放要发送标准帧的ID号   
   
uchar Rdate[8]={0};//存放接收到的数据   
uchar RESID[4];//存放接收到的数据帧的ID号,标准帧只用到RESID[0],RESID[1],扩展帧全部用到   
   
uchar bytetime;//232与CAN透明转换时,根据不同的波特率确定所要延时的时间,   
uint usart_number=0;//计数当前所接收的串行数据的那一组数据流的数据个数,串口传来的数据存放在Tdate中等待用CAN标准帧发送   
   
uchar state;//2515状态(包括发送接收中断标志位和各请求发送位),具体见数据手册   
uchar DLC=8;//接收到数据的长度   
   
//   
//   
void delay(uchar k)//   
{uint i=0;   
 while(k--){for(i=0;i<8000;i++);}   
 }   
//##############################################################################   
void Set_CS(uchar level)          //   
{if(level)    PORTB|=0x10;        //   
 else         PORTB&=0xef;        //   
}   
//##############################################################################   
//   
//   
void WriteSPI(uchar order)   
{   uchar clear;   
    Set_CS(0);  //   
    SPDR=order;          //2515读指令为0x03   
    while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕   
    clear=SPSR;   
    clear=SPDR;//   
    Set_CS(1);  //   
}   
   
//   
uchar Read_state(uchar order)//读状态命令,order=0xa0,0xa1,   
{   uchar clear;   
    Set_CS(0);  //   
    SPDR=order;          //   
    while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕   
    clear=SPSR;   
    clear=SPDR;//   
       
    SPDR=0;             //空数据   
    while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕   
    clear=SPSR;   
    clear=SPDR;      //通过先读SPSR,紧接着访问SPDR来对SPIF清零   
       
    Set_CS(1);  //   
    return clear;   
}   
//   
uchar Read_Byte(uchar Address)   
{uchar clear;   
 uchar date;   
 Set_CS(0);            //使能SPI器件   
    
 SPDR=0x03;          //送2515读指令为0x03   
 while(!(SPSR&0x80));    //等待SPIF置位,等数据发送完毕   
 clear=SPSR;   
 clear=SPDR;             //通过先读SPSR,紧接着访问SPDR来对SPIF清零   
    
 SPDR=Address;              //送地址   
 while(!(SPSR&0x80));   
 clear=SPSR;   
 clear=SPDR;   
    
 SPDR=0x00;              //发空数据,启动数据发送以接收数据   
 while(!(SPSR&0x80));   
 clear=SPSR;   
 clear=SPDR;   
    
 date=SPDR;              //接收数据   
 Set_CS(1);              //关SPI器件DS1722   
 return date;   
}   
//   
void Write_Byte(uchar Address,uchar Data)   
{uchar clear;   
 Set_CS(0);          //使能SPI器件2515   
    
 SPDR=0x02;          //送2515写命令为0x02   
 while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕   
 clear=SPSR;   
 clear=SPDR;       
    
 SPDR=Address;       //送地址,启动SPI时钟   
 while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕   
 clear=SPSR;   
 clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零   
    
 SPDR=Data;   
 while(!(SPSR&0x80));   
 clear=SPSR;   
 clear=SPDR;   
 Set_CS(1);         //关SPI器件   
}   
//   
//###########################对CAN的一些操作####################################   
//   
void load_Standard_ID_dates(uchar num)//给标准帧装载ID和数据   
//选用发送缓冲器0,num:要发送的个数(最大8个)   
{   
 uchar i,j,T0=0x36;   
 uchar TIDH,TIDL;   
 i=TID[1]>>3;j=TID[0]<<5;j=j+i;i=TID[1]<<5;   
 TIDL=i;TIDH=j;//将数组TID中的值转化为TIDH,TIDL以便给TXB0SIDH,TXB0SIDL附值   
 Write_Byte(CANCTRL,0x80);//CAN工作在配置模式   
 Write_Byte(CNF1,can_boud);   
 Write_Byte(TXB0SIDH,TIDH);   
 Write_Byte(TXB0SIDL,TIDL);   
 Write_Byte(TXB0DLC,num);//    
 for(i=2;i 
 }   
//##############################################################################   
void Receive_all_ID_process(void)//结合MCP2515数据手册来看   
{uchar k;   
 k=RESID[1];//先判断接收到的是不是标准帧,因为标准帧和扩展帧的ID处理不一样   
 if((k&0x08)==0)   
   {//如果是标准处理方法   
    RESID[1]=RESID[1]>>5;   
    k=RESID[0]&0x1f;//借用k   
    k=k<<3;   
    RESID[1]=RESID[1]+k;   
    RESID[0]=RESID[0]>>5;   
    }   
 else   
    {//扩展帧处理方法,RESID[3]、RESID[4]不变   
     k=k>>5;   
     k=k<<2;   
     RESID[1]=RESID[1]&0x03;   
     RESID[1]=RESID[1]+k;   
     k=RESID[0];   
     k=k<<5;   
     RESID[1]=RESID[1]+k;   
     RESID[0]=RESID[0]>>3;//将RXB0SIDH,RXB0SIDL转化   
    }           
}   
//##############################################################################   
//##############################USART初始化程序###########################//   
void usart_init(void)   
{   
 UCSRB=(1< 
 UBRRL=(fosc/16/(bps+1))%6;   
 UBRRH=(fosc/16/(bps+1))/256;   
 UCSRC=(1< 
 bytetime=215983/bps;//215983=1000000*20/92.6,92.6=1024/11.0592,定时器分频为1024   
 bytetime=255-bytetime;//计算不同的波特率所要延时的初值,要附值给TCNT0,实现透明转换中用到   
}    
   
//##########################串行通信##########################//   
void putchar(uchar c)   
{while(!(UCSRA&(1< 
 UDR=c;}   
//##############################中断服务程序##################################//   
void INT1_17(void)   
{   
uchar i,j,k,R0=0x66;   
GICR &=0x7f;   
state=Read_state(0xa0);   
//WriteSPI(0xa0);//读取2515状态指令,状态值附值给state   
if((state&0x01)!=0)   
   {//判断是不是接收缓冲器0满产生的中断   
    k=Read_Byte(RXB0SIDL);//为了判断是标准帧还是扩展帧   
    if((k&0x08)==0)eflag=0;//置标准帧标志   
     else eflag=1;//置扩展帧标志   
    DLC=Read_Byte(RXB0DLC);   
    DLC &=0x0f;   
    RESID[0]=Read_Byte(RXB0SIDH);   
    RESID[1]=Read_Byte(RXB0SIDL);   
    RESID[2]=Read_Byte(RXB0EID8);   
    RESID[3]=Read_Byte(RXB0EID0);//先读取所有ID   
    Receive_all_ID_process();//处理RESID   
    for(i=0;i 
    if(eflag==0)   
      {//如果是标准帧   
       putchar(RESID[0]);   
       putchar(RESID[1]);//先送标准帧ID号   
       }   
    else    
      {//如果是扩展帧   
       putchar(RESID[0]);   
       putchar(RESID[1]);   
       putchar(RESID[2]);   
       putchar(RESID[3]);//先送扩展帧ID号       
      }   
    putchar(DLC);   
    for(i=0;i 
    }   
Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0   
GICR |=0x80;   
}   
//####################################   
void Usart_receive(void)//定义接收中断服务程序   
{Tdate[usart_number]=UDR;   
 usart_number++;   
 TIMSK=0x05;//打开T1,T0中断屏蔽   
 TCCR0=0x05;//设T0分频数为1024   
 TCNT0=bytetime;//设T0时间常数,从此值开始计数   
 }   
//##############定时器中断0,串行数据流控制   
void Timer0(void)   
{TIMSK=0x00;//关T0中断屏蔽   
 TCNT0=0x00;//   
 TCCR0=0x00;//T0停止计数   
 if((usart_number>2)&&(usart_number<11))   
   {    
    TID[0]=Tdate[0];TID[1]=Tdate[1];   
    load_Standard_ID_dates(usart_number-2);//对2515发送缓冲器0和ID寄存器进行数据装载   
    usart_number=0;   
    Write_Byte(CANCTRL,0x00);//选定工作模式   
    WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送   
   }   
   else  usart_number=0;   
 }   
//##############################CAN(2515)初始化程序###########################//   
void CAN_Initialize(void)   
{   
  WriteSPI(CAN_RESET);   
  delay(20);   
  Write_Byte(CANCTRL,0x80);//CAN工作在配置模式   
  Write_Byte(CNF1,can_boud);   
  Write_Byte(CNF2,0x80 | PHSEG1_3TQ | PRSEG_1TQ);//Set CNF2   
  Write_Byte(CNF3,PHSEG2_3TQ);   
  //0x80+0x10+0x00,相位缓冲段2由CNF3确定,相位缓冲段1为3TQ,传播段为1TQ   
  Write_Byte(RXB0CTRL,0xf0);//接收类型选择,接收所有报文   
  Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0   
  Write_Byte(CANINTE,0x01);//接收缓冲器0满中断使能   
  Write_Byte(CANCTRL,0x00);//选定正常工作模式   
}   
//##############################系统初始化程序################################//   
void AVR_Initialize(void)         //初始化   
{   
 DDRB=0xff;  //SPI口   
 PORTB=0xff;   
 DDRD=0xf0;//将外部中断引脚设定为输入   
 PORTD=0x7f;   
 SPCR=0b01011100;//关中断(SPIE=0),使能SPI(SPE=1),MSB首先发送(DORD=0)   
                 //选择微机为主机模式(MSTR=1)   
                 //空闲时SCK 为高电平(CPOL=1)   
                 //在SCK 的结束沿采样(CPHA=1)以保证数据稳定   
                 //SPR1=0和SPR0=0,SCK=fosc/4   
 SPSR |=0x01;//SPI的速度加倍   
 MCUCR=0x0a;//设置外部中断的中断触发方式为下降沿触发   
 GICR=0xc0;//通用中断控制寄存器设置,打开中断INT0和INT1   
 SREG=0x80;//开全局中断   
}   
//##################################主程序####################################//   
void main()   
{   
 AVR_Initialize();               //I/O口及中断初始化   
 CAN_Initialize();   
 usart_init();   
 UCSRB |=0x80;//接收中断使能   
}  

关键字:AVR单片机  CAN转换 引用地址:AVR单片机实现了232到CAN转换

上一篇:AVR单片机的DS18B20 C语言程序
下一篇:ATmega8---SPI总线控制

推荐阅读最新更新时间:2024-03-16 14:30

基于LPC2119的USB-CAN转换器设计
  引言   控制器局域网(controller area network,CAN)是20世纪80年代德国BOSCH公司为现代汽车应用而推出的一种多主机局部网,由于CAN总线具有可靠性高、功能完善、成本合理、实时性等优点,CAN总线早已不再局限于汽车行业,而被广泛应用于各个自动化控制系统中。目前CAN总线是国际上应用最广泛的现场总线之一。通用串行总线(universalserial bus,USB)作为一种协议规范,其除具有使用方便(即插即用)、功耗低、数据传输率高等优点外,还具有软硬件支持广泛、功耗低、硬件结构标准化和总线拓扑结构完备等特点。目前在以计算机为上位机的应用领域,都首选USB口作为计算机与外设的接口。   为了更好的
[单片机]
基于LPC2119的USB-<font color='red'>CAN</font><font color='red'>转换</font>器设计
IR与RS-232的匹配技术
现代电子设备通常包含最新的数据通信接口,以实现更高的数据率或增进用户的便利性。红外技术(IR)是数据通信接口的一个很好例子,但有时单独使用这种最新接口还是不够的,设备还需要与采用传统接口如RS-232的老设备兼容才会被用户所接受。因此,常见的红外技术和RS-232共存于同一设备中。 数据通信接口可以分成三个基本层:物理层、协议层和应用层。物理层主要定义硬件的电气特性和通信速度。协议层定义数据格式。应用层利用数据格式在特定设备中执行特定的工作。例如,在由红外数据协会(IrDA)所定义的协议中,应用层IrTran-P用于在成像设备如数码相机中传递图片。 RS-232只是一个物理层,而IR包括全部三个层。基于IrDA的IR也有多个物理层:
[嵌入式]
RS-232串口通信在PC机与单片机通信中的应用
  由于单片机具有体积小、价格低廉、适应性强的特点,一般在工业控制系统中,各种数据的采集和执行机构的控制都是由单片机来完成。而单片机的计算能力有限,难以进行复杂的数据处理。在功能比较复杂的自动控制系统中,通常以工控机为上位机,单片机为下位机,由单片机完成数据的采集及对设备的控制,而由上位机完成各种复杂的数据处理及对单片机的控制。在分布式控制系统中大多采用单片机作为下位机来进行数据采集和现场控制,在这些应用中,单片机只是直接面对被控对象底层,而对采集到的数据进行进一步的分析和处理工作,则是由功能强大的PC机来完成的。   因此,PC机和单片机之间就有着大量的数据交换。在绝大多数PC机的标准配置中,都有一个到多个RS 232串口,因为R
[单片机]
RS-<font color='red'>232</font>串口通信在PC机与单片机通信中的应用
基于AT89C51的CAN-RS232通信转换设计
1 引言 RS232作为标准的计算机串行接口已被广泛使用,与此同时,随着现场总线技术的飞速发展,具有实时性好、可靠性高、结构简单等优点的CAN总线在测控系统中也越来越多地被采用,但由于两者的总线结构、通信协议及传输特点各不相同,因而给不同设备之间的连接带来诸多不便。因此,如何以最简单的方式实现CAN节点与RS232串行口的通信就成为工程实践中一个不可回避的问题。 本文采用典型的不具备CAN通信能力的AT89C51单片机作为微处理器,设计了一个简单、实用的通信转换模块。该通信转换模块具有体积小、结构简单、通用性好、使用方便等特点。 2 工作原理 CAN-RS232通信转换模块通过硬件电路的电平标准转换和软件编程的通信协议转换实
[单片机]
基于AT89C51的<font color='red'>CAN</font>-RS<font color='red'>232</font>通信<font color='red'>转换</font>设计
RS232与RS485谁才是UART中的高速公路
串口通讯是电子工程师面对的最基本的一个通讯方式,RS-232是其中最简单的一种。然而,很多初学者往往搞不清楚UART和RS-232、RS-422、RS-485的联系和区别,本文将谈谈我对这几个概念的理解,帮助大家理清它们之间的关系。 通讯问题,和交通问题一样,也有高速、低速、拥堵、中断等等各种情况。如果把串口通讯比做交通,UART比作车站,那么一帧的数据就好比汽车。汽车跑在路上,要遵守交通规则。如果是市内,一般限速30、40,而高速公路则可以到120。而汽车走什么路,限速多少,就要看协议怎么规定了。常见的串口协议有RS-232、RS-422、RS-485等,那么谁才是UART中的高速公路?下面我们就一起来探讨一下。 一、U
[单片机]
RS<font color='red'>232</font>与RS485谁才是UART中的高速公路
AVR单片机使用内部上拉电阻的疑问
看了M16手册上对I/O端口的说明,其中说设置DDXn=0,PORTn=1,PUD=0.就可以使用内部上拉电阻了。既然可以这么用,那么在使用按键电路,低电平有效的时候,就可以用内部上拉,为何还用外接上拉? 曾问了一个网友,他说,内部上拉电阻小些,抗干扰不好,如果按键需要外接线还是有外部电阻好些。 所以请问一下BBS友人,AVR设置内部上拉的目的何在?对于外部上拉和内部上拉又应该如何选择? 1、内部上拉是一个阻值比较大的固定电阻。 在强干扰场合,或引线比较长的情况,外加较小阻值的上拉电阻,可以提高抗干扰能力。 2、技术总监awey说的很有道理,我对这个深有体会。我做EMC的时候,有干扰的情况下,按键会被误触发。再接一个1K
[单片机]
IFR: 2017年全球机器人规模达232亿美元 中国市场占27%
8月23日,在世界机器人大会上,中国电子学会发布了《中国机器人产业发展报告(2017年)》。报告指出,2017年中国机器人市场预计规模将达到62.8亿美元,2012-2017年的平均增长率达到28%。其中,工业机器人42.2亿美元,服务机器人13.2亿美元,特种机器人7.4亿美元。 本报告为工信部2016-2018年财政专项《建立我国机器人团体标准体系与产业信息资源库》的阶段性研究成果。以研判2017年国内机器人产业发展水平及特征趋势为目标,采取定性判断与定量分析相结合的方式,深度解析我国各区域机器人产业发展水平,对国内外机器人技术与产业发展态势进行比较分析。为国内广大机器人企业提供发展方向、路径及模式的参考依据,并为国家制
[机器人]
基于AVR单片机PWM功能的数控恒流源研制
随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高。现今,电源设备有朝着数字化方向发展的趋势。然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的,这虽然能获得较高的精度,但也使得成本大为增加。本文介绍一种基于AVR单片机PWM功能的低成本高精度数控恒流源,能够精确实现0~2A恒流。 系统框图 图1为系统的总体框图。本系统通过小键盘和LCD实现人机交流,小键盘负责接收要实现的电流值,LCD 12864负责显示。AVR单片机根据输入的电流值产生对应的PWM波,经过滤波和功放电路后对压控恒流元件进行控制,产生电流,电流再经过采样电阻到达负载。同时,对采样电阻两端信号进行差分和
[单片机]
基于<font color='red'>AVR单片机</font>PWM功能的数控恒流源研制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved