打印
[STC单片机]

关于STC15W系列的串口通讯问题

[复制链接]
3012|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlawei|  楼主 | 2017-7-29 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很久没有用过51单片机了,所以,出现了这个问题有点不知所措。
先说问题:使用STC15W系列,写了一段串口程序,使用串行助手在电脑上接收程序,始终是乱码,我觉得程序没有问题,所以,又使用了一下STC12系列单片机,串口通讯正常,发送数据一切正常,因为第一次使用STC15W系列单片机,所以,想知道问题到底出在哪里了。
程序很简单:
文件:delay.c
#include "delay.h"
void delay(uint delaytime)
{
        while(delaytime--);
}


文件:uart.c
#include "uart.h"

void UartInit()
{

        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
void Tx_Data(uchar txData)
{
       
        SBUF=txData;                        // write data x to SBUF
        while(0==TI);
        TI=0;
       
}

void Tx_String(char *s)
{
        while(*s)
        {
                Tx_Data(*s++);
        }
}

文件:main.c
#include "uart.h"
void main()
{
        UartInit();
        delay(100);
        while(1)
        {
                Tx_String("hello world!\r\n");
               
        }

}

其中,程序中标红色的部分,是在STC12系列中没有的


相关帖子

沙发
wlawei|  楼主 | 2017-7-29 17:12 | 只看该作者
本帖最后由 wlawei 于 2017-7-29 17:47 编辑

在下载程序的时候,需要将振荡器放大增益的选项去掉,然后,程序输出正常了一次,此后,再试还是不行

使用特权

评论回复
板凳
feelhyq| | 2017-7-29 17:53 | 只看该作者
量一下TX管脚的波形,看看输出的波特率是不是有问题

使用特权

评论回复
地板
yhn1973| | 2017-7-29 18:45 | 只看该作者
有些STC15W没有定时器1

使用特权

评论回复
5
小十哦| | 2017-7-29 20:50 | 只看该作者
上型号看看

使用特权

评论回复
6
zhangxiyi5277| | 2017-7-29 21:28 | 只看该作者
逻辑分 析仪抓抓

使用特权

评论回复
7
hp34401a| | 2017-7-29 22:40 | 只看该作者
使用官方例程试试。另4楼说的对,注意资源

使用特权

评论回复
8
czdpj| | 2017-7-30 11:29 | 只看该作者
当年调试通过的程序
/****先定义数组类型再赋值**L316*********/     
/*2014 8 20 06:45**PAST*CODE994 **PAST**/     
               #include<reg51.h>   
               #define  uint unsigned int  
               #define  uchar unsigned char
                           sfr      AUXR=0x8e;              //辅助寄存器
               sfr      SADDR=0xA9;             //从机地址寄存器
               sfr      SADEN=0xB9;             //从机地址屏蔽寄存器
                           typedef  uchar BYTE;
               typedef  uint  WORD;
               #define  SLAVE 1                 //定义从机编号,0 为从机 1, 1 为从机 2
               #if      SLAVE==0
               #define  SAMASK 0x33             //从机 1 地址屏蔽位
               #define  SERADR 0x55             //从机 1 的地址为 xx01,xx01
               #define  ACKTST 0x78             //从机 1 应答测试数据
               #else
               #define  SAMASK 0x3C             //从机 2 地址屏蔽位
               #define  SERADR 0x5A             //从机 2 的地址为 xx01,10xx
               #define  ACKTST 0x49             //从机 2 应答测试数据
               #endif
               #define  URMD 2                  //0:使用定时器 2 作为波特率发生器
                       int      x,a,y,j;           //待放入数组的数据
               int      k,*p=&k;     //数组下标位变量
               uint     aa=0;                  //
                           uint     val,Buff;
               sfr      P4=0xc0;
               sfr      P5=0xc8;
                       sbit     out=P5^5;    //
                       sbit     CS=P3^5;         //12864 PIN4
               sbit     SID=P3^6;    //12864 PIN5
               sbit     SCLK=P3^7;   //12864 PIN6
                           sbit     key1=P3^2;   //
               sbit     key2=P3^3;   //
                           sbit     key3=P3^4;   //
                           uint     array[32],i; //定义数组a 循环总变量i
                           uchar    code zk[]=
                       {
                       0x41,0x00,0x21,0x00,0x31,0x00,0x21,0xFC,
               0x02,0x20,0x02,0x20,0xF4,0x20,0x10,0x20,
               0x17,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,
               0x14,0x20,0x18,0x20,0x10,0x20,0x00,0x20,
                       };
                       uchar    code disdt[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,
                                                0xb6,0xb7,0xb8,0xb9,0xa3};
/*------------------延时子程序------------------------*/
               void delay_1ms(uint x)
               {
               int i, j;
               for (i=0; i<x; i++)
               for (j=0; j<1500; j++);
               }
/*------------------延时子程序-----------------------------*/
              void delay(unsigned int t)
              {  
                          unsigned int i,j;
              for(i=0;i<t;i++)
              for(j=0;j<100;j++);
              }
/*------------------写命令到LCD-----------------------*/
               void write_com(unsigned char cmdcode)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               i_data=0xf8;
               delay(10);
               CS=1;
               SCLK=0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=cmdcode;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=cmdcode;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               }
/*-------------------写数据到LCD----------------------*/
               void write_data(unsigned char Dispdata)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               i_data=0xfa;
               delay(10);
               CS=1;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               }
/*------------------初始化LCD屏-----------------------*/
                           void lcd_init()
               {
               uchar comdata;
               delay_1ms(100);
               comdata=0x30;
               write_com(comdata);   /*功能设置:一次送8位数据,基本指令集*/
               comdata=0x04;
               write_com(comdata);   /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
                           comdata=0x0f;
               write_com(comdata); /*显示设定:开显示,显示光标,当前显示位反白闪动*/
               comdata=0x01;
               write_com(comdata);   /*清DDRAM*/
               comdata=0x02;
               write_com(comdata);   /*DDRAM地址归位*/
               comdata=0x80;
               write_com(comdata);   /*把显示地址设为0X80,即为第一行的首位*/
               }
/*------------初始化串口---------------------*/
               void InitUart()
               {
               SADDR=SERADR;
               SADEN=SAMASK;
               SCON=0x50;                                //8位数据,可变波特率允许接收
               #if URMD==0
               T2L=0xDF;                        //设置波特率重装值
               T2H=0xFE;                        //9600bps(65536-11059200/4/9600)
               AUXR &=0x40;                            //定时器1时钟为Fosc/12,即12T
                   AUXR&=0xFE;                                //串口1选择定时器1为波特率发生器
               #elif URMD==1
               AUXR=0x40;                       //定时器 1 为 1T 模式
               TMOD=0x20;                                //设定定时器1为16位自动重装方式
                   TL1=0xDF;                                //设定定时初值
                   TH1=0xFE;                                //设定定时初值
                   ET1=0;                                    //禁止定时器1中断
                   TR1=1;                                    //启动定时器1
               #else
               TMOD=0x20;                       //设置定时器 1 为 8 位自动重装载模式
               AUXR=0x40;                       //定时器 1 为 1T 模式
                       TL1=TH1=0xDB;                    //        9600 bps(256 - 11059200/32/9600)
               TR1=1;
               #endif
               }
/*********************************/
               void timer0() interrupt 1
               {
               aa=aa+1;
               TH0=0X53;
               TL0=0X32;
               if(aa==500)
               out=!out,
               aa=0;
               }  
/*--------UART 中断服务程序-------------------*/
               void Uart() interrupt 4 using 1
               {
                if(RI)
                {
                array[i]=SBUF;           //数组下标位置的数据等于j
                i++;                     //i加一
                RI=0;
                        }         
               }
/*--------显示     程序-------------------*/
              void uartdisp()
              {
                            a=0;
                                x=0;
                            for(y=0;y<=16;)
                                {
                if(x==0)
                        {
                                write_com(0x36);          //写入数据的地址
                        write_com(y+0X80);   //起始地址加计数地址80->8F
                write_com(0X80);     //列地址
                          write_com(0x30);          //扩充指令
                        write_data(zk[a]);    //一个字符的左半部        前一个字节
                                a++;
                        }
                        else
                        {
                write_data(zk[a]);         //一个字符的右半部 后一个字节
                                a++;
                        y++;       
                        }
                        x=~x;
                        if(y>=16)
                {
                         write_com(0x34);
                 write_com(0x36);
                        }
                                }
               }        
/*--------显示     程序-------------------*/
              void disp()
              {
                            a=0;
                                x=0;
                            for(y=0;y<=16;)
                                {
                if(x==0)
                        {
                        write_com(0x36);          //写入数据的地址
                write_com(y+0X80);   //起始地址加计数地址80->8F
                write_com(0X80);     //列地址
                          write_com(0x30);          //扩充指令
                        write_data(array[a]);    //一个字符的左半部        前一个字节
                                a++;
                        }
                        else
                        {
                write_data(array[a]);         //一个字符的右半部 后一个字节
                                a++;
                        y++;       
                        }
                        x=~x;
                        if(y>=16)
                {
                         write_com(0x34);
                 write_com(0x36);
                        }
                                }
               }        
/*******************************************/
               void send(unsigned temp)
              {
               unsigned serial;
                       serial=temp;
                       SBUF=(unsigned char)temp;
               while(TI!=1);
                       TI=0;
              }                                                           
/*********************************/
               void main()
               {
                           lcd_init();                         //初始化LCD屏
                           AUXR=0X80;             //STC系列的1T 设置
               TMOD=0X01;
               TH0=0X53;
               TL0=0X32;
                           ET0=1;
               TR0=1;
                           i=0;
                           InitUart();           //初始化串口
                           EA=1;
                           while(1)
                           {
                     if(!key1)
                             {
                                  EA=0;
                                  out=0;
                                  uartdisp();
                              delay(200);
                              out=1;
                                  EA=1;
                                 }
                             if(!key2)
                             {
                                  out=0;
                                  send(0x55);
                                  delay(2000);
                                  disp();
                                  delay(2000);
                              out=1;
                                 }
                                 if(!key3)
                                  {
                                  EA=0;
                                  out=0;
                                  i=0;
                                  lcd_init();
                              delay(2000);
                              out=1;
                                  EA=1;
                                 }
                                }
               }
           

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:个人网站 http://www.wlweb.org/

14

主题

79

帖子

0

粉丝