amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 20

stc15w204s串口求救

[复制链接]
(206242785)

打赏出0元收入0元

发表于 2013-12-29 18:15:18 | 显示全部楼层 |阅读模式
第一次用stc的这个单片机,焊好了板子,下载程序以及IO口测试都没有问题,可以使用串口1的时候却遇到问题,例程是stc的isp软件中的,
我仅仅加了P37及nop这里几句,看看程序到底死在哪里,结果发现始终卡死在这句上"SendString("STC15F2K60S2\r\nUart Test !\r\n");",如果注释掉这句,则可以P37输出方波,搞了一下午,从网上下别人51的串口程序也不行,没一点头绪了,哪位大神帮帮忙看看

代码如下:

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz

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

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 18432000L          //系统频率
#define BAUD 115200             //串口波特率

#define NONE_PARITY     0       //无校验
#define ODD_PARITY      1       //奇校验
#define EVEN_PARITY     2       //偶校验
#define MARK_PARITY     3       //标记校验
#define SPACE_PARITY    4       //空白校验

#define PARITYBIT EVEN_PARITY   //定义校验位

sfr AUXR  = 0x8e;               //辅助寄存器

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

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

sbit P22 = P2^2;
sbit P37 = P3^7;
       
bit busy;

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


void main()
{
    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
   
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//  P_SW1 = ACC;  
//  
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
//  ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
//  P_SW1 = ACC;  

#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;                //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;                //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;                //9位可变波特率,校验位初始为0
#endif

    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/BAUD))>>8;
    TR1 = 1;                    //定时器1开始启动
    ES = 1;                     //使能串口中断
    EA = 1;
       
   P37  =1;
   _nop_();
   _nop_();
   _nop_();
   P37  =0;
    _nop_();
   _nop_();
   _nop_();  
   P37  =1;   
    SendString("STC15F2K60S2\r\nUart Test !\r\n");  //卡在这里了   
   P37 = 0;
       
    while(1)
            {
    P37  =1;
   _nop_();
   _nop_();
   _nop_();
   P37  =0;
    _nop_();
   _nop_();
   _nop_();               
            }
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;                 //清除RI位
        P0 = SBUF;              //P0显示串口数据
        P22 = RB8;              //P2.2显示校验位
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
    if (P)                      //根据P来设置校验位
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 0;                //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 1;                //设置校验位为1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 1;                //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 0;                //设置校验位为0
#endif
    }
    busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}

硬件选项
QQ图片20131229181452.jpg
(206191431)

打赏出0元收入0元

发表于 2013-12-30 08:31:12 | 显示全部楼层
15F204用过,正常

试试这样写

void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*(s++) );         //发送当前字符
    }
}
(206180975)

打赏出0元收入0元

 楼主| 发表于 2013-12-30 11:25:28 | 显示全部楼层
谢谢,试过了,没有作用,后来在keil里面选择INTEL的8758编译了一下,可以了,再选回stc15w204s编译也没问题了,很奇怪
(206175392)

打赏出0元收入0元

发表于 2013-12-30 12:58:31 来自手机 | 显示全部楼层
估计内存越界段错误了。
(204537204)

打赏出0元收入0元

发表于 2014-1-18 12:01:39 | 显示全部楼层
stc15w204s没有定时器1
(199828729)

打赏出0元收入0元

发表于 2014-3-13 23:56:14 | 显示全部楼层
同样是这样子的问题。我的串口也用不了。也是用官网里的程序,串口就是没输出,也是死在SendString("STC15F2K60S2\r\nUart Test !\r\n");这名上面,我搞了几天了,大虾门帮看看
(199828072)

打赏出0元收入0元

发表于 2014-3-14 00:07:11 | 显示全部楼层
#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 18432000L          //系统频率
#define BAUD 115200             //串口波特率

#define NONE_PARITY     0       //无校验
#define ODD_PARITY      1       //奇校验
#define EVEN_PARITY     2       //偶校验
#define MARK_PARITY     3       //标记校验
#define SPACE_PARITY    4       //空白校验

#define PARITYBIT EVEN_PARITY   //定义校验位

sfr AUXR  = 0x8e;               //辅助寄存器

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

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

sbit P22 = P2^2;
sbit P37 = P3^7;  //led
        
bit busy;

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


