zmszsh 发表于 2012-1-17 16:30:23

最简单的串口仿真竟然都做不出来

我先上程序
#include<reg51.h>      
unsigned char code zifuchuan[ ]="kk---";

void fasong(unsigned char dat)
{
   SBUF=dat;        //发送数据
   while(TI) //检查发送完成中断标志如果未完成就等等否则复位发送标志位以便下个数据可以发送
      
    TI=0;                                  
}

void yanshi(unsigned int n)
{
    unsignedint i,j;
    for(i=0; i<n; i++)
    for(j = 249; j > 0; j--);
}
void main(void)
{       
   unsigned int i;
   TMOD=0x20;//TMOD=0010 0000B,定时器T1工作于方式2
   SCON=0x40;//SCON=0100 0000B,串口工作方式1 1起始位8数据位1停止位
   PCON=0x00;//PCON=0000 0000B,波特率9600晶振11.0592
   TH1=0xfd;    //根据规定给定时器T1赋初值
   TL1=0xfd;    //根据规定给定时器T1赋初值
   TR1=1;      //启动定时器T1   
while(1)
   {                  i=0;
       while(zifuchuan != '\0')//循环发送字节数组中的数据
             {
                  fasong(zifuchuan);      //调用发送函数发送数据       
                       i++;//指向下个字符       
               yanshi(1);   //150ms发送一次数据                 
                  }       
               yanshi(1000);   //150ms发送一次数据                               
   }
}          

http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_713524Z9A155.jpg
仿真电路(原文件名:LB7A15ZQHE48FNJ%_VP0[]W.jpg)

结果竟然是他只认空格不认字符串,刚接触串口通信怎么也想不明白,希望知道的帮解释一下,谢谢了!

qjs412_51 发表于 2012-1-17 16:46:42

while(TI) //检查发送完成中断标志如果未完成就等等否则复位发送标志位以便下个数据可以发送
这个是不是少一个分号,TI是自动清零的吧
先一个字节发发看

lsy5110 发表于 2012-1-17 17:07:08

while(!TI); //检查发送完成中断标志如果未完成就等等否则复位发送标志位以便下个数据可以发送
      
TI=0;
这样试试。
////////////////////////////
TI是自动清零的吧
/////////////////////////
ti好像不是硬件清零的。

zmszsh 发表于 2012-1-17 17:18:40

TI那个改了不行
kk---这个发过去
显示的还只是中间的两个空格

zjczm 发表于 2012-1-19 14:38:46

不会仿真,只会直接上电路测试的路过。

abc0010 发表于 2012-1-20 14:38:49

楼主试一下这个:
#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar code testString[] = "This is a test.";

void Delay(uint val);
void UartConfig();
void SendChar(uchar val);
void SendStr(uchar *pval);

void main()
{
    UartConfig();

    while (1)
    {
      SendStr(testString);
      Delay(100);
    }
}

void Delay(uint val)
{
    uchar i = 0;

    while (val-- != 0)
    {
      for (i = 0; i < 200; i++)
      {
            ;
      }
    }
}

void UartConfig()
{
    PCON = 0x00;
    SCON = 0x40;
    TMOD = 0x20;
    TH1 = 0xfd;
    TR1 = 1;
}

void SendChar(uchar val)
{
    TI = 0;
    SBUF = val;

    while (!TI) //这里不一样!!!
    {
      ;
    }

    TI = 0;
}

void SendStr(uchar *pval)
{
    uint i = 0;

    while (pval != '\0')
    {
      SendChar(pval);
    }
}

47okey 发表于 2012-1-28 14:27:20

程序都没动,仿真效果如图


http://cache.amobbs.com/bbs_upload782111/files_51/ourdev_714696CSBVXQ.png
(原文件名:截图35.png)

zmszsh 发表于 2012-1-30 09:02:08

呃 那我是我仿真软件的问题了!!!!

zzz1367 发表于 2012-1-30 10:11:22

我也测试了下,你的问题是
proteus中单片机的 晶振频率 没改成11.0592的缘故。
用12M的就会出现 2个 长框框(竖的)。 如下图。


http://cache.amobbs.com/bbs_upload782111/files_51/ourdev_715007YLEMVH.JPG
(原文件名:uart.JPG)

---------------------------------------
编辑原因:上传图片。

zmszsh 发表于 2012-1-30 10:34:21

晕 一直怀疑是波特率的问题,可是没有想到这方面来。
习惯用12M了!
谢谢大家 了!

jianlove27cn 发表于 2012-1-30 11:38:59

下个最新的仿真软件回复【7楼】zmszsh 想起
-----------------------------------------------------------------------

spegar2011 发表于 2012-2-18 16:33:17

mark

tuowai 发表于 2012-2-19 15:09:25

学习下!

357853730 发表于 2012-2-19 15:25:32

楼主还要多学习啊,C编程的风格要认真点,吊儿郎当的可不好。
页: [1]
查看完整版本: 最简单的串口仿真竟然都做不出来