datasheet

ATmega128(与PC机通信)

2016-09-29来源: eefocus关键字:ATmega128  PC机通信
atmega128的USART串口发送与接收数据示例程序,采用串口1,发送和接收都是中断的方式

//先发送200个FF,然后单片机处于接收状态,接收数据显示在数码管上,电脑发送的数据格式如09,16进制形式
//编译环境 AVR Studio 4.17/AVR GCC
//系统时钟11.0592MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms

//***********************************************************************
//   包含文件
//***********************************************************************

#include
#include
#define  F_CPU 11.0590200  // 单片机主频为11.0592MHz,用于延时子程序 
#include
#include
#include
#include    //中断信号头文件

//***********************************************************************
//   定义变量区
//***********************************************************************

#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


#define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)


#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)                    //低位


uint   tx_count=200,tx_flag=0xff;
static uchar A1,A2,A3;                                  
uchar usart_tx_data;
uchar usart_rx_data;

//***********************************************************************
//   共阴数码管显示的断码表0~F
//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//***********************************************************************
//   IO端口初始化
//***********************************************************************

void system_init()
{
    Data_IO=0xFF;             //数据口为输出
    Data_DDR=0xFF;

    PORTD=0xFF;               //74HC573的控制口,设置为输出
    DDRD=0xFF;
}

//*************************************************************************
//   74HC573控制数码管动态扫描显示函数,显示采集到的温度
//*************************************************************************

void Display_Uart(uint data_b,uint data_s,uint data_g)
{
  uchar i,j;
  system_init();
     j=0x01;                    //此数据用来控制位选
 for(i=0;i<5;i++)               //用后3位数码管来显示
  {
     D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=0x00;           
     D_LE0;                      
     delay_ms(1);                
  }
     D_LE1;                    
     W_LE1;                    
     Data_IO=~j;               
     W_LE0;                    
  j=(j<<1);
     Data_IO=table[A1];         
     D_LE0;                    
     delay_ms(1);             

     D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=table[A2];             
     D_LE0;                      
     delay_ms(1);   
  
  D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=table[A3];             
     D_LE0;                      
     delay_ms(1);                                     

}


void usart_init()
{
  UCSR1A=0x00;                                 //单倍速模式
  UCSR1B=0xF8;                                 //接收中断和发送中断允许                               
  UCSR1C=(1<   UBRR1H=baud_h;                               //写波特率的值
  UBRR1L=baud_l; 
}

//*************************************************************************
//  数据处理函数
//*************************************************************************
 void data_do(uchar temp_d)
 {
     uchar A2t;
     A1=temp_d/100;                       //分出百,十,和个位
     A2t=temp_d%100;
     A2=A2t/10;
     A3=A2t%10;
}

//*************************************************************************
//  串口相关中断服务子程序
//*************************************************************************
                                     //数据发送结束中断向量
SIGNAL(SIG_USART1_TRANS)             //中断服务程序
{
   delay_ms(10);                   //相关操作
}

                                   //数据接收结束中断向量
SIGNAL(SIG_USART1_RECV)            //中断服务程序
{
    usart_rx_data=UDR1;            //将接收到的数据取出
    data_do(usart_rx_data);                   //数据处理,得到个位十位百位
 
}
                                  //数据寄存器空中断向量
SIGNAL(SIG_USART1_DATA)           //中断服务程序
{
                            
   UDR1=usart_tx_data;           //发送数据到数据寄存器
   tx_count--;
   if(tx_count==0x00)
   {
   tx_flag=0x01;
   UCSR1B=0xF0;                 //禁止发送
   }
}


//*************************************************************************
//   主程序
//*************************************************************************
void main()
{
  system_init();                             //系统初始化
  usart_init();                              //usart串口初始化配置
  usart_tx_data=0xff; 
  SREG|=0x80;                                //开启全局中断
  while(1)
  {  
     SREG=0x00;                               //关中断,PD口做IO口用,才能正常显示数码管
  Display_Uart(A1,A2,A3);                  //显示接收到的数据   
  SREG|=0x80;                              //开中断,用于下次接收中断
  }
}

关键字:ATmega128  PC机通信

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016092929951.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ATmega128学习(MOdbus串口通信)
下一篇:ATmega128(12864带字库)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ATmega16定时器1的时间设定

在Atmel Studio 7环境下编写程序感觉比较舒服。目的:根据设定的时间触发中断,触发一次,变量累加一次;用到中断,所以一开始需要#include变量:unsigned char  time = 0;定时器1配置:void ConfigTimer1(unsigned int set){TCCR1B |= (1<<2);//256分频      比如12M ,就是12000000/256  tmp = 65536-set;//set=( 晶振频率/分频) * 定时时间)TCNT1H = (unsigned char)(tmp>>
发表于 2018-10-07

Atmega16中使用modbus协议

调试工具:Modbus Poll编程软件:Atmel Studio 7理解:PC中的Modbus Poll是主机,而AVR芯片作为从机此处有两种串行传输模式:RTU和ASCII此处使用了RTU模式,这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。//以下是必要的函数void usart_init(uint baud)//波特率{UCSRA = 0X00;UCSRB = 0X00;                
发表于 2018-10-07

Atmega8a的采样(查询法)

];//存温度#define get while(!(ADCSRA & (1 << ADIF)))//若转化完成,ADIF=1========================================atmega8和16不同,16的采样可以由定时器触发
发表于 2018-10-07
Atmega8a的采样(查询法)

Atmega48-88-168熔丝位设置方法

         本文以Atmega168PA+PROGISP为例说明Atmega48-88-168熔丝位的设置方法,参考设计电路图如下图所示,外接7.3728M无源晶振。          1、启动PROGISP软件,正确连接下载器和目标板,选择Atmega168PA,点击“RD”按钮,一切正常的话,应在提示栏中看到正确提示。       2、 点击“...”按钮,打开“Fuse&Lock”对话框,选择“向导方式”。 
发表于 2018-09-10
Atmega48-88-168熔丝位设置方法

Atmega168 外部10M晶振熔丝位设置方法

    本日志介绍 Atmega168外部10M晶振熔丝位设置方法。    图1:Boot Flash 1024;使能串行下载;看门狗使能         图2:电压低于2.7V复位          图3:外部晶振8M以上,启动速度最慢;没有Flash加密;没有Boot Loader     
发表于 2018-09-10

Atmega168 延时函数晶振频率的设置方法

    本文介绍,在Atmel Studio环境中,更改延时函数(宏)的晶振频率的方法。    在Atmel Studio中,可以使用_delay_us(x)宏和_delay_ms(x)进行精准延时,但是在使用这2个宏之前必须设置当前的晶振频率,本日志介绍其设置方法。    1、在项目上点击右键,选择属性         2、在属性栏中,选择工具链,然后选择“Symbols”,然后将F_CPU宏,更改为相应的晶振频率即可。   
发表于 2018-09-10
Atmega168 延时函数晶振频率的设置方法

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved