ATmega128学习(MOdbus串口通信)

发布者:qq8174350最新更新时间:2016-09-29 来源: eefocus关键字:ATmega128  MOdbus  串口通信 手机看文章 扫描二维码
随时随地手机看文章
 //ATmega128 AU  USART1,波特率9600,modbus协议,单速,1停止位,CRC校验

//编译器 :ICC7.22
//晶振:11.0592MHZ,,外部高频石英震荡器,启动时间4.1ms
//熔丝:扩展位:0xff, 0x19af,加密位:0xff

//***********************************************************************
//        初始化去,参数定义区  
//***********************************************************************
#include
#include
#include
#include
#define  F_CPU 11059200  // 外部晶振11.0592MHz 
                  
#define uchar           unsigned char
#define uint            unsigned int
#define ulong           unsigned long

#define baud           9600                                  //波特率
#define baud_setting   (uint)((ulong)F_CPU/(16*(ulong)baud)-1)  //设置波特率
#define baud_h         (uchar)(baud_setting>>8)                 //设置波特率高位
#define baud_l         (uchar)(baud_setting)                    //设置波特率地位
#define send_485       PORTE|=(1< #define receive_485    PORTE&=~(1< #define televise_add   0xff
#define send_ok 0x01

#define RS_CLR PORTF &= ~(1 << PF1)                 //RS置低
#define RS_SET PORTF |= (1 << PF1)                  //RS置高

#define RW_CLR PORTF &= ~(1 << PF2)                 //RW置低
#define RW_SET PORTF |= (1 << PF2)                  //RW置高

#define EN_CLR PORTF &= ~(1 << PF3)                 //E置低
#define EN_SET PORTF |= (1 << PF3)                  //E置高

#define PSB_CLR PORTF &= ~(1 << PE2)                 //PSB置低,串口方式
#define PSB_SET PORTF |= (1 << PE2)                  //PSB置高,并口方式

#define LOW  0
#define HIGH    1

//12864初始化指令
#define CLEAR_SCREEN 0x01  //清屏指令:清屏且AC值为00H
#define AC_INIT      0x02  //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD  0x06  //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE  0x30  //工作模式:8位基本指令集
#define DISPLAY_ON  0x0c  //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF  0x08  //显示关
#define CURSE_DIR  0x14  //游标向右移动:AC=AC+1
#define SET_CG_AC  0x40  //设置AC,范围为:00H~3FH
#define SET_DD_AC  0x80

#define Data_IO         PORTA                //液晶数据口
#define Data_DDR        DDRA                 //数据口方向寄存器
#define D_LE0         PORTD &= ~(1 << PD4) //数码管段控制位为0,锁存端口数据
#define D_LE1           PORTD |= (1 << PD4)  //数码管段控制位为1,锁存器输出与端口一致
#define W_LE0         PORTD &= ~(1 << PD5) //数码管位控制位为0
#define W_LE1           PORTD |= (1 << PD5)  //数码管位控制位为1

volatile unsigned char  digit[10]={"0123456789"};
volatile uchar address=0x01;//从机地址

