找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教下有没有用单片机串口方式0,控制4片74HC595的,我写一个程序运行不了

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码
uchar time=0;
sbit rclk=P3^2;
void delay(unsigned char t)//延时函数
{
        unsigned char x,y;
        for(x=t;x>0;x--)
                for(y=110;y>0;y--);
}
void init() //定时器初始化
{
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、定时器1工作方式1
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;    //50ms
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时         

}
void main()
{
          init();
          SCON = 0x00;    // 串口模式0,即移位寄存器输入/输出方式
      TI = 1;      //开启TI,串口发送中断标志置1
          while(1)
         {       
                   EA=0;
                 rclk=0;
                   SBUF= seg7code[0];

                    while(!TI);
                    TI=0;
                 
                 
                 rclk=1;
                 
                 
                        EA=1;
                  delay(100);
                  EA=0;
                 rclk=0;
                   SBUF= seg7code[1];

                    while(!TI);
                    TI=0;
                 
                 
                 rclk=1;
                 
                 
                        EA=1;
                  delay(100);
                  
               
           }               
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{       
        static uchar value;                         //定时50ms中断一次
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;    //50ms
        value++;          
        if(value >= 20)
        {
                value = 0;       
                time++;
                if(time>=10)time=0;  
       
        }       
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:68189 发表于 2020-12-25 15:41 | 只看该作者
利用串口驱动没有试过,任意端口的驱动代码给你参考一下:
sbit SDA=Px^x;
sbit S_CLK=Px^x;
sbit R_CLK=Px^x;
  1. //*********************************************
  2. void HC595SendData(unsigned char SendVal)
  3. {
  4.     unsigned char bg;
  5.     for(bg=0; bg<8; bg++)
  6.     {
  7.         if((SendVal<<bg)&0x80)
  8.             SDA=1;
  9.         else SDA=0;
  10.         S_CLK=0;
  11.         //delay_us(5);
  12.         _nop_();
  13.         _nop_();
  14.         S_CLK=1;
  15.     }

  16. }
  17. void u595out(void)
  18. {
  19.     R_CLK=0;
  20. //delay_us(5);
  21.     _nop_();
  22.     _nop_();
  23.     R_CLK=1;
  24. }
  25. /********************************************************************/
复制代码
回复

使用道具 举报

板凳
ID:213173 发表于 2020-12-25 16:57 | 只看该作者
串口方式0控制74HC595?两者风马牛不相及。
回复

使用道具 举报

地板
ID:275826 发表于 2020-12-25 18:37 | 只看该作者
串口0完全可以控制多片74HC595
回复

使用道具 举报

5#
ID:213173 发表于 2020-12-25 20:13 | 只看该作者
tyrl800 发表于 2020-12-25 18:37
串口0完全可以控制多片74HC595

写一个示例仿真给大家开开眼如何?
回复

使用道具 举报

6#
ID:258566 发表于 2020-12-26 17:38 | 只看该作者
部分单片机可以,其他单片机txd输出端接到反相器输入端,反向器输出端接到595串行移位时钟。
回复

使用道具 举报

7#
ID:275826 发表于 2020-12-27 09:54 | 只看该作者
写一个示例仿真给大家开开眼如何?

#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

//sbit SDA        =     P1^1;
//sbit SHIFT_CP  =  P1^2;
sbit ST_CP     =  P3^2;
#define  NOP    _nop_()

uchar ledcode[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07, 0x7F, 0x6F};
uchar ledbitselect[] = {0x0fe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar i;

void InitSerialPort(void)
{
  SCON=0X00;

}

unsigned char Convert(unsigned char In_Date)
{
    unsigned char i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
       
    return Out_Date;
}

void delay(void)
{
        uchar jj;
        for(jj=0;jj<200;jj++);
        while(jj--);
}

void SerialSendData(uint dat)
{ uchar tmp,tmp1;
   
  uint sdata=dat;
  tmp=sdata>>8;
  tmp1=Convert(tmp);
  SBUF=tmp1;
  while(!TI);
  TI=0;

  tmp=sdata;
  tmp1=Convert(tmp);
  SBUF=tmp1;
  while(!TI);
  TI=0;
  ST_CP = 1;
  NOP;
  ST_CP = 0;
}


void main()
{
  InitSerialPort();
  while(1)
{uint tmp;
  tmp=ledbitselect[i]<<8;
  tmp=tmp|ledcode[i];//LED 共阴
  SerialSendData(tmp);
  
  //P2 =ledbitselect[i];
  delay();
  i=++i%8;
  SerialSendData(0xffff);
  //P2=0xff;
  }

}
回复

使用道具 举报

8#
ID:275826 发表于 2020-12-27 09:56 | 只看该作者
74hc595 和74ls164,4094都是移位寄存器,用法基本相同
回复

使用道具 举报

9#
ID:834848 发表于 2020-12-27 16:35 来自手机 | 只看该作者
串口方式0控制问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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