void main()
{
    P37=1;
       
        ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
   
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//  P_SW1 = ACC;  
//  
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
//  ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
//  P_SW1 = ACC;  

#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;                //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;                //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;                //9位可变波特率,校验位初始为0
#endif

    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/BAUD))>>8;
    TR1 = 1;                    //定时器1开始启动
    ES = 1;                     //使能串口中断
    EA = 1;
        
   P37  =1;
   _nop_();
   _nop_();
   _nop_();
   P37  =0;
    _nop_();
   _nop_();
   _nop_();  
   P37  =0;   
    SendString("STC15F2K60S2\r\nUart Test !\r\n");  //卡在这里了   
   P37 = 1;
        
    while(1)
            {

   SendString("STC15F2K60S2\r\nUart Test !\r\n");

    P37  =0;
   _nop_();
   _nop_();
   _nop_();

    _nop_();
   _nop_();
   _nop_();               
            }
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;                 //清除RI位
        P0 = SBUF;              //P0显示串口数据
        P22 = RB8;              //P2.2显示校验位
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
    if (P)                      //根据P来设置校验位
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 0;                //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 1;                //设置校验位为1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
        TB8 = 1;                //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 0;                //设置校验位为0
#endif
    }
    busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*(s++) );         //发送当前字符
    }
}

(198731898)

打赏出0元收入0元

发表于 2014-3-26 16:36:45 | 显示全部楼层
正准备使用STC15W204S单片
(171170686)

打赏出0元收入0元

发表于 2015-2-8 16:30:17 来自手机 | 显示全部楼层
遇到这个问题的同人顶下
(168221637)

打赏出0元收入0元

发表于 2015-3-14 19:41:06 | 显示全部楼层
求教一下,最近刚开始使用这一型号的单片机,请问你们是如何把程序下载进单片机?我用STC-ISP6.82下载不进去
(168217766)

打赏出0元收入0元

发表于 2015-3-14 20:45:37 | 显示全部楼层
XJTUCJX 发表于 2015-3-14 19:41
求教一下,最近刚开始使用这一型号的单片机,请问你们是如何把程序下载进单片机?我用STC-ISP6.82下载不进 ...

所有IC下载方法都一样的,串口通讯正常,最小系统正常,冷启动下载。
(168077199)

打赏出0元收入0元

发表于 2015-3-16 11:48:24 | 显示全部楼层
小李非刀 发表于 2015-3-14 20:45
所有IC下载方法都一样的,串口通讯正常,最小系统正常,冷启动下载。

嗯,谢谢。最后按照官方一个文档总RS485通信试了很多次下载成功,但是成功率不是特别高
(79310426)

打赏出0元收入0元

发表于 2018-1-6 21:14:37 | 显示全部楼层
STC15W204S-35I-SOP16

性能特点
1.增强型8051CPU,1T,单时钟/机器周期,速度比普通8051快8-12倍
2.工作电压:2.5V-5.5V
3.1K/2K/3K/4K/5K/7.5K字节片内Flash程序存储器,擦写次数10万次以上
4.片内集成256字节的SRAM
5.有片内EEPROM功能,擦写次数10万次以上
6.ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器
7.内部高可靠复位,ISP编程时16级复位门槛电压可选,可彻底省掉外部复位电路
8.工作频率范围:5MHZ~35MHZ,相当于普通8051的60MHZ~420MHZ
9.内部高精度R/C时钟(±0.3%),±1%温漂(-40℃~+85℃),常温下温漂±0.6%(-20℃~+65℃),ISP编程时内部时钟从5MHZ~35MHZ可设(5.5296MHZ/11.0592MHZ/22.1184MHZ/33.1776MHZ)
10.不需外部晶振和外部复位,还可对外输出时钟和低电平复位信号
11.一组高速异步串行通信端口,可在2组管脚之间进行交换,分时复用可当2组串口使用:串行口(RxD/P3.0,TxD/P3.1)可以切换到(RxD_2/P3.6,TxD_2/P3.7).
注意:建议用户将串口放在[P3.6/RxD_2,P3.7/TxD_2]上([P3.0,P3.1]作下载/仿真用);若用户未将串口切换到[P3.6/RxD_2,P3.7/TxD_2],而是用[P3.0/RxD,P3.1/TxD]作串口,则务必在ISP编程时在STC-ISP软件的硬件选项中勾选“下次冷启动时,P3.2/P3.3为0/0时才可以下载程序”
12.支持程序加密后传输,防拦截
13.支持RS485下载
14.低功耗设计:低速模式,空闲模式,掉电模式/停机模式。
15.可将掉电模式/停机模式唤醒的定时器:有内部低功耗掉电唤醒专用定时器
16.可将掉电模式/停机模式唤醒的资源有:INTO/P3.2,INT1/P3.3(INTO/INT1上升沿下降沿中断均可),INT2/P3.6,INT3/P3.7,INT4/P3.0(INT2/INT3/INT4仅可下降沿中断);管脚RxD(可在RxD/P3.0和RxD_2/P3.6之间切换);管脚TO/T2(下降沿,不产生中断,前提是在进入掉电模式/停机模式前相应的定时器中断已经被允许);内部低功耗掉电唤醒专用定时器。
(75526219)