volatile uchar RX_bit=0;//接收中断置位标志
static uchar A1,A2,A3,A4,A5;  //十进制数据转化缓存数据                              
uchar usart_tx_data[250];//发送数据缓存
uchar *TX_data;//发送数据copy指针变量
uchar *RX_data;//接收数据copy指针变量
uchar usart_rx_data[250];//发送数据数组
uchar rx_data_buf[250];//发送数据缓存数组
uchar data_buf[250];//校验缓存数组
uchar rx_count=0;//发送数据个数计数
uchar tx_count=0;//接收数据个数计数
uchar read_count=0;//接收数据读取计数,copy
uint RX_length=0;//接收数据长度,个数
volatile uint CRC_word=0xffff;//计算CRC校验码
volatile uint RX_CRC_word=0xffff;//接收到CRC校验码
/*******************************************************************************
* 函数名称: LCD_write_com(unsigned char com) 
* 函数功能: 液晶屏写命令
* 参数变量:unsigned char com
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void LCD_write_com(unsigned char com) 

 RS_CLR;
 RW_CLR;
 EN_SET;
 Data_IO = com;
 delay_nms(5);
 EN_CLR;
}
/*******************************************************************************
* 函数名称: LCD_write_data(unsigned char data)
* 函数功能: 液晶屏写数据
* 参数变量:unsigned char data 
* 全局变量: work_data_do_Tx()
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void LCD_write_data(unsigned char data) 
{
 RS_SET;
 RW_CLR;
 EN_SET;
 Data_IO = data;
 delay_nms(5);
 EN_CLR;
}
/*******************************************************************************
* 函数名称: LCD_clear(void) 
* 函数功能: 清屏
* 参数变量: 
* 全局变量: 
* 调用函数:LCD_write_com(uint com); 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void LCD_clear(void) 
{
 LCD_write_com(0x01);
 delay_nms(5);
}
/*******************************************************************************
* 函数名称: DisplayCgrom(uchar addr,uchar *hz)
* 函数功能: 写汉字
* 参数变量: uchar addr,uchar *hz
* 全局变量: 
* 调用函数: LCD_write_com(uint com);
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void DisplayCgrom(uchar addr,uchar *hz)
{
 LCD_write_com(addr);
    delay_nms(5);
 while(*hz != '\0')
 {
  LCD_write_data(*hz);
  hz++;
        delay_nms(5);
 }

/*******************************************************************************
* 函数名称:WriteAddress(unsigned char x)
* 函数功能: 写地址,从左到右
* 参数变量: unsigned char x
* 全局变量: 
* 调用函数: LCD_write_com(uint com);
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void WriteAddress(unsigned char x)
{
     LCD_write_com(x|0x80); //地址  x + 0x80
}
/*******************************************************************************
* 函数名称: Display(void)
* 函数功能: 
* 参数变量: 
* 全局变量: 
* 调用函数:DisplayCgrom(uchar addr,uchar *hz)
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void Display(void)
{
 DisplayCgrom(0x80,"久辉电气欢迎你");
 DisplayCgrom(0x88,"旺:jingyehanxing");
 DisplayCgrom(0x90,"www.jhdq.net  ");
 DisplayCgrom(0x98,"电话:13816062843");
}
/*******************************************************************************
* 函数名称: LCD_init(void) 
* 函数功能: 
* 参数变量: 
* 全局变量:
* 调用函数:LCD_write_com(uint com)
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/

void LCD_init(void) 
{
 DDRA = 0xFF;            //I/O口方向设置
 DDRA |= (1 << PA5) | (1 << PA6) | (1 << PA7);
 LCD_write_com(FUN_MODE);   //显示模式设置
 delay_nms(5);
 LCD_write_com(FUN_MODE);   //显示模式设置
 delay_nms(5);
    LCD_write_com(DISPLAY_ON);   //显示开
 delay_nms(5);
    LCD_write_com(CLEAR_SCREEN);   //清屏
 delay_nms(5);
}
/*******************************************************************************
* 函数名称:get_crc(uint n)
* 函数功能: CRC校验码
* 参数变量: uint n
* 全局变量: data_buf[i]   CRC_word
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
uint get_crc(uint n)
{
    uchar i,j;
    CRC_word=0xffff;//赋值:0xffff
    for(i=0;i       {
         CRC_word^=(uint)data_buf[i];//计算CRC_word
         for(j=0;j<8;j++)
          {
             if(CRC_word&0x0001)
              {
                CRC_word=CRC_word>>1;
                CRC_word^=0xa001;
              }
             else
              {
               CRC_word>>=1;
              }   
          }
      }
    return CRC_word; 
}
/*******************************************************************************
* 函数名称: USART_Flush( void )
* 函数功能: 刷新通信数据寄存器
* 参数变量: dummy
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void USART_Flush( void )
{
   unsigned char dummy;
  while ( UCSR1A & (1<         dummy = UDR1;
}
/*******************************************************************************
* 函数名称: USART_Receive()
* 函数功能: 串行通信接收
* 参数变量: 
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
unsigned char USART_Receive()
{
    //等待数据寄存器为空
    while ( !(UCSR1A & (1<    ;
   //接收数据
   return UDR1;
}
/*******************************************************************************
* 函数名称: void USART_Transmit(uchar data)
* 函数功能: 
* 参数变量: 
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void USART_Transmit(uchar data)
{
  //等待数据寄存器为空
   while ( !( UCSR1A & (1<   ; 
  //数据放入缓存器                     
     UDR1 = data;
}
/*******************************************************************************
* 函数名称: uart1_init(void)  字符长度 8bit
* 函数功能: 串行口通信初始化,bit:9600  ,单倍速,一停止位,校验 无
* 参数变量: 
* 全局变量: 
* 调用函数: 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void uart1_init(void)
{
  UCSR1B=0x00;//不使能设定波特率
  UCSR1A=0x00;   // 
  UCSR1B=0x98;//接收中断,发送使能(查询)                             
  UCSR1C=(1<   UBRR1H=baud_h;      //设置波特率
  UBRR1L=baud_l;
}
/*******************************************************************************
* 函数名称: data_do(uint temp_d)
* 函数功能: 接收数据 16-->10进制处理 ,五位
* 参数变量: A1,A2,A3,A4,A5[uchar],temp(uint)
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
 void data_do(uint temp_d)//
 {
     A1=temp_d%10;//?               
     A2=(temp_d/10)%10;//
     A3=(temp_d/100)%10;
  A4=(temp_d/1000)%10;
  A5=temp_d/10000;//
}
/*******************************************************************************
* 函数名称: uart1_rx_isr(void)
* 函数功能:中断接收多数据
* 参数变量: 
* 全局变量:usart_rx_data[rx_count], rx_count++; RX_bit;
* 调用函数:USART_Flush()
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC
void uart1_rx_isr(void)
{
   usart_rx_data[rx_count]=UDR1;//接收数据
  USART_Flush();//刷新寄存器
  rx_count++;//累计接收数据个数
  RX_bit=1;//接收中断置位
}
/*******************************************************************************
* 函数名称: funtion_03()
* 函数功能: modbus通信读操作(从机)
* 参数变量: 
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void funtion_03()
{


;
}
/*******************************************************************************
* 函数名称: funtion_04()
* 函数功能: 
* 参数变量: 
* 全局变量: 
* 调用函数:TX_data_set[i] 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void funtion_04()//
{
;

}
/*******************************************************************************
* 函数名称: funtion_06()
* 函数功能: modbus通信写操作(从机)
* 参数变量: 
* 全局变量: work_data_do_Tx()
* 调用函数:TX_data_set[i] 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void funtion_06()//???
{

  ;//EEPROM??????
}
/*******************************************************************************
* 函数名称: funtion_06() 
* 函数功能:读故障详细参数
* 参数变量: 
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void funtion_07()
{
;
}
/*******************************************************************************
* 函数名称: send_code_fun()
* 函数功能: modbus发送读数据命令函数
* 参数变量:uchar addrs,uchar funtion,uint data_addr,uint data_length
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void send_code_fun(uchar addrs,uchar funtion,uint data_addr,uint data_length)
{
    char i=0;//
 data_buf[0]=addrs;//从机地址
 data_buf[1]=funtion;//功能码
 data_buf[2]=data_addr/256;
 data_buf[3]=data_addr%256;//数据地址
 data_buf[4]=data_length/256;//
 data_buf[5]=data_length%256;//数据长度
 CRC_word=get_crc(6);//CRC_word 计算
 data_buf[6]=CRC_word%256;//CRC_word 低位
 data_buf[7]=CRC_word/256;//CRC_word 高位        
 for(i=0;i<6+2;i++)
     {
    usart_tx_data[i]=data_buf[i];//数据放入发送缓存器
    USART_Transmit(usart_tx_data[i]);//发送数据
  }
}
/*******************************************************************************
* 函数名称:  receive_main()
* 函数功能: 接收主函数
* 参数变量: 
* 全局变量:
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void receive_main()
{
    delay_nms(300);
 CLI(); //全局中断不使能
 rx_count=0;//中断计数器清零
 send_485;//485处于发送状态
 UCSR1B=0x08; //串口初始化
 delay_nms(15);//485响应时间
 RX_length=data_buf[2]*256+data_buf[3];//取数据长度数据
 RX_CRC_word=data_buf[RX_length+1]*256+data_buf[RX_length];//取CRC校验码
 CRC_word=get_crc(RX_length);//计算接收数据校验码
 if(CRC_word==RX_CRC_word)//校验数据比较
   {
        if(data_buf[0]==address||data_buf[0]==televise_add)//地址比较
      {
                 send_code_fun(1,3,0,1);//发送数据
         UCSR1B=0x00; //通信不使能
         switch(usart_rx_data[1])//接收数据处理
                  {
                      case 0x03:funtion_03();break;//???
                case 0x04:funtion_04();break;//
                case 0x06:funtion_06();break;//???
                case 0x07:funtion_07();break;//???
                default:  break;
                  }
      }
    else ;
      }
 
 else ;
 receive_485;//485处于接收状态
    UCSR1B=0x90; //通信寄存器设置
 delay_nms(15);//485响应时间
 SEI(); //全局中断使能
}
/*******************************************************************************
* 函数名称: send_data_do(uint do_length)
* 函数功能: 发送数据
* 参数变量: 
* 全局变量: 
* 调用函数:get_crc(uchar n) , 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void send_data_do(uint do_length)
{
//
//
//
//
//
 CRC_word=get_crc(do_length);//CRC_word计算
 data_buf[do_length]=CRC_word%256;//CRC_word 低位
 data_buf[do_length+1]=CRC_word/256;//CRC_word 高位
}
/*******************************************************************************
* 函数名称: send_main(uint length)
* 函数功能: 
* 参数变量: 
* 全局变量: send_data_do(length);
* 调用函数:TX_data_set[i] 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void send_main(uint length)
{
   uint i_tx=0;
   send_485;//487处于发送状态
   UCSR1B=0x08; //串行口处于发送
   delay_nms(15);//485响应时间
   send_data_do(length);//发送数据处理
   for(i_tx=0;i_tx      {
    usart_tx_data[i_tx]=data_buf[i_tx];//缓存数据放入发送数组
    USART_Transmit(data_buf[i_tx]);//发送数据
    USART_Flush();//刷新通信数据寄存器
  }
}
/*******************************************************************************
* 函数名称: port_init(void)
* 函数功能: 
* 参数变量: 
* 全局变量:
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void port_init(void)
{
    PORTE|=0x10;//PE4  485 DE/RE 
    PORTE=0xff;//
    PORTB=0xff;
    PORTB=0xff;
    Data_IO = 0xFF;            //电平设置
 Data_DDR = 0xFF;            //方向输出
 PORTF = 0xFF;                       //电平设置
 DDRF = 0xFF;                        //方向输出
    PORTD=0xFF;
 DDRD=0xFF;
 PORTE=0xFF;                        //PSB对应于PE2
 DDRE=0xFF;
 D_LE1;                             //关掉数码管,以免显示乱码                   
    W_LE1;                     
    Data_IO=0xFF;                      //关数码管            
    W_LE0; 
 PSB_SET; 
}
/*******************************************************************************
* 函数名称: send_TX_fun(uint length)
* 函数功能: 
* 参数变量: 
* 全局变量: work_data_do_Tx()
* 调用函数:TX_data_set[i] 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 XDIV  = 0x00; //xtal divider
 XMCRA = 0x00; //external memory
 port_init();//口初始化
 uart1_init();//串口通信 1 初始化
 
 MCUCR = 0x00;
 EICRA = 0x00; //extended ext ints
 EICRB = 0x00; //extended ext ints
 EIMSK = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 ETIMSK = 0x00; //extended timer interrupt sources
 receive_485;//485处于接收状态
 //all peripherals are now initialized
}
/*******************************************************************************
* 函数名称: send_TX_fun(uint length)
* 函数功能: 
* 参数变量: 
* 全局变量: work_data_do_Tx()
* 调用函数:TX_data_set[i] 
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void du_fun()
{
 USART_Transmit(0x01);//发送数据
 USART_Flush();
 USART_Transmit(0x03);
 USART_Flush();
 USART_Transmit(0x00);
 USART_Flush();
 USART_Transmit(0x00);
 USART_Flush();
 USART_Transmit(0x00);
 USART_Flush();
 USART_Transmit(0x01);
 USART_Flush();
 USART_Transmit(0x84);//CRC L
 USART_Flush();
 USART_Transmit(0x0a);//CRC H
 USART_Flush();
 UCSR1B=0x98;
}
/*******************************************************************************
* 函数名称: set_addrress()
* 函数功能:设置从机地址 
* 参数变量: 
* 全局变量:
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void set_addrress()
{
   
}
/*******************************************************************************
* 函数名称: main()
* 函数功能: 主函数
* 参数变量: 
* 全局变量: 
* 调用函数:
* 作者: 张奇
* 编写时间:10-06-03
* 修改时间: 10—07-20
* 版本:V1.0
*******************************************************************************/
void main()
{
      init_devices(); //系统初始化                    
    LCD_init();  //液晶参数初始化设置
    Display();//显示 
    delay_nms(1000);  //延时1000ms                               
    LCD_clear();  //清屏
    send_code_fun(1,6,0,0x190);//发送写数据
   // send_code_fun(1,3,0,1);//发送写数据
//写格式:地址(8bit)  功能(8bit)  数据地址(16bit) 写数据(16bit)
//读格式:地址(8bit)  功能(8bit)  数据地址(16bit) 数据个数(16bit) 
    SEI(); //开全局中断                             
        for(;;)
  {
            delay_nms(2000);//时间很重要,
   if(RX_bit==1)//处理接收中断
     {
       RX_bit=0;//清中断标志
       CLI();//全局中断无效
         RX_data=&usart_rx_data[0];//指针接收数组首地址
     for(read_count=0;read_count       {
          rx_data_buf[read_count]=*RX_data++;//指针复制数组
      }
     WriteAddress(0x80);//写地址
     delay_nms(5); //延时
           data_do(rx_data_buf[0]); //数据处理
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//写显示数据
        delay_nms(5);
     
     WriteAddress(0x82);//
     data_do(rx_data_buf[1]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
     
     WriteAddress(0x84);//
     data_do(rx_data_buf[2]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
     
     WriteAddress(0x86);//
     data_do(rx_data_buf[3]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
     
     WriteAddress(0x90);//
     data_do(rx_data_buf[4]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
     
     WriteAddress(0x92);//
     data_do(rx_data_buf[5]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
     
     WriteAddress(0x94);//
     data_do(rx_data_buf[6]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
    
     WriteAddress(0x96);//
     data_do(rx_data_buf[7]); //
       delay_nms(5);
       LCD_write_data(digit[A3]);//
      delay_nms(5);
       LCD_write_data(digit[A2]);//
     delay_nms(5);
       LCD_write_data(digit[A1]);//
        delay_nms(5);
     rx_count=0;//接收中断次数清零
     SEI(); //开全局中断
     }
   }
}

关键字:ATmega128  MOdbus  串口通信 引用地址:ATmega128学习(MOdbus串口通信)

上一篇:ICC AVR 过渡到 AVR STUDIO
下一篇:ATmega128(与PC机通信)

推荐阅读最新更新时间:2024-03-16 15:12

基于S3C2410的嵌入式串口通信设计
1S3C2410硬件平台简介 S3C2410是韩国三星公司生产的新一代高性能微处理器,它是基于ARM920T内核的16/32位RISC处理器.主要应用于嵌入式系统中。 S3C2410拥有强大的数据处理能力.又有着低成本.低功耗等优点.在各种手持及移动设备上的应用越来越广泛,基于其平台的程序功能也越来越复杂。于是,在其平台上架构多线程的操作系统已成为越来越多系统设计者的诉求,本文介绍多线程在S3C2410上的具体实现过程。 2 系统结构分析 串行端口的本质功能足作为CPU和串行设备问的编码转换器,一般微机内都配有通信适配器,使计算机能够与其他具有RS232C串口的计算机或设备进行通信。本系统主要目的是实现宿主机与目标
[单片机]
基于S3C2410的嵌入式<font color='red'>串口通信</font>设计
51单片机字符串口通信为什么乱码?终于找到原因了
被这个问题卡了3天,代码很简单就是乱码出问题,烦恼! 后来查资料找到原因,晶振12MHz和11.0592Hz的问题。 如果你用的是12Mhz的单片机,定时器初值TH1一般要设置到E6(2400bps)、F3(4800bps)。 对应的在上位机配置UART串口时,选取2400 4800bps。如果试了不行,那就换更低的1200bps。 修改前 修改后 做了半天才发现我的晶振是11.0592Mhz,为啥对应的开发板视频讲的是12Mhz。 以4800bps为例,TH1=TL1=0xF4,SMOD=1,波特率翻倍=2*2400bps。这样就不会乱码了 ------------------------------
[单片机]
51单片机字符<font color='red'>串口通信</font>为什么乱码?终于找到原因了
嵌入式系统中串口通信帧的同步方法
引 言    串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中.中断服务子程序在系统运行过程中占用了较多的时间,就有可能在中断眼务子程序正运行时,又产生一个同类型或其他类型的中断,从而造成主程序得不到执行或后续中断数据丢失。所以,嵌入式系统中的串口通信虽然看似简单,但其中仍有许多问题值得研究,例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、基于FIFO队列和基于状态
[单片机]
485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控配置案例
本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式,使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关,用户可以有效地管理和监控设备,从而提高生产力和效率。 打开博图加载PLC,本案例使用的是1200PLC 配置PLC的IP地址(应与本地IP地址保持在同一网段) 添加GSD文件 GSD文件安装完成后,单击打开网络视图下的硬件目录 找到网关驱动程序并双击将其添加到博图 单击选择modbus转profibus网关驱动接口连接到1200PLC 配置网关IP地址(与PLC在同一网段) 在设备视图
[嵌入式]
485<font color='red'>modbus</font>转profinet网关连三菱变频器<font color='red'>modbus</font>通讯触摸屏监控配置案例
采用LabVIEW的PC机与变频器的串口通信
本文针对摩擦学试验研究的特点,采用广泛使用的LabVIEW编程语言,开发用于东元7200MA变频器运行频率的控制串口通讯程序。 由于摩擦学试验机和摩擦学测试的特殊性,摩擦学试验中的变频器调速有着不同于一般工业变频控制的特点。一方面,要求变频器调速能够在较大范围内满足摩擦学测试的要求,使得试验结果具有可比性;另一方面,摩擦磨损试验过程中,对控制有一些特殊的要求,例如需要特殊的速度、运动的非周期性以及设备的快速启动和停止等。在一些疲劳试验中,甚至要求电机进行寸动或者往复运动以检测材料的性能,有的试验现场对人体的损害比较大,需要远距离进行控制和检测电机的运转情况。所以,必须利用计算机程序控制变频器实现一些特殊控制功能。这就
[单片机]
PIC单片机与触摸屏串行通信的MODBUS协议实现
摘要:介绍一种在PIC单片机与触摸屏之间采用Modbus协议实现异步串行通信的方法。简单介绍了Modbus通信协议,给出了硬件电路连接图、程序流程图以及用PIC单片机C语言编写的部分通信程序。实际使用证明该方法数据传输稳定可靠,并提供了良好的人机交互环境。 关键词:触摸屏 PIC单片机 Modbus协议 通信 工控中经常需要观察系统的运行状态或者修改运行参数。触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus协议是美国M
[应用]
PIC16F883单片机EUSART串口通信
在两个单片机之间建立串口通信。 说明:我们使用数码管显示接收到的数据,数据是对方的按键编号。 硬件连接图: 有一点至关重要,就是两个单片机要共地。发送和接收引脚在两个单片机上交叉相连。 这里采用的是异步发送和接收。 发送原理图: EUSART接收图: 时序图: 实现代码流程图: 实现代码: #include p16f883.inc __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF &
[单片机]
PIC16F883单片机EUSART<font color='red'>串口通信</font>
STM32微控制器的可靠串口通信技术研究
引言 STM32F107微控制器是意法半导体推出的高性能32位以CortexM3为内核的面向工业控制的处理器。该处理器内部通过一个多层的AHB总线构架相连,其内部集成了丰富的外设,如USART、SPI、ADC等等。另外,STM32F107处理器还提供多达80个通用I/O接口,如此丰富的资源使STM32系列微控制器能够很理想地用于工业控制。本文设计出一种基于STM32F107的可靠串口通信设计方案,可以完成STM32F107处理器和PC机以及其他串口之间的可靠通信 。 1 串口通信的实现 1.1 硬件设计 STM32F107处理器的通用同步异步通信单元(USART)提供 5个独立的异步串行接口,并且都能工作在中断和DMA模式
[单片机]
STM32微控制器的可靠<font color='red'>串口通信</font>技术研究
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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