导航:首页 > 操作系统 > 51单片机模拟串口

51单片机模拟串口

发布时间:2022-09-20 00:01:24

① 传感器的A0和D0接51单片机哪个串口

A0指的是模拟信号输出口,而D0表示数字信号输出口。那么,我们可以看到Arino板上的A0~A5是用来对接模拟信号引脚的。所以火焰传感器的A0引脚接板上的A0~A5中的任意一个引脚都可以。
A0模拟输出,D0是数字输出;计AO根据收到的信号,输出0~1023模拟信号,DO根据设定的阀值输出0或1。
传感器是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。

② 如何实现2个51单片机之间通过串口通信的源程序

汇编编写的模拟串口通信程序

T2作为波特率控制
UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调
用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。
UART_TXD是任何其它IO即可。

UART_SEND:
PUSH IE
PUSH DPH
PUSH DPL
PUSH PSW
PUSH 00H
PUSH ACC
CLR EA
SETB UART_TXD ;START BIT

MOV R0,A
CLR TR2 ;TR2置1,计数器2启动,时间计数启动。
MOV A,RCAP2L;计数器2重新装载值
MOV TL2,A ;置计数器2初值 ;T2需要重新装载
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
MOV A,R0

SETB TR2 ;TR2置1,计数器
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2

CLR UART_TXD ;START BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2

MOV R0,#08H
UART_SEND_LOOP:
RRC A
MOV UART_TXD,C ;8 BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
DJNZ R0,UART_SEND_LOOP

SETB UART_TXD ;END BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2

POP ACC
POP 00H
POP PSW
POP DPL
POP DPH
POP IE
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UART_REC:
PUSH IE
PUSH DPH
PUSH DPL
CLR EA

CLR TR2 ;TR2置1,计数器2启动,时间计数启动。
MOV A,RCAP2L;计数器2重新装载值
MOV TL2,A ;置计数器2初值 ;T2需要重新装载
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A

JB UART_RXD,$ ;REC
SETB TR2 ;TR2置1,计数器2启动,时间计数启动。
JNB TF2,$
CLR TF2 ;0.5 BIT

JNB TF2,$
CLR TF2 ;1 BIT

JNB TF2,$
CLR TF2 ;1.5 BIT
MOV C,UART_RXD
MOV ACC.0,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;2.5
MOV C,UART_RXD
MOV ACC.1,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;3.5
MOV C,UART_RXD
MOV ACC.2,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;4.5
MOV C,UART_RXD
MOV ACC.3,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;5.5
MOV C,UART_RXD
MOV ACC.4,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;6.5
MOV C,UART_RXD
MOV ACC.5,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;7.5
MOV C,UART_RXD
MOV ACC.6,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;8.5
MOV C,UART_RXD
MOV ACC.7,C

JNB TF2,$
CLR TF2 ;9.5
JNB UART_RXD,$ ;等待停止位,并重新复位计数器
SETB UART_RXD

POP DPL
POP DPH
POP IE
RET
补充回答:
串口调试

1. 发送:向总线上发命令
2. 接收:从总线接收命令,并分析是地址还是数据。
3. 定时发送:从内存中取数并向主机发送.

经过调试,以上功能基本实现,可以通过上位机对单片机进行实时控制。

程序如下:

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,发送没有必要用中断,因为程序的开销是一样的

#include <reg51.h>
#include<stdio.h>
#include <string.h>

#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];

unsigned char checksum,count3 , flag,temp,ch;

bit read_flag=0;
sbit cp=P1^1;
sbit DIR=P1^2;

int i;

unsigned int xdata *RAMDATA; /*定义RAM地址指针*/
unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;

void init_serialcomm(void)
{
SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收
PCON=0x00;
ES=1;
TMOD=0x21; //定时器工作于方式2,自动装载方式
TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
TL1=0xfd;
TH1=0xfd;
ET0=1;
TR0=1;
TR1=1;
// TI=0;
EA=1;
// TI=1;
RAMDATA=0x1F45;
}

void serial () interrupt 4 using 3
{
if(RI)
{ RI=0;
ch=SBUF;
TI=1; //置SBUF空
switch(ch)
{
case 0x01 :printf("A"); TI=0;break;
case 0x02 :printf("B"); TI=0;break;
case 0x03 :printf("C"); TI=0;break;
case 0x04 :printf("D"); TI=0;break;
default :printf("fg"); TI=0;break;
}
}
}

//向串口发送一个字符
void timer0() interrupt 1 using 3{
// char i;
flag++;
TH0=0x00;
TL0=0x00;
if(flag==10)
{// cp=!cp;
// for(i=0;i<6;i++)
P2=0x25;
TI=1;
temp=*RAMDATA;
printf("%c",temp);
TI=0;
// RAMDATA--;
flag=0;
}
}

//主程序
main()
{
init_serialcomm(); //初始化串口
//向6264中送数据
{
*RAMDATA=0x33;
}
while(1)

{
*RAMDATA=0x33;;
}
}

调试需要注意的问题:

1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“abcd”);函数直接发送即可。
2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率,

③ 我这个程序是51单片机IO口模拟串口通信的

你不用中断服务程序来置标志,当溢出是TF0自动置1,你只需清0就OK了。
你的问题肯定是波特率不一致造成的,一是你两个设备的波特率是否一致,你查探一下,另一个是因为你用中断服务程序处理标志,会影响波特率的,给其造成误差。

④ 单片机模拟串口通信有什么利弊

串口通信,或者 IIC 通信,应该是由专门的硬件,来完成的。

