📄 海带打结.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 + -