⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 海带打结.c

📁 本程序里包含74ls164的串行传输方式;适合keil开发使用
💻 C
字号:
#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>	    //内部包含延时函数;
#define uchar unsigned char
#define uint  unsigned int

////74LS164控制线和相关单元////
sbit ab164=P1^7;     //串行数据线
sbit ck164=P1^6;     //串行时钟线
sbit dsbt=P1^5;      //显示消隐线
/////////输入线定义////////////
sbit FBI=P3^7;       //翻板输入
sbit QDI=P3^2;       //起始点输入
sbit XZI=P3^4;       //选择开关输入
sbit ZFI=P3^3;       //正反转输入
sbit JSI=P3^5;       //计数输入
sbit NKI=P3^1;       //内控检测输入
sbit DAX=P3^0;       //串行数据线
sbit dx=P1^0;        //定相
 bit csh1=0; 
 bit mcs;            //脉冲数标志
 bit jsd;            //加速段标志
 bit csbz;           //均速标志
 bit bsd;            //变速标志
 bit jsbz;           //减速标志
 bit yxjs;           //运行结束标志
uchar code ffw[6]={             //环形分配//
0xf8,0xfc,0xf4,0xf6,0xf2,0xfa}; //A->AB->B->BC->C->CA

uchar code rev[6]={             //环形分配//
0xfa,0xf2,0xf6,0xf4,0xfc,0xf8}; //A->AB->B->BC->C->CA

uchar code tab[]={              //数码管表
0xc0,0xcf,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90};

uint code jiasubiao[]={
500,600,700,800,900,1000,1100,1200,1300,1400,1500,
1600,1700,1800,1900,2000,2100,2200,2300,2400,2500};

uchar jias,juens,jians;         //加速,均速,减速单元
uchar i,tt,temp;
uint num=0,num1;
/////////延时函数/////////////

void delay1(uint z)
{
uint x,y; 
    for(x=100;x>0;x--)
        for(y=z;y>0;y--);
}


//********************************************************

void dip()
{
     
     uchar ii;
     dsbt=1;
     for(ii=0;ii<8;ii++)  //发送数据到8位了吗?
		   {
         
		   temp=temp<<1;    //temp左移1位
		   ab164=CY;        //最高位送CY
		   ck164=1;         //164时钟拉高
		   delay1(5);       //延时5us
		   ck164=0;         //锁存数据
		   dsbt=0;          //开显示
		   }
}

//////////转动一次函数///////
void zdyc()
{
		mcs=1;    		       //置脉冲数标志
		jsd=1;    		       //置加速段标志
		bsd=1;    		       //置变速标志
      num1=jiasubiao[20];
		jias=20;  		       //取加速步数
		dx=0;  
      num=0;                //取消定相
      //TH1=0xf6;             //赋初值100us
		TR1=1;                //启动定时器
      
		while(yxjs!=1);          //运行结束了吗?
    
	      mcs=0;             //清脉冲数标志
			jsd=0;    	       //清加速段标志
			bsd=0;    	       //清变速标志
         TR1=0;             //停止定时
         yxjs=0;            //运行标志清0
			TH1=0xf6;          //赋初值250us        
    		TL1=0xf6; 
         //P1=0;   
        
}     

//////////初始化函数/////////
void csh()
{
    
    TMOD=0x21;              //定时器工作方式1
    TH1=0xf6;               //赋初值100us        
    TL1=0xf6;    
	 EA =1;                  //开总中断
	 ET1=1;                  //开T1中断
         
}
//////////主函数/////////////
void main()
{
     //uchar rr;
     //TR1=1;
     temp=tab[8];
     dip();
     csh();                 //初始化程序
     temp=tab[4];	
     dip();
  while(1)                  //主程序循环
	  {
      if(FBI!=1)
      zdyc();
	  }
}

///////////环形分配函数/////////////

void hxout()
{
       uchar de;            //定义一个变量置;
       
       P1=ffw[de];          //环形分配输出
       de++;                //de加1
       if(de==6)            //判断de=6吗
        {
         de=0;              //等6则赋值为0;
        }
}
////////////////////////////////
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3 
{ 
    
    
 num++;
 if(num==num1)
   {
	    num=0;
	    P0=~P0;
       //yxjs=1;
    if(jsd)                    //有加速段标志吗
      {
        P2=0xff;
       hxout();                //调用环形分配输出;
       num1=jiasubiao[jias];
       jias--;                 //加速步数减1;
        if(jias==0)            //减速步数=0吗
           {
           jsd=0;              //等0则赋值为0
           csbz=1;             //置均速标志=1
           juens=200;          //取均速段步数
           
           }
      }
     
    if(csbz)                   //有均速段标志吗
       {
        P3=0;
        hxout();               //调用环形分配输出;
        num1=jiasubiao[jias];
        juens--;               //均速步数减1;
        if(juens==0)           //均速步数=0吗
           {
           csbz=0;             //均速标志=0
           juens=0;            //等0则赋值为0
           jsbz=1;             //置减速标志=1
           jias=0;             //取减速段步数
           P3=0xff;
           }
       }

		if(jsbz)                 //有减速段标志吗
       {
        P2=0;
        hxout();               //调用环形分配输出;
        num1=jiasubiao[jias];
        jias++;                //减速速步数减1;
        if(jias==20)           //减速步数=0吗
           {
           jsbz=0;             //减速速标志=0
           jias=0;             //等0则赋值为0
           yxjs=1;             //置工作完成标志=1
           
           
           }
       }
       
       
  }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -