找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5925|回复: 3
打印 上一主题 下一主题
收起左侧

[求助]编写一个单片机接收上位机发送的数据并将该数据显示在静态数码管上面,自己编的程序找不到问题所在,求教

[复制链接]
跳转到指定楼层
楼主
ID:36225 发表于 2012-3-14 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先贴上我的程序,请大家帮我找一下硬伤!
#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

sbit DAT=P3^0;
sbit CLK=P3^1;

uchar code table[]={0x77,0x14,0xb3,0xb6,0xd4,0xe6,0xe7,0x34,0xf7,0xf6};
uchar string[]={"12345678"}; //存储从上位机读出的数据
void _get_uchar_SerialPort(uchar);


void _init_SerialPort(void)
{
  SCON=0x50;  //设置串行口控制寄存器,方式1,多机通讯关闭,允许接收位   
  TMOD=0x20;  //启动定时器1为波特率发生器,工作于方式2—自动填装8位计数器;启动计数器0,方式0,13位计数器 
  
   TH1=0xFD;
     TL1=0xFD; //设置波特率为9600
   TR1=1; //启动计数器1
   EA=1; //开中断
   TI=0;//初始化中断,传送过程中为1,需要软件清零
}

  void delay(uint z)
  {
    uint x,y;
    for(x=0;x<z;x++)
    for(y=0;y<170;y++);
}





void _get_string_SerialPort(uchar *str,uint strlen)
{
   uint k=0;
  do
    {
        _get_uchar_SerialPort(*(str+k));
         k++;
    }
while(k < strlen);
}

void _get_uchar_SerialPort(uchar temp)
  {
    temp=SBUF;
    while(TI==0);
    TI=0;
}





void _disp_(uchar digit) //静态数码管显示函数
{
  uint Count;
  char CK;
  CK=table[digit];
for(Count=0;Count<8;Count++)
{
 
  CLK=0;
  DAT=CK&0x01;
  CLK=1;
  CK>>=1;

  }  
}



int main(void)
{


    uint i;
uchar h;
    _init_SerialPort(); //初始化串口函数;

for(i=0;i<8;i++)
   {
    _get_string_SerialPort(string,8);//从串口接收数据;

  }
   for(i=0;i<8;i++)
{
   h=string;
     h=h-48;
        _disp_(h);
}
while(1);
}
百思不得其解,快恶心死了!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:34608 发表于 2012-3-14 09:19 | 只看该作者

你出现的是什么问题啊,是不显示还是上位机不能传啊??

还有的你的数码管静态显示怎么是那样的函数啊,怎么是串行输出数据啊,数码管不上并行接收数据吗,所以你应该把你的原理图也写上!!

回复

使用道具 举报

板凳
ID:36225 发表于 2012-3-14 12:48 | 只看该作者

奥,我解释一下,是这样子的,我刚刚改了一下我的程序,接收函数我使用了中断函数来代替上面我的两个函数,然后在上位机发个0,小灯亮,发个1,小灯灭,但是我是想在上位机上发一串数(上位机是我用C#编的,调试正常),并且至少是得用数码管甚至是液晶屏显示的,所以我的中断函数是这么写的:(补充,2L问我数码管函数的问题,我的静态数码管是74HC164串并转换的,所以只需要两根线,一根时钟一根DAT,这个不是关键的,关键的是串口接收这儿)

void serial (void) interrupt 4
 {
  uint i;
  uchar temp;
  if(RI==1)
  {  
    RI=0;
    temp=SBUF;//上位机数据,送到temp 中
     if(temp == '1')  LED = 1;//如果上位机发了个1,那么小灯灭
     if(temp == '0')  LED = 0;//如果上位机发了个0,那么小灯亮
   for(i=0;i<8;i++)
    {
   string=SBUF;//将从接收缓冲区得到的数据全部存在事先定义好的数组里面,然后把这个数组发到我的静态数码管的显示函数里面去
    }
 
  }
 
}

[此贴子已经被作者于2012-3-14 12:58:36编辑过]
回复

使用道具 举报

地板
ID:34608 发表于 2012-3-16 21:56 | 只看该作者

你的中断函数里面, if(temp == '1')  则要确保你上位机发的是字符1,不是数字1;

还有 for(i=0;i<8;i++)
    {
   string=SBUF;
    }
这个循环是什么意思,你是想把SBUF重复的存8遍吗??你是想把接收到的数据放到string数组里面吧,

我觉得应该这样做把i定义成全局变量,然后用string[i++]=SBUF代替你的for循环,试试看!!

 

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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