精华内容
下载资源
问答
  • 51单片机双串口程序

    2014-04-11 14:19:33
    51单片机双串口程序,模拟两路单片机串口通讯。
  • TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率 TH1 = 0xFD; // 波特率9600 TL1 = 0xFD;
  • 51单片机双系统串口通讯程序,Proteus仿真
  • 51单片机 串口通讯控制舵机机械臂程序,代码有中文详细注解,通俗易懂。可以看得出作者真的很用心.这也让我们学习单片机基础更加的容易理解。
  • 51单片机的所有串口程序集合,多串口双串口通讯,单串口通讯,
  • 51_PC双单片机串口例子,可供入门的朋友阅读
  • C51单片机串口

    2019-07-28 16:35:04
    1、什么是串口 含义:串行接口 作用:有线通信 分类::RS232 TTL RS485 特点: 1.1 数据一位一位地顺序传送; 1.2 通信线路简单,只要一对(两根)传输线就可以通信,发送占用一条线,接收占用一条线; 1.3 ...

    1、什么是串口

    含义:串行接口

    作用:有线通信

    分类::RS232    TTL    RS485

    特点:

    1.1 数据一位一位地顺序传送;

    1.2 通信线路简单,只要一对(两根)传输线就可以通信,发送占用一条线,接收占用一条线;

    1.3 双向通信:单工、半双工、全双工三种;

    1.4 远距离通信(几米到几千米),但传送速度较慢

     

    2. 串口通信原理:010100101010......

    3. 串口通信协议:

    3.1 数据格式:

     1)数据位 0010 1100(一般8位)

     2)起始位     1---0(有是有,有时无)

     3)停止位   ................|1(一般1位)

     4)奇偶效验位:保证一帧数据中1的个数为奇数或偶数(可防止数据传输错误)

     3.2 波特率=

    sysclk:11059200

    RI:数据接送的过程,一直都是低电平,当数据接收完毕后,被置为高电平。

    TI:数据发送的过程,一直是低电平,当数据发送完毕后,被置为高电平。

    RI也好,TI也好,当被硬件拉高,我们处理完数据,需要清零(RI=0).

     

    SBUF是什么:嘴:发送

                            耳:接收

     

     

     

    4. 串口编程

    展开全文
  • 单片机串口通信 51单片机 每片将收到的数显示并发送出去 C程序编写
  • RTX51双串口收发

    2013-02-19 15:06:16
    51单片机KEIL编程软件自带系统RTX51双串口收发程序
  • 51单片机串口部分

    2019-10-12 15:52:20
    串口的概念 1.什么是串口 含义:串口通信 //串行通信接口或串口通讯接口 作用:有线通信 分类:RS232 TTL RS485 特点: 数据一位一位地按顺序传送 通信线路简单,只要一对(两根)传输线就可以通信 双向...

    串口的概念

    1.什么是串口

    含义:串口通信 //串行通信接口或串口通讯接口
    作用:有线通信
    分类:RS232 TTL RS485
    特点:

    1. 数据一位一位地按顺序传送
    2. 通信线路简单,只要一对(两根)传输线就可以通信
    3. 双向通信
    4. 速度较慢

    2.串口通信原理

    二进制的方式进行传输
    PC拉低电平拉高电平传输给C51
    A = 10进制10
    B 11
    一个16进制数用4个二进制数位表示
    8 4 2 1

    1 0 0 0
    1 0 1 0
    1 0 1 1
    0xAB
    1010 1011
    8+0+2+0 = 10
    8+0+2+1 = 11

    数据8如何从PC传到C51单片机
    0000 1000

    3.串口通信协议

    16进制的A:00001010
    字符的‘A’:65->0x41->01000001

    协议:怎么传这8位

    讲话:

    1. 语言:中文,英文//数据格式
    2. 语速:快/慢//波特率

    数据格式(一帧数据的格式)

    1. 数据位(8位)00001010
    2. 起始位
    3. 停止位
    4. 奇偶校验位

    波特率

    4.串口编程

    芯片手册
    看芯片手册,配置通信协议的参数
    SHIFT脉冲
    原理图

    1. SCON(算出数据位)
    B7 B6 B5 B4 B3 B2 B1 B0
    0 1 x 1 x x 当数据发完(往外)时,TI(硬件)变为1 当数据收完时,RI变为1

    如何配置:
    SCON:01010000

    SCON=0X50//配置串口工作的方式一:8位数据位,1位停止位
    //波特率,定时器1做波特率发生器 TH1 = 0XFD

    TI代表发送结束,被硬件置1
    SBUF数据缓存,发送接受都往该寄存器放数据
    SCON=0X1<<6;SCON = 0X1<<4;

    1. PCON:加倍 帧错误
    2. SBUF:数据缓存
      0XA:00001010

    char SBUF = 8位
    char data;
    if(RI == 1)
    data = SBUF

    5.串口波特率如何计算

    定时器1的工作模式怎么配
    模式1
    PCON:SMOD = 0(复位为0)
    SYSclk(11059200)
    2^SMOD/32 *(SYSclk/12/(256-TH1))=9600

    6.单片机发送数据给电脑

    #include <reg52.h>
    void delay()
    {
    int i;
    for(i=0; i<10000; i++);
    }
    
    void initUart()
    {
    SCON = 0x50;//串口工作方式1:8位数据位,无奇偶校验位,一位停止位
    //波特率9600
    TMOD = 0x20;//定时器1的工作方式
    TH1 = 0xFD;
    TL1 = 0xFD;
    TR1 = 1;
    }
    
       int main()
    {
    		initUart();
    		while(1)
    		{
    		delay();
    		SBUF = 0xA;//往sbuf放数据,硬件就开始发送工作
    		while(TI == 0);//什么事情都不干,如果等于0,代表没法送完毕,等到TI等于1,才退出循环,进入下一次的发送
    		TI = 0;//软件编程让TI==0,当发送完毕后会被硬件拉高。
    		}
    		return 0;
    }
    

    注意波特率是9600的哦!

    将发送的字符封装为一个函数

    #include <reg52.h>
    void delay()
    {
    int i;
    for(i=0; i<10000; i++);
    }
    
    void initUart()
    {
    SCON = 0x50;
    TMOD = 0x20;
    TH1 = 0xFD;
    TL1 = 0xFD;
    TR1 = 1;
    }
    
    
    void sendByte(char c)
    {
    SBUF = c;
    while(TI == 0);
    TI = 0;
    }
       int main()
    {
    		initUart();
    		while(1)
    		{
    		delay();
    		sendByte(0xA);
    		}
    		return 0;
    }
    

    如何发送一串字符

    #include <reg52.h>
    void delay()
    {
    int i;
    for(i=0; i<10000; i++);
    }
    
    void initUart()
    {
    SCON = 0x50;
    TMOD = 0x20;
    TH1 = 0xFD;
    TL1 = 0xFD;
    TR1 = 1;
    }
    
    
    void sendByte(char c)
    {
    SBUF = c;
    while(TI == 0);
    TI = 0;
    }
    
    void sendString(char *str)
    {
    while(*str != '\0')
    {
    sendByte(*str);
    str++;
    }
    }
       int main()
    {
    		initUart();
    		while(1)
    		{
    		delay();
    		sendString("Hello From C51\r\n");
    		}
    		return 0;
    }
    

    7.电脑发送数据控制单片机

    void sendByte(char c)
    {
    SBUF = c;
    while(TI == 0);
    TI = 0;
    }
    
    void sendString(char *str)
    {
    while(*str != '\0')
    {
    sendByte(*str);
    str++;
    }
    }
    int main()
    {
    		int cmd = 0;
    		initUart();
    		while(1)
    		{
    		if(RI == 1)//RI为1,代表收到数据了
    		{
    		RI = 0;//软件制令
    		cmd = SBUF;//读取PC发来的数据并保存在cmd中
    		if(cmd == 1)
    		{
    		sendString("11111 Hello From C51\r\n");
    		}
    		else if(cmd == 2)
    		{
    		sendString("22222 Hello From C51\r\n");
    		}
    		}
    		}
    		return 0;
    }
    
    展开全文
  • 为什么用51单片机调试串口蓝牙模块或者是串口wifi模块很困难呢?因为串口只有一个,串口一旦用于与模块通信之后,就没有办法进行调试信息的打印了,这次分享的程序是基于stm32f103zet6单片机,串口1和串口2的信息...
  • C51单片机通过串口调节PWM波

    千次阅读 多人点赞 2018-07-22 11:04:54
    PWM 是一种常用的电子控制技术 PWM 本意为 脉冲宽度调制,可以简单理解为对占空比的控制。...用到的51单片机资源如下: 1.定时器及定时器中断2.串口串口中断 下面看下程序: PWM.H #ifndef _PWM_...

    PWM 是一种常用的电子控制技术

    PWM 本意为 脉冲宽度调制,可以简单理解为对占空比的控制。下图就是占空比图例,一个周期内高电平时间与周期时间的比值。

    现在的一些MCU自带PWM控制功能,但是51/52单片机还是没有这个功能。可以用程序自己实现。

    用到的51单片机资源如下:

    1.双定时器及定时器中断 2.串口和串口中断 

    下面看下程序:

    PWM.H

    #ifndef _PWM_H
    #define _PWM_H
    #include <reg52.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define uint  unsigned int 
    #define uchar unsigned char
    #define Pwm_period 100      //计数最大值
    sbit PWM_OUT=P1^2;           //PWM波输出口
    void init ();
    void delayms();
    void pwmset(uint NewPwmValue);
    #endif

    PWM.C 

    #include "pwm.h"
    uint PwmH=0,PwmperiodCount=0;
    uint Pwmvalue=0;
    void delayms()
    {
    	uint i,j;
    	for(i=0;i<2000;i++)
    	for(j=0;j<2;j++);
    }
    void init ()
    {
    	TMOD=0X22;  //双定时器都打开工作方式2
    	SCON=0X50;
    	TH1=0XFD;    //9600的波特率
    	TL1=0XFD;
    	TL0=245;	 //1ms定时器
    	TH0=245;
    	ET0=1;
    	TR0=1;
    	TR1=1;
    	EA=1;
    	ES=1;
    	PS=1;       //串口中断有最高优先级
    	PwmH=0;     //高电平的占空比
    	PwmperiodCount=0;  //时间计数
    	
    }
    
    void pwmset(uint NewPwmValue)       //设置占空比 (调节PWM)
    {
    	if((NewPwmValue>=1)&&(NewPwmValue<=99))
    	{
    			PwmH=NewPwmValue;
    	}
    	else     //新设置的占空比没有意义
    	{	
    			PwmH=0x01;   //输出一个脉冲
    	}
    }
    
    
    void pwmproduce() interrupt 1    //定时0的方式二中断
    {
    	PwmperiodCount++;           //时间计数 每1ms加一
    	if(PwmperiodCount<=PwmH)    //计数时间小于规定占空比
    	{
    			PWM_OUT=1;	        //输出高电平
    	}
    	else                      //到达了规定时间
    	{
    			PWM_OUT=0;        //输出低电平
    			if(PwmperiodCount>=Pwm_period)  //计数值到了100
    			{
    					PwmperiodCount=0;     //计数值清零
    			}
    	}
    }
    void chuan() interrupt 4      //串口中断
    {
    	RI=0;   
    	Pwmvalue=SBUF;          //接受串口发来的占空比数据
    	pwmset(Pwmvalue);       //设置新的占空比
    	ES=0;						
    	TI=1;						
    	printf("successful! PWM is %d%\n",Pwmvalue);   //向电脑回馈信息
    	while(!TI);
    	TI=0;
    	ES=1;
    }

    pwmmain.c

    #include "pwm.h"
    static uint Pwmscale=25;  //pwm的初值 25%
    void main  ()
    {
    	init();
    	pwmset(Pwmscale);   //设置初值
    		while(1)
    		{
    			;
    		}
    
    }

    这个程序用到的单片机资源不少,但其实程序很简单。主要就是让单片机的一个引脚输出高低电平,但是高低电平的输出是按时间决定的。例如如果PWM 是40的话,按照这个程序前40ms输出高电平,后60个ms都是低电平。当时间到了100ms的时候又清零重新开始。这里的时间计数使用到了单片机定时器0的方式二,自动重装初值的方式。判断时间到没有都放在了定时器0的中断里面。至于串口要注意的是串口中断必须要比其他的中断优先级都要高。

    电脑发送数据的时候应该用的是HEX发送0-100之间的数字对应十六进制就是(0-64),直接发送十进制数字应该不会被单片机识别(很久之前的程序了有些记不清了)。

    控制PWM的方法有很多,这只是其中的一种而已。由于排版的原因直接复制粘贴程序有可能在编译器里面出错。

    展开全文
  • 这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。  本文所说的模拟串口, 就是利用51的两个...
  • 51单片机GPIO口模拟串口通信

    万次阅读 2011-08-03 11:06:09
    随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用...这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另

            随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。

            本文所说的模拟串口, 就是利用51的两个输入输出引脚P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。

            以11.0592MHz的晶振为例,通过定时计数器0产生中断信号来模拟串口电平,下面附上具体源代码。

    /*
    ************************************************************************************
    Fuction:使用51单片机GPIO口模拟串口通信,通过定时计数器0来产生中断信号
    Software Designer:Jason
    ************************************************************************************
    */
    #include <reg52.h>
    sbit P1_0 = P1^0;
    sbit P1_1 = P1^1;
    #define RXD P1_0
    #define TXD P1_1
    unsigned char flag;
    void init();
    void send_byte(unsigned char);
    unsigned char rec_byte();
    void wait_int();
    //将从PC机串口接收到的数据原封不动回传给PC机
    void main()
    {
    	unsigned char temp;
    	init();
    	while(1)
    	{
    		if(RI == 1)
    		{
    			RI = 0;
    			temp = rec_byte();
    			send_byte(temp);
    			while(!TI);
    			TI = 0;
    		}
    	}
    }
    //端口及中断初始化
    void init()
    {
    	TMOD = 0x02;	//定时器0,方式2
    	TH0 = 0xfd;		//波特率9600
    	TL0 = TH0;
    	TR0 = 0;		//在发送或接收时打开
    	ET0 = 1; 		//允许定时器0中断
    	EA =1;		 	//允许所有中断
    }
    //通过串口发送一个字节数据
    void send_byte(unsigned char dat)
    {
    	unsigned char i=8;
    	TR0 = 1;		//开启T0中断
    	TXD = 0;		//发送起始位0
    	wait_int();
    	while(i--)		//发送8位数据
    	{
    		TXD = (bit)(dat & 0x01);
    		wait_int();
    		dat = dat>>1;
    	}
    	TXD = 1;	//发送停止位1
    	wait_int();
    	TR0 = 0;		//关闭T0中断
    }
    //通过串口接收一个字节数据
    unsigned char rec_byte()
    {
    	unsigned char dat=0;
    	unsigned char i=8;
    	TR0 = 1;		//开启T0中断
    	wait_int();		//等过起始位电平
    	while(i--)		//接收8位数据
    	{
    		dat = dat<<1;
    		if(RXD)
    			dat |= 0x80;
    		wait_int();
    	}
    	wait_int();		//等过停止位电平
    	TR0 = 0;		//关闭T0中断
    	return dat;
    }
    //等待中断到来
    void wait_int()
    {
    	while(!flag);
    	flag = 0;
    }
    //中断服务程序
    void timer0() interrupt 1
    {
    	flag = 1;
    }


     

    展开全文
  • 串口1的功能及操作与传统51单片机串行相同; 特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, 串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器; 而串口2只能使用独立...
  • 该工程实现的是两个89S52之间的串行通信程序,为单向通信,双向通信只需进行稍微的修改即可实现!内附详细仿真图和实验源码!
  • 双单片机串口通信实验 ...1 、打开 Keil 程序,执行菜单命令“ Project ” “New Project ”创建“单片 机串口通信”项目,并选择单片机型号为 AT89C51。 2、执行菜单命令“ File ” “New”创建文件,输入源程序,
  • 随着单片机的使用日益频繁,用其作前置机进行...这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。
  • 两颗51单片机通过串口通信的代码,独有的仲裁机制使得任一颗单片机都能成为主机.
  • STC12C5A60S2单片机-双串口通信

    千次阅读 多人点赞 2016-03-13 20:59:49
    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为...
  • 单片机】STC12C5A60S2双串口通信

    千次阅读 2014-03-23 20:45:50
    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为...
  • 51单片机模拟串口的三种方法【转】

    千次阅读 2008-05-11 00:11:00
    这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。本文所说的模拟串口, 就是利用51的两个输入...
  • #include <STC12C5A60S2.H> typedef unsigned char uchar ; typedef unsigned int uint ;... 定时器 串口模式和51一样 允许独立波特率发生器运行 串口2波特率不加倍 允许使用内部扩展RAM 独立波特率
  • 所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和...STM32串口寄存器:STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个寄存器,包含了TDR和RDR,对它读操作,读取的是RDR寄存器的值,对...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

双串口51单片机