打赏出0元收入0元

发表于 2018-2-19 16:24:44 | 显示全部楼层
204.jpg

15w204没有定时器1,当然等着啦

    AUXR = 0x40;                //定时器1为1T模式
    TMOD = 0x00;                //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/BAUD))>>8;
    TR1 = 1;                    //定时器1开始启动
    ES = 1;                     //使能串口中断
    EA = 1;
(15066044)

打赏出0元收入0元

发表于 2020-1-20 10:54:19 | 显示全部楼层
侠客们,我想让STC15W204S一通电就发出个~F22843#OPWER=900这个字符就发送一遍就行,怎么编呀,指导一下,纯菜鸟,
(13391686)

打赏出0元收入0元

发表于 2020-2-8 20:00:17 | 显示全部楼层
  1. //stc204s串口发送程序 //9600bps@11.0592MHz
  2. #include "STC15Fxxxx.h"

  3. bit B_TX1_Busy; //发送忙标志

  4. /**************串口1波特率初始化***************************/
  5. void Uart1_Sys_Init(void)                //9600bps@11.0592MHz
  6. {
  7.     SCON = 0x50;                //8位数据,可变波特率
  8.     AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  9.     AUXR &= 0xFB;                //定时器2时钟为Fosc/12,即12T
  10.     T2L = 0xE8;                //设定定时初值  11.0592M
  11.     T2H = 0xFF;                //设定定时初值
  12.     AUXR |= 0x10;                //启动定时器2
  13.     ES = 1;     //串行中断 允许控制位
  14.     //REN = 1;    //串口1允许接收
  15.     EA = 1;
  16. }
  17. //
  18. //********串口1发送字符串函数********************************/
  19. void PrintString_Uart1(unsigned char code * puts)//发送一个字符串
  20. {
  21.     for (; *puts != 0;  puts++)     //遇到停止符0结束
  22.     {
  23.         SBUF = *puts;
  24.         B_TX1_Busy = 1;
  25.         while(B_TX1_Busy);//等待发送完成
  26.     }
  27. }
  28. //
  29. void main()
  30. {
  31.     Uart1_Sys_Init();
  32.     PrintString_Uart1("~F22843#OPWER=900");
  33.     while (1)
  34.         {
  35.             ;
  36.          }
  37. }
  38. //
  39. void UART1_Interrupt(void) interrupt 4
  40. {
  41.     if(RI)
  42.     {
  43.         TI=0;
  44.     }

  45.     if(TI)//发送完成
  46.     {
  47.         TI = 0;//请接收标志
  48.         B_TX1_Busy = 0;//串口1发送忙
  49.     }
  50. }
  51. //
复制代码
(13333820)

打赏出0元收入0元

发表于 2020-2-9 12:04:43 | 显示全部楼层
SYF110110 发表于 2020-1-20 10:54
侠客们,我想让STC15W204S一通电就发出个~F22843#OPWER=900这个字符就发送一遍就行,怎么编呀,指导一下, ...

把上面程序烧进芯片看看,应该可以的
(13154234)

打赏出0元收入0元

发表于 2020-2-11 13:57:49 | 显示全部楼层
XTXB 发表于 2020-2-9 12:04
把上面程序烧进芯片看看,应该可以的

oK,我试一下,多谢兄台,有问题我在向您请教
(13153809)

打赏出0元收入0元

发表于 2020-2-11 14:04:54 | 显示全部楼层

那串字符写到哪呀朋友!
(8491924)

打赏出0元收入0元

发表于 2020-4-5 13:02:59 | 显示全部楼层

大佬,纯新手求指导一下,怎样接收到固定的字符串的后,进行比较呢?
比较到正确的字符串后,再去实行其它指令?
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-12 19:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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