找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1906|回复: 11
打印 上一主题 下一主题
收起左侧

使用单片机串口控制LED亮灭

[复制链接]
跳转到指定楼层
楼主
ID:695930 发表于 2020-2-21 07:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 你速度发生的 于 2020-2-21 08:49 编辑

请问各位大神我的程序哪里有错误呢??
我这个程序为啥发送控制led亮0x01控制led灭0x00都没有反应呢?


#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;
u8 i;
sbit led=P0^0;
/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能     :设置串口
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50;   //设置为工作方式1
TMOD=0X20;   //设置计数器工作方式2
PCON=0X80;   //波特率加倍
TH1=0XF9;    //计数器初始值设置,注意波特率是9600的
TL1=0XF9;
ES=1;      //打开接收中断
EA=1;      //打开总中断
TR1=1;     //打开计数器
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能   : 主函数
* 输    入       : 无
* 输    出      : 无
*******************************************************************************/
void main()
{
led=0;
UsartInit(); // 串口初始化  
  while(1);
}
/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能    : 串口通信中断函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void Usart() interrupt 4
{
u8 receiveData;
   i=SBUF;
    switch(i)
   {
    case 0x01 :led=0;break;
    case 0x00 :led=1;break;
    default : ;
   }
   receiveData=SBUF;
   RI=0;
   SBUF=receiveData;
while(!TI);    //等待发送数据完成
TI=0;       //清除发送完成标志位
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:612392 发表于 2020-2-21 10:31 | 只看该作者
1.串口收发正常吗?
2.上位机发送命令是否是16进制?
回复

使用道具 举报

板凳
ID:695930 发表于 2020-2-21 12:09 | 只看该作者
cjjdemon 发表于 2020-2-21 10:31
1.串口收发正常吗?
2.上位机发送命令是否是16进制?

串口收发正常,上位机发送命令是16进制
回复

使用道具 举报

地板
ID:695930 发表于 2020-2-21 14:19 | 只看该作者
cjjdemon 发表于 2020-2-21 10:31
1.串口收发正常吗?
2.上位机发送命令是否是16进制?

你好,串口收发正常。上位机发送命令是16进制
回复

使用道具 举报

5#
ID:560467 发表于 2020-2-21 15:46 | 只看该作者
考虑一下你接受到的数据有没有问题,波特率是否一致,
回复

使用道具 举报

6#
ID:695930 发表于 2020-2-21 15:54 | 只看该作者
CZ1 发表于 2020-2-21 15:46
考虑一下你接受到的数据有没有问题,波特率是否一致,

你好接受到的数据是指我使用上位机向单片机发送的数据吗?我的波特率是一致的
回复

使用道具 举报

7#
ID:419968 发表于 2020-2-21 19:48 | 只看该作者
stc51 p0.0 初始化成 推挽输出
回复

使用道具 举报

8#
ID:213173 发表于 2020-2-21 21:18 | 只看该作者
楼主串口初始化设置不当,根据晶振频率选择如下设置:
void UartInit()                //9600bps@11.0592MHz
{
        PCON = 0x00;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        TMOD = 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                        //设定定时初值
        TH1 = 0xFD;                        //设定定时器重装值
        TR1 = 1;                                //启动定时器1
        ES=1;                                        //打开接收中断
        EA=1;                                        //打开总中断
}
void UartInit()                //4800bps@12.000MHz
{
        PCON = 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位数据,可变波特率
        TMOD|= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xF3;                        //设定定时初值
        TH1 = 0xF3;                        //设定定时器重装值
        TR1 = 1;                                //启动定时器1
        ES=1;                                        //打开接收中断
        EA=1;                                        //打开总中断
}
回复

使用道具 举报

9#
ID:470755 发表于 2020-2-21 23:44 | 只看该作者
把你要调用的函数在主函数前面声明一下,或者是写在主函数前面
回复

使用道具 举报

10#
ID:695930 发表于 2020-2-22 16:37 | 只看该作者
wulin 发表于 2020-2-21 21:18
楼主串口初始化设置不当,根据晶振频率选择如下设置:
void UartInit()                //9600bps@11.0592MHz
{

你好我试了一下发现也还是不行。。
回复

使用道具 举报

11#
ID:696761 发表于 2020-2-22 23:36 来自手机 | 只看该作者
首先确认下数据有没有发出,串口是否正常传输数据,这个没问题就试下给数据灯会不会亮
回复

使用道具 举报

12#
ID:695930 发表于 2020-4-3 21:52 | 只看该作者
我这个整体来说没问题,我之前自己发现问题主要是晶振不稳定,建议大家使用11.0592MHz,wulin那有两种晶振的串口设置具体的大家自己弄吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表