搜索
bottom↓
回复: 13

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

[复制链接]

出0入0汤圆

发表于 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)
{
    unsigned  int 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发送一次数据                                 
   }
}          


仿真电路  (原文件名:LB7A15ZQHE48FNJ%_VP0[]W.jpg)

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

出0入0汤圆

发表于 2012-1-17 16:46:42 | 显示全部楼层
while(TI) //检查发送完成中断标志如果未完成就等等否则复位发送标志位以便下个数据可以发送
这个是不是少一个分号,TI是自动清零的吧
先一个字节发发看

出0入0汤圆

发表于 2012-1-17 17:07:08 | 显示全部楼层
while(!TI); //检查发送完成中断标志如果未完成就等等否则复位发送标志位以便下个数据可以发送
      
TI=0;  
这样试试。
////////////////////////////
TI是自动清零的吧
/////////////////////////
ti好像不是硬件清零的。

出0入0汤圆

 楼主| 发表于 2012-1-17 17:18:40 | 显示全部楼层
TI那个改了不行
kk  ---这个发过去
显示的还只是中间的两个空格

出0入0汤圆

发表于 2012-1-19 14:38:46 | 显示全部楼层
不会仿真,只会直接上电路测试的路过。

出0入0汤圆

发表于 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[i++]);
    }
}

出0入0汤圆

发表于 2012-1-28 14:27:20 | 显示全部楼层
程序都没动,仿真效果如图



(原文件名:截图35.png)

出0入0汤圆

 楼主| 发表于 2012-1-30 09:02:08 | 显示全部楼层
呃 那我是我仿真软件的问题了!!!!

出0入0汤圆

发表于 2012-1-30 10:11:22 | 显示全部楼层
我也测试了下,你的问题是
proteus中单片机的 晶振频率 没改成11.0592的缘故。
用12M的就会出现 2个 长框框(竖的)。 如下图。



(原文件名:uart.JPG)

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

出0入0汤圆

 楼主| 发表于 2012-1-30 10:34:21 | 显示全部楼层
晕 一直怀疑是波特率的问题,可是没有想到这方面来。
习惯用12M了!
谢谢大家 了!

出0入0汤圆

发表于 2012-1-30 11:38:59 | 显示全部楼层
下个最新的仿真软件回复【7楼】zmszsh 想起
-----------------------------------------------------------------------

出0入0汤圆

发表于 2012-2-18 16:33:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-19 15:09:25 | 显示全部楼层
学习下!

出0入0汤圆

发表于 2012-2-19 15:25:32 | 显示全部楼层
楼主还要多学习啊,C编程的风格要认真点,吊儿郎当的可不好。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 07:38

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

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