
再试试:
#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灯泡的开关怎么接线 电脑程序需要实现什么功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)