51 单片机串口程序 控制LED灯亮 使用串口调试助手的时候 只能发一次数据,再发送的时候就没反应了

51 单片机串口程序 控制LED灯亮 使用串口调试助手的时候 只能发一次数据,再发送的时候就没反应了,第1张

再试试:

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

void main()

{

PCON = 0;

SCON = 0x50; //串口方式1, 8-n-1, 允许接收

TMOD = 0x20;

TH1 = 0xfd;

TL1 = 0xfd;

TR1 = 1;

ES = 1;

EA = 1;

while(1);

}

void servise() interrupt 4

{

RI = 0;

P2 = SBUF;

}

从根本上来说,如果你使用UART1,就不要同时使用PD3和PD2做GPIO用,如果非要复用的话,也要确保它们不同时生效,但你上面的程序显然不是这样。像你上面这样连接的话,即便修正了你的程序串口能够收到数据,但PD3和PD2的方向和高低也是由UART1控制,而非你所控制;也就是说显示不正确!

其次,要恢复PD3和PD2的GPIO功能是禁用UART1,而不是关闭全局中断!

再次,超级循环体中反复开关全局中断,而你的串口接收又是中断驱动的,当然接收不正常!

要纠正,这样:

1 使用PORTD以外的端口连接LED,或者使用UART1之外的串口收发数据

2 串口接收中断中收到有效数据置位标志

3 超级循环体判断上述标志,如置位则:发送到PORTx,清零标志

4 无需反复开关全局中断

又看了一下,貌似LED在PORTE上面,这样的话和PORTD的IO功能就没什么关系了吧。

删除超级循环体上的全局中断开关代码应该可以运行,但还是建议按前述流程 *** 作,这样利用中断规范些!

你得会上位机控制软件编程 (vb vc delphi bcb 串口)

你得会下位机硬件编程 PLC 单片机 神马的和上位机软件通信 控制 继电器 晶闸管 去驱动 LED节能灯

如果只是一个按键和一个LED,那就简单多了分别把这两个程序下载到两个单片机中程序如下,若满意请记得采纳下,谢谢!//#include//通用89C52头文件sbitKEY=P2^2;//端口定义//发送//voidmain(void)//主函数{ TMOD=0x20; //定时器1和2工作方式2(8位定时/计数) PCON=0x00; //SMOD=0,不加倍 SCON=0x50; //串口工作方式1,允许接收 TH1=0xfd; //定时器1设置初值,波特率9600bit/s, TL1=0xff; TR1=1; //启动定时器T1 EA=1;//打开总中断 ES=1;//打开串口中断 while(1)//主循环 { SBUF=KEY;//发送数据 while(!TI);//等待发送完成 TI=0;//清空发送标志位 }}////#include//通用89C52头文件sbitLED=P2^2;//端口定义charfe;//接收//voidmain(void)//主函数{ TMOD=0x20; //定时器1和2工作方式2(8位定时/计数) PCON=0x00; //SMOD=0,不加倍 SCON=0x50; //串口工作方式1,允许接收 TH1=0xfd; //定时器1设置初值,波特率9600bit/s, TL1=0xff; TR1=1; //启动定时器T1 EA=1;//打开总中断 ES=1;//打开串口中断 fe=1;//初始化变量 while(1)//主循环 { LED=fe;//输出 }}//voidser()interrupt4//串口接收,中断方式{ fe=SBUF;//接收数据 while(!RI);//等待接收完成 RI=0;//清空接收标志位}//

这个问题提了两遍,回答了一个乙机的程序,再讲甲机程序写一下吧

key1 equ p10

key2 equ p11

org 0000h

ljmp main

org 0030h

main:

    mov tmod,#20h

    mov th1,#0fdh

    mov tl1,#0fdh

    setb tr1

    mov socn,#40h

loop:

    mov c,key1

    mov 00h,c

    mov c,key2

    mov 01h,c

    mov a,20h

    anl a,#03h

    jnz loop1

    mov SBUF,'C'

    jnb TI,$

    clr TI

    sjmp loop

loop1:

    dec a

    jnz loop2

    mov SBUF,'B'

    jnb TI$

    clr TI

    sjmp loop

loop2:

    dec a

    jnz loop

    mov SBUF,'A'

    jnb TI,$

    clr TI

    sjmp loop

    end

这里有一个关键问题,用串口助手发送数据时,是发送十六进制数(也是二进制数)?还是字符?看你的程序应该是发送十六进制数。还有,串口助手的波特率是否为9600?

串口初始化程序要写一行,如下,原写法初始有误。

还有,串口接收后,不要返回,删掉SBUF=0X00;这没有什么用,但串口还要发送,又没while语句等待发送结束。

以上就是关于51 单片机串口程序 控制LED灯亮 使用串口调试助手的时候 只能发一次数据,再发送的时候就没反应了全部的内容,包括:51 单片机串口程序 控制LED灯亮 使用串口调试助手的时候 只能发一次数据,再发送的时候就没反应了、ATmega128的串口程序,PE口为LED灯,为什么执行不了程序如下,各位大神急求、用串口控制一个led灯泡的开关怎么接线 电脑程序需要实现什么功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10114896.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存