标题: 请问下大家有关51单片机串口通信控制LED灯亮灭的问题 [打印本页]

作者: 雪过留痕    时间: 2017-6-16 20:54
标题: 请问下大家有关51单片机串口通信控制LED灯亮灭的问题
#include<reg52.h>
#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;
    P1 = SBUF;
}


以上是烧录单片机里的源码,然后我用串口调试助手发送FE到单片机里,二进制是11111110。理论上来说会有一个灯亮的,可是单片机上都没反应是什么鬼啊= =

作者: zl2168    时间: 2017-6-17 08:19
本帖最后由 zl2168 于 2017-6-17 09:54 编辑

实例42  74HC164串入并出控制8/16循环灯
Proteus仿真一下,确认有效。
实例42 74HC164串行输出控制8-16循环灯.rar (53.19 KB, 下载次数: 142)


以上摘自张志良编著《80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。

作者: HC6800-ES-V2.0    时间: 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也不能有控制的效果。
第二:波特率。波特率不对,就会让发送、接收的数据发生偏差,从而不能达到控制效果。
第三:实验用的模拟软件。这个软件好,实验起来,事半功倍,不好,事倍功半。
分享我的例子程序——完整、详细说明。
第一:我用的单个字符控制——数据类型清楚。
第二:波特率:4800,加倍。不知道你的单片机开发板或最小系统晶振是多少,用资料中的那个软件《51波特率初值设定.exe》,查看误差,误差大了就不行。我的程序是针对我的板子的,晶振12M,要误差小,最大波特率只能是4800。若是11.0592M的,波特率可以很大,但不要加倍。
第三:我用的串口通讯模拟软件,是STC下载程序的串口通讯功能,设置有图为证。
我的板子及串口相关资料都在,你可以根据自己的硬件,做出修改。

串口控制LED灯.rar

3.82 MB, 下载次数: 529


作者: 桂木桂马    时间: 2017-6-17 17:35
你这个程序本人看过了没有问题,本人刚刚也用自己的单片机实验了一下,也是可以亮的,所以你不行大概是波特率不对或者软件问题
作者: zl2168    时间: 2017-6-17 20:32
桂木桂马 发表于 2017-6-17 17:35
你这个程序本人看过了没有问题,本人刚刚也用自己的单片机实验了一下,也是可以亮的,所以你不行大概是波特 ...

什么没有问题?真是瞎指导!T1都未开中!程序怎么运行?
我给你介绍你一个正确的可演示观看的参考案例
实例77  双机串行通信方式1
Proteus仿真一下,确认有效。
实例77 双机通信方式1.rar (40.4 KB, 下载次数: 96)

以上摘自张志良编著80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。











作者: dh13228566254    时间: 2017-6-17 20:52
学习了这么久单片机还是不会
作者: naij    时间: 2018-1-25 23:11
HC6800-ES-V2.0 发表于 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也 ...

我用你的程序出现闪灯的情况。就是说输入“12” led就闪一下。。我想让led稳定的亮着。然后给“13”或者别的什么LED在熄灭

作者: naij    时间: 2018-1-25 23:20
HC6800-ES-V2.0 发表于 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也 ...

从新测试了程序!原来你用的unsigned char="12" 来关灯,其他数字一概来开灯!哈哈
还真是有你的

作者: naij    时间: 2018-1-26 00:15
HC6800-ES-V2.0 发表于 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也 ...

不知道是程序的问题还是51的问题。连续发送12也会关灯或者开灯!
作者: street    时间: 2018-1-26 08:35
给上位机发送个数据试试 看看 能接受到什么
作者: Listen丶51    时间: 2018-1-26 17:03
程序没有问题的,固计是你的波特率或者是硬件存在问题,你再查查看
作者: naij    时间: 2018-1-26 18:04
street 发表于 2018-1-26 08:35
给上位机发送个数据试试 看看 能接受到什么

返回的数据就是我发出的”12“
作者: naij    时间: 2018-1-27 12:36
HC6800-ES-V2.0 发表于 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也 ...

#include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LED1=P2^0;

