发几个关于USART串口通讯的程序

发布者:快乐旅行最新更新时间:2016-10-24 来源: eefocus关键字:USART  串口通讯 手机看文章 扫描二维码
随时随地手机看文章
*************************实验目的*****************************
名称:USART测试

***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

#define FRAMING_ERROR (1< #define PARITY_ERROR (1< #define DATA_OVERRUN (1< #define DATA_REGISTER_EMPTY (1< unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<500;i++)
  for(j=0;j<500;j++);
}
/*******************接收函数************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
  unsigned char status,data;
  status = UCSRA;
  data = UDR;
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    PORTA = led_7[data];
}
/******************发送函数************************/
void USART_Transmit(unsigned char data)
{
   while (!(UCSRA & DATA_REGISTER_EMPTY));   // 等待发送寄存器空                       
   UDR = data;                       // 发送数据    
}

void main( void )
{
  unsigned char i=0;

  PORTA = 0x00;     // LED段码输出
  DDRA = 0xff;
  PORTD = 0x03;     // TXD(PD1)输出
  DDRD = 0x02;     // RXD(PD0)输入,上拉有效

  UCSRA = 0x00;     // USART初始化
  UCSRB = (1<   //UCSRB = 0x98;
  UCSRC = (1<ta, 1 Stop, No Parity
                                //UCSRC = 0x86;
  UBRRH=BAUD_H;                   // 设置波特率
  UBRRL=BAUD_L;
  SEI();                         //允许全局中断     
   for(;;)
   {
       USART_Transmit(i); 
      if (++i>=10) i = 0;
      delay();
   }
}
复制代码
 
 
/*************************实验目的*****************************
名称:USART测试
目的:发送字符,字符串到PC上显示(本例中LED显示不用)
作者:竹林清风
***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

#define FRAMING_ERROR (1< #define PARITY_ERROR (1< #define DATA_OVERRUN (1< #define DATA_REGISTER_EMPTY (1< unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<20;i++)
  for(j=0;j<500;j++);
}
/*******************接收函数************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
  unsigned char status,data;
  status = UCSRA;
  data = UDR;
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    PORTA = led_7[data];
}
/******************发送字符函数************************/
void USART_Transmit(unsigned char data)
{
   while (!(UCSRA & DATA_REGISTER_EMPTY));   // 等待发送寄存器空                       
   UDR = data;                       // 发送数据    
  // while(!(UCSRA&(BIT(TXC))));
  //UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
   {
       USART_Transmit(*(ptr++));
   }
}
/***********************主函数**********************************/
void main( void )
{
  unsigned char i='a';
   

  PORTA = 0x00;     // LED段码输出
  DDRA = 0xff;
  PORTD = 0x03;     // TXD(PD1)输出
  DDRD = 0x02;     // RXD(PD0)输入,上拉有效

  UCSRA = 0x00;     // USART初始化
  UCSRB = (1<   //UCSRB = 0x98;
  UCSRC = (1<ta, 1 Stop, No Parity
                                //UCSRC = 0x86;
  UBRRH=BAUD_H;                   // 设置波特率
  UBRRL=BAUD_L;
  // SEI();                         //允许全局中断     
  while(1)
   {   
    USART_Transmit(i);
    delay();
    USART_Transmit_str("welcome");
    delay();
    }
}
复制代码
 
 
 
 
/*************************实验目的*****************************
名称:USART测试
目的:按键控制发数据,PC机显示,本实验没用到接收函数
作者: 竹林清风
***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

#define FRAMING_ERROR (1< #define PARITY_ERROR (1< #define DATA_OVERRUN (1< #define DATA_REGISTER_EMPTY (1< unsigned char flag=0,fdata;
unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
unsigned char time_10ms_ok,time_1s_ok,time_1,key_stime1_counter=0;
int time_counter=0;

/*******************按键函数************************/
/******************按键函数***********************************************/
#define key_input    PIND            // 按键输入口
#define key_mask    0b000000100    // 按键输入屏蔽码
#define key_no        0
#define key_k1        1
#define key_state_0    0
#define key_state_1    1
#define key_state_2 2
unsigned char read_key(void) 

  static unsigned char key_state = 0,key_old; 
  unsigned char key_press, key_return=key_no;

  key_press = key_input & key_mask;     // 读按键I/O电平 
  switch (key_state) 
  { 
    case key_state_0:             // 按键初始态 
        if (key_press != key_mask) 
        { 
          key_old = key_press;     // 记录原电平             
          key_state = key_state_1;   // 键被按下,状态转换到键确认态   
        }           
        break;   
    case key_state_1:             // 按键确认态 
        if (key_press == key_old)     // 与原电平比较(消抖处理) 
        { 
          if (key_press == 0b00000000) 
               {
               key_state = key_state_2; // 状态转换到键释放态 
              key_return = key_k1;
              
               }
        } 
        else 
          key_state = key_state_0;     // 按键已抬起,转换到按键初始态 
        break; 
       case key_state_2:
          if (key_press == key_mask) key_state = key_state_0; 
          break;
  } 
  return key_return;

/******************比较定时器0比较向量入口地址***************/
#pragma interrupt_handler TIMER0_COMP:20
void TIMER0_COMP(void)


if(++key_stime1_counter>=5)
  {
  time_10ms_ok=1;
   PORTD.6=~PORTD.6
   if(++time_counter>=1000)
   {
    time_1s_ok=1;
   }
   
  }
}
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<20;i++)
  for(j=0;j<500;j++);
}
/*******************接收函数************************
****接收到电脑发送的数据****************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
  unsigned char status,data;
  status = UCSRA;
  data = UDR;
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      PORTA = led_7[data];
}
/******************发送字符函数************************/
void USART_Transmit(unsigned char data)
{
   while (!(UCSRA & DATA_REGISTER_EMPTY));   // 等待发送寄存器空                       
   UDR = data;                       // 发送数据    
  // while(!(UCSRA&(BIT(TXC))));
  //UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
   {
       USART_Transmit(*(ptr++));
   }
}
/***********************主函数**********************************/
void main( void )
{   
  unsigned char temp,i,count=0;
  PORTA = 0x00;     // LED段码输出
  DDRA = 0xff;
  PORTD = 0x03;     // TXD(PD1)输出
  DDRD = 0x02;     // RXD(PD0)输入,上拉有效

  UCSRA = 0x00;     // USART初始化
  UCSRB = (1<   //UCSRB = 0x98;
  UCSRC = (1<ta, 1 Stop, No Parity
                                //UCSRC = 0x86;
  UBRRH=BAUD_H;                   // 设置波特率
  UBRRL=BAUD_L;
   TCCR0=0x0B;                 // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
   TCNT0=0x00;
   OCR0=0x7C;               // OCR0 = 0x7C(124),(124+1)/62.5=2ms
   TIMSK=0x02;                 // 允许T/C0比较匹配中断
  SEI();             //允许全局中断     
  while(1)
   { 
    if(time_10ms_ok)
    {
      time_10ms_ok=0;
       temp=read_key();
       if(temp!=key_no)
        {
        if(temp=key_k1)
          {
          
          USART_Transmit(i); 
        if (++i >= 10) i = 0;
        delay();
          }
        }
    
    }
}
}
/*************************实验目的*****************************
名称:USART测试
目的:从PC机上发送字符到实验板上,LED数码管显示相应的值
作者:竹林清风
***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

#define FRAMING_ERROR (1< #define PARITY_ERROR (1< #define DATA_OVERRUN (1< #define DATA_REGISTER_EMPTY (1< unsigned char flag=0,fdata;
unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<20;i++)
  for(j=0;j<500;j++);
}
/*******************接收函数************************
****接收到电脑发送的数据****************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
  unsigned char status;
  status = UCSRA;
  fdata = UDR;
  //if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    flag=1;
}
/******************发送字符函数************************/
void USART_Transmit(unsigned char data)
{
   while (!(UCSRA & DATA_REGISTER_EMPTY));   // 等待发送寄存器空                       
   UDR = data;                       // 发送数据    
  // while(!(UCSRA&(BIT(TXC))));
  //UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
   {
       USART_Transmit(*(ptr++));
   }
}
/***********************主函数**********************************/
void main( void )
{

   

  PORTA = 0x00;     // LED段码输出
  DDRA = 0xff;
  PORTD = 0x03;     // TXD(PD1)输出
  DDRD = 0x02;     // RXD(PD0)输入,上拉有效

  UCSRA = 0x00;     // USART初始化
  UCSRB = (1<   //UCSRB = 0x98;
  UCSRC = (1<ta, 1 Stop, No Parity
                                //UCSRC = 0x86;
  UBRRH=BAUD_H;                   // 设置波特率
  UBRRL=BAUD_L;
  SEI();                         //允许全局中断     
  while(1)
   { 
    if(flag)
    { 
    PORTA=led_7[fdata];//把单片机接收到的数据在数码管上显示
    
    flag=0;
    }
    
    }
}

关键字:USART  串口通讯 引用地址:发几个关于USART串口通讯的程序

上一篇:AVR单片机 usart串口使用范例
下一篇:avr利用pwm控制led光暗及峰鳴器音量大小

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

STM32F4学习笔记7——USART Part2
硬件流控制 使用 nCTS 输入和 nRTS 输出可以控制 2 个器件间的串行数据流。如图显示了在这种模式 下如何连接 2 个器件: 分别向 USART_CR3 寄存器中的 RTSE 位和 CTSE 位写入 1,可以分别使能 RTS 和 CTS 流 控制。 RTS 流控制 如果使能 RTS 流控制 (RTSE=1),只要 USART 接收器准备好接收新数据,便会将 nRTS 变 为有效(连接到低电平)。当接收寄存器已满时,会将 nRTS 变为无效,表明发送过程会在 当前帧结束后停止。下图图显示了在使能 RTS 流控制的情况下进行通信的示例。 CTS 流控制 如果使能 CTS 流控制 (CTSE=1),则发送器会在发送下一
[单片机]
STM32F4学习笔记7——<font color='red'>USART</font> Part2
【STM32Cube_07】使用USART发送和接收数据(中断模式)
1. 准备工作 硬件准备 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; 准备一个串口调试助手,这里我使用的是Serial Port Utility; Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包: 2.生成MDK工程 — 初始化GPIO为输入 选择芯片型号 打开STM32CubeMX,打开MCU选择器: 搜索并选中芯片STM32L431RCT6: 配置时钟源 如果选择使用外部高速时钟(HSE),则需要在
[单片机]
【STM32Cube_07】使用<font color='red'>USART</font>发送和接收数据(中断模式)
PIC16C6XX/7XX的USART配置技巧
解答:要使USART正常工作,需要正确设置九个寄存器。 INTCON,中断控制寄存器(全局和外设中断使能位) PIR1,外设中断标志寄存器(接收和发送中断标志位) RCSTA,接收状态和控制寄存器(串行商品使能,接收器配置,状态和第九个数据位) TXREG,发送寄存器0-7位 RCREG,接收寄存器0-7位 PIE1,外设中断使能寄存器(接收和发送中断使能位) TXSTA,发送状态和控制寄存器(发送器配置,状态和第九个数据位) SPBRG,串行端口波特率发生器寄存器(用于发生发送和接收时钟) trISC,三态C寄存器(第6、7位必须置1) 解答:要使USART正常工作,需要正确设置八个寄存器。 CPUSTA,CPU状态寄存器(全局
[单片机]
LabVIEW VISA与串口通讯的编程实现
VISA是虚拟仪器软件体系结构的缩写(即Virtual Instruments Software Architecture),实质上是一个I/O口软件库及其规范的总称。 VISA是应用于仪器编程的标准I/0应用程序接口,是工业界通用的仪器驱动器标准API(应用程序接口),采用面向对象编程,具有很好的兼容性、扩展性和独立性。用户可用一个API控制包括VXI、GPIB及串口仪器在内的不同种类的仪器。它还支持多平台工作、多接口控制,是一个多类型的函数库。 在LabVIEW中编写的VISA接口程序,当外部设备变更时,只需要更换几个程序模块即可使用,简单方便而且开发效率高。 在LabVIEW 中利用VISA节点进行串行通信编程。为了方便用
[测试测量]
MODBUS协议ASCII模式串口通讯的实现(Arm2410,RS232/485)
资源使用说明: 2410+LINUX、UART(即RS-232串口)全双工通信、RS-485半双工通信 局部程序框图及其设计说明: 调试记录及调试结果: MODBUS总结: MODBUS协议 对比: ASCII模式:用8位表示一个由内容字符转化而来的实际数值,直观; RTU模式 :用4位表示一个由内容字符转化而来的实际数值,效率高。 其它编程注意点总结: 1、分母或乘数为2的n次方的乘除法用移位运算以提高效率,注意移位运算符的优先级比加减运算符低,别忘了加括号先算移位的; 2、short两个字节,long四个字节,int则与机器字长相关。
[单片机]
MODBUS协议ASCII模式<font color='red'>串口通讯</font>的实现(Arm2410,RS232/485)
STM32 USART3可以接收无法发送问题(Tx一直为高电平)
首先这个问题耗费了我比较多的时间来进行调试,比较郁闷; 1. 同时使用相同的函数进行了USART2和USART3的初始化配置, USART2工作正常, 中断服务程序的结构也是相同的, 收发都是正常的,没有发问题; 2. 使用USART3调试LCD时, 发现无法进行通信, 表现是Rx可以正常进行接收, Tx发送数据时一直为高电平, 使用示波器捕获不到任何波形; 3. 关于USART3的寄存器, GPIO的寄存器, USART3/GPIO/AFIO等时钟已经进行了配置, NVIC也进行了配置; 查看与USART2的差异,发现完全相同,没有差别, 但是无法发送. 4. 单独写了一个文件进行串口测试, 查询发送OK!
[单片机]
51单片机串口通讯设计及输入输出介绍
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。   测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。 //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include reg51.h #include string.h #define INBUF_LEN 4 //数据长度 unsigned
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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