原创 第三十七课 串口通讯之查询法

2009-6-8 22:13 5154 9 16 分类: MCU/ 嵌入式

第三十七课 串口通讯之查询法


在学习本节之前,希望大家对前一节的知识有所了解


程序讲解:


/*---------------------------------------------------------------*/
//串口通讯
//按下按钮,单片机发送数据"Hello! I am glad to see you again.\r"给主机
//单片机晶振:11.0592MHz
//波特率:   9600bps


/*---------------------------------------------------------------*/
#include<reg52.h>
#include<intrins.h>



/*---------------------------------------------------------------*/
sbit K1 = P3^3;  //对应开发板硬件



/*---------------------------------------------------------------*/
unsigned char tmp;   //单片机向电脑发送的数据
unsigned char code str[]={"Hello! I am glad to see you again.\r\n"};



/*---------------------------------------------------------------*/
void send_str(void); //发送字符串
void send_char(unsigned char txd);  //发送字符
void delayms(void);



/*---------------------------------------------------------------*/
void main(void)
{
 TMOD = 0x20;   //定时器1工作在方式2(8位,自动装载)用作波特率发生
 TH1  = 0xfD;        //9600bps
 TL1  = 0xfD; 


 SCON = 0x50;  //串口工作方式为1 允许接受  
 PCON = 0x00;  // SMOD="0"  波特率不变(为1时,波特率变为两倍)


 TR1 = 1;           //允许定时器1工作
 IE  = 0x00;        //禁止所有中断


 while(1)
 {
  if(K1==0){delayms();if(K1==0){send_str();while(K1==0);}}


  if(RI)                    //判断是串口否接收到数据
  {
   RI = 0;                //清除中断标志
   tmp = SBUF;      //保存串行口数据缓冲器的数据
   P1 = ~(tmp-48);  //送到P1显示
   send_char(tmp);  //将从电脑上传过来的数据回传到电脑上显示
  }
 }
}



/*---------------------------------------------------------------*/
//传送一个字符
void send_char(unsigned char txd)
{
 SBUF = txd;        //送到数据缓冲区
 while(!TI);            //等待上一数据发送完成
 TI = 0;                 //软件清除中断标志
}



/*---------------------------------------------------------------*/
//传送字符
void send_str(void)
{
 unsigned char i="0";
 while(str!='\0')   //判断字符串是否发送完成
 {
  send_char(str); //发送字符
  i++;                     //指向下一个字符
 }
}



/*---------------------------------------------------------------*/
//延时10000+0us 函数定义
void delayms(void)
{
  unsigned char i,j,k;
  for(i=5;i>0;i--)
  for(j=4;j>0;j--)
  for(k=248;k>0;k--);
}


本节重点:


1、串口通讯的初始化(SCON、PCON寄存器的设置)


2、发送接收数据缓冲区的理解(共用一个地址0x99),及串口串行发送数据的认识!


51波特率初值设定工具:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/8/35b13522-4464-4644-86a4-5a5cf915762e.rar


串口通讯基础知识讲解:http://group.ednchina.com/2031/25592.aspx


 

文章评论7条评论)

登录后参与讨论

用户377235 2012-4-27 17:17

楼主是好人

用户222124 2009-6-9 15:21

呵呵,为了便于初学者理解,这个传送字符函数比较简单,只是固定的传送了str[]={"Hello! I am glad to see you again.\r\n"}里面的字符,调用一次send_str(void),就是把str[]里面的字符发送了一遍,因此不需要用到形参,(其实照着第三十八课,把这里的传送函数改成一样(指针为参数)也是可以的!) 谢谢指出!

用户148846 2009-6-9 10:55

查询法传送字符串函数void send_str(void)形参不应为空,因为一个项目程序中欲发送字符串大多不止一个,例如: char code tab[]={"Come On!\r\n"}; char code str[]={"Hello! I am glad to see you again.\r\n"}; char code str1[]={"Welcome to ...\n"}; char code *str2="You are ...\n"; 第三十八课中,中断法传送字符串函数void Uart_SendString(unsigned char *dat),以指针为参数,正解。 //传送字符串——查询法 void send_str(void) { unsigned char i="0"; while(str[i]!='\0') //判断字符串是否发送完成 { send_char(str[i]); //发送字符 i++; //指向下一个字符 } } //串口发送一个字符串——中断法 void Uart_SendString(unsigned char *dat) { while(*dat!='\0') { Uart_SendChar(*dat); //发送当前数据 dat++; //指向下一个要发送的数据 } }

用户148846 2009-6-9 10:38

查询法传送字符串函数void send_str(void)形参不应为空,因为一个项目程序中与发送字符串大多不止一个,例如: char code tab[]={"Come On!\r\n"}; char code str[]={"Hello! I am glad to see you again.\r\n"}; char code str1[]={"Welcome to ...\n"}; char code *str2="You are ...\n"; 第十八课中 中断法传送字符串函数void Uart_SendString(unsigned char *dat),以指针为参数,正解。 //传送字符串——查询法 void send_str(void) { unsigned char i="0"; while(str[i]!='\0') //判断字符串是否发送完成 { send_char(str[i]); //发送字符 i++; //指向下一个字符 } } //串口发送一个字符串——中断法 void Uart_SendString(unsigned char *dat) { while(*dat!='\0') { Uart_SendChar(*dat); //发送当前数据 dat++; //指向下一个要发送的数据 } }

用户222124 2009-6-8 22:13

呵呵,已经改过来了,谢谢提醒! PCON = 0x00; // SMOD=0波特率不变"(为1时,波特率变为两倍)

用户1663879 2009-6-8 21:41

刚调试过了,挺好!谢谢楼主!

用户1663879 2009-6-8 21:07

不错!但主程序第五行的注释有点问题!
相关推荐阅读
用户222124 2010-12-08 22:18
台达PLC监控
台达PLC监控网上有很多例子,自己也照着弄了个,挺方便的,分享下串口数据格式:COM1,9600,8,N,1  ...
用户222124 2010-06-27 16:36
基于NIOS II和FPGA无线小车控制系统的设计
   主控制台以Cyclone II系列的EP2C8Q208C8为核心,通过nRF24L01进行无线通讯,来控制以ATmega8为微处理器的两轮小车,可以实现小车按控制平台发送的控制信息来准确运动。所...
用户222124 2009-11-13 15:58
51开发板已经销售完了,谢谢大家的支持!
51开发板已经销售完了,谢谢大家的支持!...
用户222124 2009-09-28 16:13
51开发板十一大放送!!!赶快行动吧!!!
  51开发板十一大放送!  赶快行动吧!!!   开发板硬件介绍: http://group.ednchina.com/2031/24972.aspx  开发板实物图片总汇: http://grou...
用户222124 2009-09-13 19:02
nios II 实验五 数码管显示数字钟(定时器实现 外部中断调节)
#include "system.h"                      //包含基本的硬件描述信息#include "altera_avalon_timer_regs.h"    //定义内...
用户222124 2009-09-13 18:57
nios II 实验四 PIO外部中断
#include "system.h"                      //包含基本的硬件描述信息#include "altera_avalon_timer_regs.h"    //定义内...
EE直播间
更多
我要评论
7
9
关闭 站长推荐上一条 /3 下一条