打印

串口方式0传输数据,74ls164级联二级无输出,求解

[复制链接]
4369|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
验用串口方式0实现串口输出,用一级输出很正常,可是二级没有输出,用示波器观察164(2)的输入端口,有波形,但是没有输出。

程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delayms(uint xms)
{
uint i,j;
for(i = xms; i > 0; i--)
  for(j = 110; j > 0; j--);
}
void main()
{
SCON = 0;
EA = 1;
ES = 1;
TI = 0;
  SBUF = 0xab;
  delayms(1000);
  SBUF = 0xba;
while(1);
}
void ser0() interrupt 4
{
TI = 0;
}

图如下:





现在不知道是什么原因,求解

相关帖子

沙发
lxc806705| | 2011-4-26 14:31 | 只看该作者
scon=0,这个转化会不会有问题?

使用特权

评论回复
板凳
zhuyl456|  楼主 | 2011-4-26 21:36 | 只看该作者
2# lxc806705
那我应该怎么去改呢?
我的这个也是看着郭天祥的书写的

使用特权

评论回复
地板
谈的元| | 2011-4-26 21:56 | 只看该作者
多看几次164的级联吧

使用特权

评论回复
5
lxc806705| | 2011-4-27 10:26 | 只看该作者
3# zhuyl456
我用串口一般都按照书上的用法,用T1或者独立的波特率发生器来产生波特率,然后
再来发串口,而且一半都是8位的UART,scon=0x50;
如果你要求每秒发一次而你又不想用另外一个中断来置1秒得标志位,那么可以打开T1的中断,每次加1,判断等于你设定的波特率的数字时发送出字节。当然这样的波特率肯定就有点误差了。

使用特权

评论回复
6
lxc806705| | 2011-4-27 10:30 | 只看该作者
郭天祥的书我没看过,总觉得这样子写着很别扭,也许是我见得少-
独立的发送函数:
void transmit(unisgned char data)
{
    while(!TI) ;
    SBUF=data;
    TI=0;
}
这样就搞定了,初始化
TMOD=0x21;
SCON=0x50;
TH1=
TL1=这里写入你要的波特率
ES=1;
EA=1;
//TR1=1;可选
我一般这样写,你那种写法简单些但是我觉得很别扭

使用特权

评论回复
7
zhaoyu2005| | 2011-4-27 10:44 | 只看该作者
你的问题应该是第二片164(也就是U3)的第一脚造成的,1脚和2脚与后,作为输人,如果1脚保持0,那么后级输出一直为0,所以灯不亮,纠正下你的描述错误,这不是没有输出,而是不能输出高电平。
改造方法:
1.所有发光二极管串合适电阻(多大合适,自己计算),要养成习惯,防止实战时,习惯性的不加电阻,会烧发光二极管的
2.把第二级1脚的线断开然后1和2接在一起,或者保持1脚输入高电平,能正确的输入数据

使用特权

评论回复
8
xwj| | 2011-4-27 11:21 | 只看该作者
LS 正解。第二片的输入被LED钳位了,无法获得有效地高电平输入。

使用特权

评论回复
9
zys4399| | 2011-9-13 10:05 | 只看该作者
/**已在proteus调试成功,数码管是共阴极的********/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
                                                                        
void delayms(uint t);                                       
void init();
void send(uchar num);
sbit L0=P2^0;  sbit L1=P2^1; sbit L2=P2^2;
void main()
{
        L0=0;L1=0;L2=0;
        init();
         send(0x06);  //先发送个位数
          send(0x7f);  //再发送十位数
          send(0x6f) ; //最后发送百位数
            delayms(1000);       
       
while(1);
}
void init()
{
   SCON=0x00; //串口模式0---移位寄存器输入/输出方式
   TI=1;

}
void send(uchar num)
{  
           SBUF=num;
           while(TI==0);//TI=0则等待,等待硬件将TI置1
           TI=0;//软件清0
}

void delayms(uint t)
{
  uint i,j;
  for(i=0;i<t;i++)
    for(j=0;j<110;j++);
}

使用特权

评论回复
10
dengm| | 2011-9-13 14:44 | 只看该作者
74LS164 在Q7并一小电容到地, 用cd4094有Q7' 就保证级联

使用特权

评论回复
11
zhuyl456|  楼主 | 2011-9-14 10:36 | 只看该作者
谢谢各位的帮助!这个问题暂时先结贴,忙完这段时间再讨论!

使用特权

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

本版积分规则

1

主题

75

帖子

1

粉丝