数码之家

 找回密码
 立即注册
搜索
查看: 4218|回复: 23

[C51] STC15W204S单片机通讯求助

[复制链接]
发表于 2020-11-8 13:51:38 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 312439374 于 2020-11-8 16:23 编辑

实现目的:电脑通过232或485向单片机-STC15W204S发送开机指令:FF11或关机指令:FF00后,单片机的P3^3口输出高低电平

=========================
要是用ESP8266的话就很好实现,但是成本较高..所以想要用STC15W204S来做,但是学了几天感觉串口好难,哪位大神有例程吗?万分感谢
发表于 2020-11-8 15:24:12 | 显示全部楼层
这种求助方式很特别
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 15:50:12 | 显示全部楼层
more 发表于 2020-11-8 15:24
这种求助方式很特别

第一次发求助,也不懂规矩,麻烦指出,我修改,谢谢
回复 支持 反对

使用道具 举报

发表于 2020-11-8 15:59:20 | 显示全部楼层
求助还要支付才可以看?有趣
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 16:18:51 | 显示全部楼层
2545889167 发表于 2020-11-8 15:59
求助还要支付才可以看?有趣

不好意思,我还以为和百度提问一样,是给最佳答案的积分呢
回复 支持 反对

使用道具 举报

发表于 2020-11-8 21:39:55 | 显示全部楼层
啊这 这不是很简单的串口吗 stcisp软件里面甚至可以直接生成串口通讯的功能函数,简单极了
回复 支持 反对

使用道具 举报

发表于 2020-11-8 23:27:01 | 显示全部楼层
从0学起,别一口就想吃个胖子
回复 支持 反对

使用道具 举报

发表于 2020-11-9 12:13:45 来自手机浏览器 | 显示全部楼层
这个不难吧。就一个串口通信就行了。判断接收到的数据。
回复 支持 反对

使用道具 举报

发表于 2020-11-9 17:17:11 | 显示全部楼层
本帖最后由 慕名而来 于 2020-11-9 17:19 编辑

STC单片机用STC_isp软件直接生成代码呀,另外单片机芯片数据手册的例程也很方便移植的。


//======串口设置函数[url=]///2400bps@11.0592MHz[/url]========
void uart_init(void)
{
SCON = 0x50;  //8位数据,可变波特率
AUXR |= 0x01;  //串口1选择定时器2为波特率发生器
AUXR |= 0x04;  //定时器2时钟为Fosc,即1T
T2L = 0x80;  //设定定时初值
T2H = 0xFB;  //设定定时初值
AUXR |= 0x10;  //启动定时器2
}
//=========================================
void uart_ser()interrupt 4
{
RI=0;
if(SBUF==0xFF11)//你的指令
{
////////////你的控制输出
}
}
//=================================
void main()
{
uart_init();
EA=1;
ES=1;

while(1)
{

}
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-9 17:33:04 | 显示全部楼层
慕名而来 发表于 2020-11-9 17:17
STC单片机用STC_isp软件直接生成代码呀,另外单片机芯片数据手册的例程也很方便移植的。

别误导人家,接受字段是两个字符。这中断只是一个字符接受完成就会触发。
需要判定一下,还要用到缓冲区。

打赏

参与人数 1家元 +10 收起 理由
慕名而来 + 10 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 20:59:30 | 显示全部楼层
奶瓶_NP 发表于 2020-11-8 21:39
啊这 这不是很简单的串口吗 stcisp软件里面甚至可以直接生成串口通讯的功能函数,简单极了 ...

例程代码太多了,没找到,后来看了下郭天祥的教程,现在有点感觉了:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 21:00:03 | 显示全部楼层
慕名而来 发表于 2020-11-9 17:17
STC单片机用STC_isp软件直接生成代码呀,另外单片机芯片数据手册的例程也很方便移植的。

太感谢了,我试试哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-9 21:01:24 | 显示全部楼层
flishmen 发表于 2020-11-9 17:33
别误导人家,接受字段是两个字符。这中断只是一个字符接受完成就会触发。
需要判定一下,还要用到缓冲区 ...

好像是要判断的,我根据郭天祥的视频教程,整出来了,但是感觉我随便发个啥过去都能触发.能不能指导下,谢谢哈
回复 支持 反对

使用道具 举报

发表于 2020-11-9 21:25:47 来自手机浏览器 | 显示全部楼层
下载软件里面有例程
回复 支持 反对

使用道具 举报

发表于 2020-11-10 00:49:28 | 显示全部楼层

在STCISP的例程基础上修改的,系统时钟11.0592Mhz,波特率9600。
串口接收只实现了简单的判断,没有做异常处理,比如你发两次00FF或者11FF也是可以动作的。可以在收到第一字节的FF后启动一个定时器,如果等待第二个字节超时则重新等待接收FF。请自己完善。

#include "reg51.h"
#include "intrins.h"

#define FOSC 11059200L          //系统频率
#define BAUD 9600             //串口波特率

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr AUXR  = 0x8e;               //辅助寄存器
sfr T2H   = 0xd6;               //定时器2高8位
sfr T2L   = 0xd7;               //定时器2低8位

sfr P_SW1   = 0xA2;             //外设功能切换寄存器1

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7

sbit P33 = P3^3;

bit busy;
bit nextChar=0;

void SendData(unsigned char dat);
void SendString(char *s);

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
    SCON = 0x50;                //8位可变波特率

    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    ES = 1;                     //使能串口1中断
    EA = 1;

    while(1);
}