u8 receiveData;
u8 n[]="a";
u8 nn[]="b";
void UsartInit()//串口初始化函数
{
        SCON=0X50;//设置为工作方式1
        TMOD=0X20;//设置计数器工作方式2
        PCON=0X80;//波特率加倍
        TH1=0XF3;//计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;//打开接收中断
        EA=1;//打开总中断
        TR1=1;//打开计数器
}

void main()
{
        UsartInit();//串口初始化
        while(1);
}

void Usart() interrupt 4//中断函数
{
        unsigned char m;
        m=SBUF;
        if(m==n[0])
        {
                LED1=0;                                 //开灯
        }         
        if (m==nn[0])
        {
                LED1=1;                                 //关灯
        }
        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
        SBUF=receiveData;//将接收到的数据放入到发送寄存器
        while(!TI);//等待发送数据完成
        TI=0;//清除发送完成标志位
}
按照程序的逻辑应该是发12开灯,发其他关灯才对。因为我在测试时发现发送11-19(数字12除外)给51都可以亮灯。发送12关灯。我很奇怪。为什么会这样。程序我改成这样了。问题解决了。发a开灯,发b关灯。发其他一概无反应!
作者: naij    时间: 2018-1-27 22:37
naij 发表于 2018-1-27 12:36
#include

typedef unsigned char u8;

又出现了问题
我将改成
u8 n[]="aa";
u8 nn[]="bb";
结果发af、ah、类似与a+任意字母
都会亮灯或关灯!
原来判断语句出现了问题。
if(m==n[0])
        {
                LED1=0;                                 //开灯
        }         
        if (m==nn[0])
        {
                LED1=1;                                 //关灯
        }

m=nn[0]是判断语句只提取了nn数组的第一位!真是晕倒了
作者: yjr000    时间: 2018-3-15 15:19
请问楼主解决问题了么,如果解决了,能否给我看看
作者: yjr000    时间: 2018-3-15 15:21
naij 发表于 2018-1-27 22:37
又出现了问题
我将改成
u8 n[]="aa";

请问最后成功了么,想看看你的程序
作者: yjr000    时间: 2018-3-15 15:31
请问一下51单片机串口通信控制LED灯亮灭。您这个还有程序和仿真图么,我想了解一下,但自己还不会
作者: Mr.Lee    时间: 2018-5-24 23:58
naij 发表于 2018-1-27 12:36
#include

typedef unsigned char u8;

这个程序我烧录后,能够返回数值但是的灯没有反应
作者: e.冰凌    时间: 2019-1-17 14:04
naij 发表于 2018-1-26 00:15
不知道是程序的问题还是51的问题。连续发送12也会关灯或者开灯!

没有啊,只会闪一下
作者: e.冰凌    时间: 2019-1-17 14:05
naij 发表于 2018-1-25 23:20
从新测试了程序!原来你用的unsigned char="12" 来关灯,其他数字一概来开灯!哈哈
还真是有你的

别的数字都没有作用啊
作者: e.冰凌    时间: 2019-1-17 14:12
naij 发表于 2018-1-27 22:37
又出现了问题
我将改成
u8 n[]="aa";

你发送12,它是先执行1,再执行2,所以会闪一下再灭。其余都可以类推。
作者: wpdssl    时间: 2019-1-17 15:19
程序没有问题,可能是单片机故障也有可能的,我的单片机有次就是,后来换一个就可以了
作者: zc123    时间: 2019-1-17 15:45
中断函数需要申明
作者: 一一呀    时间: 2020-5-22 16:56
HC6800-ES-V2.0 发表于 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也 ...

赞赞赞
作者: 杰瑞便    时间: 2020-8-1 10:14
HC6800-ES-V2.0 发表于 2017-6-17 15:57
串口通讯实验,最要紧的有三件事:
第一:串口通讯发送、接收的是什么样的数据类型。类型不匹配,接收到也 ...

谢谢
作者: 小子不识字    时间: 2021-1-26 15:55
naij 发表于 2018-1-27 12:36
#include

typedef unsigned char u8;

1,2才是正确的

作者: cy009    时间: 2021-1-31 20:50
程序没问题,测试成功
作者: xunzhaod    时间: 2021-3-3 14:25
中断配置错了,应该是if(RI)等待接收完成,清零
作者: leiwawa    时间: 2021-12-8 16:37
程序没问题,测试成功




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1