MCR12怎么与单片机之间进行串口通信

\u5355\u7247\u673a\u4e0e\u5355\u7247\u673a\u4e4b\u95f4\u5982\u4f55\u8fdb\u884c\u4e32\u884c\u901a\u4fe1

1\u3001\u5c06\u4e24\u4e2a\u5355\u7247\u673a\u7684RXD\u4e0eTXD\u76f8\u8fde\x0d\x0a2\u3001\u6839\u636e\u9700\u8981\u4f20\u8f93\u7684\u6570\u636e\u7f16\u5199\u4f20\u8f93\u534f\u8bae\x0d\x0a3\u3001\u7f16\u5199\u4e32\u884c\u901a\u4fe1\u7a0b\u5e8f\uff0c\u5c06\u81ea\u5df1\u9700\u8981\u53d1\u9001\u7684\u6570\u636e\u6309\u7167\u534f\u8bae\u8fdb\u884c\u53d1\u9001\x0d\x0a4\u3001\u7f16\u5199\u63a5\u6536\u7a0b\u5e8f\uff0c\u6309\u7167\u534f\u8bae\u8fdb\u884c\u63a5\u6536\x0d\x0a5\u3001\u5c06\u4e24\u4e2a\u7a0b\u5e8f\u5206\u522b\u5199\u5165\u4e24\u4e2a\u5355\u7247\u673a\uff0c\u8fd0\u884c\u3002

\u4e24\u4e2a\u5355\u7247\u673a\u4e4b\u95f4\u4e32\u53e3\u901a\u4fe1\uff0c\u5982\u679c\u662f\u7528proteus\u4eff\u771f\uff0c\u6700\u7b80\u5355\u4e86\uff0c\u4e24\u4e2a\u5355\u7247\u673a\u7684RXD\uff0cTXD\u4ea4\u53c9\u8fde\u63a5\u5c31\u884c\u4e86\u3002\u8981\u662f\u5b9e\u7269\u6700\u597d\u7528RS232\u8fde\u63a5\u901a\u4fe1\uff0c\u8ddd\u79bb\u53ef\u4ee5\u8fbe\u5230\u51e0\u5341\u7c73\u3002\u518d\u8fdc\u70b9\u8ddd\u79bb\uff0c\u7528RS485\u8fde\u63a5\u901a\u4fe1\u3002\u603b\u4e4b\uff0c\u65b9\u6cd5\u5f88\u591a\u7684\uff0c\u4e5f\u5f88\u7075\u6d3b\u7684\u3002

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

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的时间,提高效率,

  • MCR12鎬庝箞涓庡崟鐗囨満涔嬮棿杩涜涓插彛閫氫俊
    绛旓細姹囩紪缂栧啓鐨勬ā鎷熶覆鍙i氫俊绋嬪簭 T2浣滀负娉㈢壒鐜囨帶鍒 UART_RXD 鏄‖涓柇0鎴1鍙o紝濡傛灉鑳借繘鍏ヤ腑鏂紝璇存槑璇ョ嚎鏈変竴涓捣濮嬩綅浜х敓锛岃繘鍏ヤ腑鏂悗璋 鐢ㄤ笅闈㈢殑鎺ユ敹绋嬪簭銆傞鍑虹‖涓柇涔嬪墠杩橀渶瑕佸皢纭腑鏂爣蹇楅噸鏂板浣嶃俇ART_TXD銆鏄换浣曞叾瀹僆O鍗冲彲銆俇ART_SEND:PUSH IE PUSH DPH PUSH DPL PUSH PSW PUSH 00H PUSH ACC CL...
  • C璇█缂栧啓涓插彛閫氫俊绋嬪簭鍦ㄨ8鏈轰笅杩愯
    绛旓細鐜颁唬鐨鍗曠墖鏈鏅亶鍏峰閫氫俊鎺ュ彛,鍙互寰堟柟渚垮湴涓庤绠楁満杩涜鏁版嵁閫氫俊,涓哄湪璁$畻鏈虹綉缁滃拰閫氫俊璁惧闂寸殑搴旂敤鎻愪緵浜嗘瀬濂界殑鐗╄川鏉′欢,鐜板湪鐨勯氫俊璁惧鍩烘湰涓婇兘瀹炵幇浜嗗崟鐗囨満鏅鸿兘鎺у埗,浠庢墜鏈,鐢佃瘽鏈恒佸皬鍨嬬▼鎺т氦鎹㈡満銆佹ゼ瀹囪嚜鍔ㄩ氫俊鍛煎彨绯荤粺銆佸垪杞︽棤绾块氫俊銆佸啀鍒版棩甯稿伐浣滀腑闅忓鍙鐨勭Щ鍔ㄧ數璇,闆嗙兢绉诲姩閫氫俊,鏃犵嚎鐢靛璁叉満绛夈 5.鍗曠墖鏈哄湪鍖...
  • stm32鍜51鍗曠墖鏈鍙互鍏敤涓涓猭eil杩涜缂栧悧
    绛旓細鍙互鐨勶紝鐮磋В鏃朵袱涓兘 瑕佺牬瑙o紝鐢 keil4涔熷彲浠ョ紪璇51锛屽惎鍔ㄦ椂鎵句笉鍒拌矾寰勫彲浠ヨ嚜琛屾坊鍔狅紝鍦ㄤ竴涓猅OOLS.INI鏂囦欢閲屾湁濡備笅淇℃伅锛氬彲瑙佹湁涓や釜PATH [UV2]ORGANIZATION="骞崇叅鑲′唤鍗佷竴鐭"NAME="xia ming", "xia"VERSION=V2.0 BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN)EMAIL="11kxmx@163...
  • 鏈夊摢浣嶅彲浠ュ憡璇夋垜HPI鎺ュ彛鐨勫師鐞?
    绛旓細MCBSP鏃堕挓鍜屽抚鍚屾淇″彿閫氳繃CLKR銆丆LKX銆丗XR銆丗SX寮曡剼杩涜鎺у埗,鎺ユ敹鍣ㄥ拰鍙戦佸櫒鍙互鐩镐簰鐙珛鍦伴夋嫨澶栭儴鏃堕挓鍜屽抚鍚屾淇″彿,涔熷彲浠ラ夋嫨鐢卞唴閮ㄩ噰鏍风巼鍙戠敓鍣ㄤ骇鐢熸椂閽熷拰甯у悓姝ヤ俊鍙枫傚抚鍚屾鑴夊啿鏈夋晥琛ㄧず浼犺緭鐨勫紑濮嬨1.1.2 SCI涓茶鎺ュ彛璁捐 璁剧疆VC5402鐨McRSP杈撳嚭鏃堕挓鍜屽抚鍚屾淇″彿鐢卞唴閮ㄩ噰鏍风巼鍙戠敓鍣ㄤ骇鐢,鍐呴儴鏁版嵁鏃堕挓CLKG鍜屽抚鍚...
  • 扩展阅读:plc基础知识指令27个 ... c# 延时 ... #3000宏程序用法 ... mcr100-6参数及管脚 ... 自制emmc编程器软件下载 ... 自制emmc字库编程器 ... 电视机换emmc多少钱 ... 手机一键制作u盘系统 ... 新手玩mc系列03 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网