CPU 对这些硬件,设置一下,再传送一下数据,就可以等待结果了。

有些单片机,太简陋,没有相应的硬件,只能用软件编程,模拟硬件,来实现。

执行这些程序,当然,必须占用 CPU 的时间。这就是《占用大量的cpu资源》。

有时,还要使用定时器、中断源,这也是《占用大量的资源》。

⑤ 51单片机模拟通讯通讯的启动串口接收函数,TL0 = 256 - ((256-TH0)>>1)这句话怎么分析

首先你要明白溢出率怎么算,溢出率等于每溢出一次时间的导数,也就是定时时间的导数。256-TH0算出来的是定时时间,右移以为相当于除2。然后再用256减去,付给TL0

⑥ 51 单片机模拟串口的问题 目前发送数据没有问题,接收数据时只能接收前两位,如发送010203 只能接收到01

我前几天也做模拟串口程序,也遇到了与你类似的问题,不过现在解决了。
数据格式由一个起始位,八个数据位,一个或两个结束位组成。在数据发送是结束位是不能省。
但在数据接收时,程序中就没有必要等待结束位了,因为在等待结束位的过程中,把下一个数据的起始中断也等待过去了。
把函数uchar RByte()中的最后一个WaitTF0();删除,程序就能连续接收数据了。
下面是我的程序,你看一下就明白了。
/*
模拟串口收发程序
改程序发送口采用任一IO口,接收口采用外部中断0口,实现了9600bit/s的串口通信
信号产生与接收采用定时器定时溢出标志来进行控制
注意问题:
1、中断的中断标志要保证状态正确
2、定时器定时要精确
*/

#include<reg52.h>
sbit txd=P3^1;
sbit rxd=P3^2;
sbit en=P1^7;
sbit clk=P3^7;

#define uchar unsigned char

uchar number,flag;
uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

void wait(uchar i);
void send(uchar aa);

void main()
{
uchar i;
IE=0;EA=1;
TMOD=0x12;
TR0=0;EX0=1;
IT0=1;en=0;
while(1)
{
if(num[0]==0x49&&num[1]==0x85&&num[2]==0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]==0x91&&num[7]==0x25&&num[8]==0x34&&num[9]==0x62)
{
en=1;
number=0;
for(i=0;i<10;i++)
{send(num[i]);num[i]=0x00;}
en=0;
}
}
}

void send(uchar aa)
{
uchar i;
txd=0;
wait(0xb9);
for(i=0;i<8;i++)
{txd=aa&0x01;aa>>=1;wait(0xb9);}
txd=1;
wait(0xb9);
flag=0;
}

void int0() interrupt 0
{
uchar i;
EX0=0;clk=!clk;
wait(0xad);
for(i=0;i<7;i++)
{
number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xb9);
}

number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xd9);

num[flag]=number;
flag++;clk=!clk;
IE0=0;EX0=1;
if(flag>=10)flag=0;
}

void wait(uchar i)
{
TF0=0;
TH0=i;TL0=i;
TR0=1;
while(TF0==0);
TF0=0;TR0=0;
}

⑦ 51单片机要接电脑的usb口模拟串口,需不需要接其他的芯片

需要电压转换芯片 即驱动芯片。
单片机一般是3.3V或者5V的,电脑的串口在主板上有一个电源转换芯片,将低压升级到RS232标准电压,+-12V,因此,单片机和电脑转口连接,也需要一个电压转换芯片。
这种那个芯片很多,如MAX232等,可以实现2路串口电压转换。

⑧ 51单片机通过串口实现数据的发送与接收程序

串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。
一般来说,过程如下:
1,配置串口参数、波特率等,开启串口中断;
void Init_UART()
{

}
2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;
程序一般为:
void UART_ISR() interrupt x using y
{
;串口中断处理函数
}
x - 单片机的C51中断号
y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)

3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//数据发送函数
}
}

⑨ 51单片机多串口同时通信

51单片机是通过sbuf这个串口专用寄存器和串口模块来收发数据的。发送时,只要将数据送入到sbuf,等等ti状态到1就发送完毕。同样接收时,ri为1,那么说明sbuf接收完毕一帧数据,可以直接从sbuf读取数据了。

⑩ 51单片机在笔记本电脑里找不到串口而且查上电脑没有显示

单片机开发板,一般需要购买一个USB转串口的配件,这个配件会提供windows系统的驱动程序光盘,需要安装驱动程序才可以识别。
如果是很旧的配件,有可能没有支持windows10的驱动程序。这种情况,除了购买新的USB串口,或者使用旧的win7或XP操作系统。

阅读全文

与51单片机模拟串口相关的资料

热点内容
手机文件图片怎么解压 浏览:655
分布式系统设计pdf 浏览:181
中轴线趋势指标源码 浏览:721
labview源码代码 浏览:61
15匹谷轮压缩机图片 浏览:818
bsp分割算法 浏览:22
高手选股公式源码 浏览:682
脆皮软心球解压视频十分钟 浏览:404
如何关闭苹果app同步充值 浏览:766
视频压缩发送微信 浏览:856
程序员段子大全图片 浏览:760
javaudp心跳 浏览:429
阿里卖家app如何分配询盘 浏览:828
如何拔打中国移动人工服务器 浏览:505
传奇归来为什么连不上服务器 浏览:555
压缩机润滑油在哪个位置工作 浏览:141
张翰解压减几 浏览:775
你好法语1教师用书pdf 浏览:486
手机解压缩后文件在哪 浏览:472
linux内核框架 浏览:720