/*----------------------------
UART 中断服务程序
-----------------------------*/

void Uart() interrupt 4
{
    if (RI)
    {
        RI = 0;                         //清除RI位
        if (nextChar) {                 //判断是否准备接收第二个字节
            if (0x11 == SBUF) {         //如果第二个字节是0x11,则P3.3输出1
                P33 = 1;
            } else if (0x00 == SBUF) {  //如果第二个字节是0x00,则P3.3输出0
                P33 = 0;
            }
            nextChar = 0;               //清除第二个字节接收状态指示
        } else if (0xFF == SBUF) {      //如果第一个字节是0xFF,则准备接收第二个字节
            nextChar = 1;
        }
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}





回复 支持 反对

使用道具 举报

发表于 2020-11-10 10:37:28 | 显示全部楼层
flishmen 发表于 2020-11-9 17:33
别误导人家,接受字段是两个字符。这中断只是一个字符接受完成就会触发。
需要判定一下,还要用到缓冲区 ...

对于批评我欣然接收,也谢谢你的拨乱反正,其实我也只是随意在自己的工程里复制了一段做个示例,没有经过验证,也希望看到你的完整代码用来学习。
回复 支持 反对

使用道具 举报

发表于 2020-11-10 10:42:37 | 显示全部楼层
312439374 发表于 2020-11-9 21:00
太感谢了,我试试哈

抱歉,忘了串口发送接收的是8位数据的问题了,如果将开关指令改成8位的(例如:0xf0,0xf1)或许就简单多了,我的代码不能直接判断0xFF11的。
回复 支持 反对

使用道具 举报

发表于 2020-11-10 10:57:51 | 显示全部楼层
312439374 发表于 2020-11-9 21:01
好像是要判断的,我根据郭天祥的视频教程,整出来了,但是感觉我随便发个啥过去都能触发.能不能指导下,谢谢 ...

其实这样已经完成80%了,就增加各串口缓冲区,然后写一个指令判定函数就可以了。

增加串口缓冲区,将串口数据放入缓冲区。
增加了一个hand 函数,用于判定串口命令。

主循环中调用hand 函数,可以判定任意长度(不超过串口缓冲区长度)的命令。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-10 20:56:06 | 显示全部楼层
flishmen 发表于 2020-11-10 10:57
其实这样已经完成80%了,就增加各串口缓冲区,然后写一个指令判定函数就可以了。

增加串口缓冲区,将串 ...

多谢大神!
代码感觉好高级,看来我要学习的东西还很多
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-10 20:56:59 | 显示全部楼层
elecfunwb 发表于 2020-11-10 00:49
在STCISP的例程基础上修改的,系统时钟11.0592Mhz,波特率9600。
串口接收只实现了简单的判断,没有做异常 ...

好的好的,谢了哈
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-14 02:45 , Processed in 0.202800 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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