//这段代码可以用吗?
//注释的不是很完全,不过希望对你有帮助
/////////////////////////////////
// 这个是C51单片机的程序 //
/////////////////////////////////
#include <reg51.h>//包含进51的头文件
#define uchar unsigned char
#define SNAKE 20
#define TIME 50
#define SPEED 71
//#define keyenable 1
//sbit up=P0^0
//----------定义引角地址 Start-----------------
sbit keyenable=P3^6
sbit keyy=P0^2
sbit up=P3^3
sbit down=P3^1
sbit right=P3^2
sbit left=P3^4
//----------定义引角地址 End-----------------
uchar x[SNAKE+1]
uchar y[SNAKE+1]
uchar time,n,i,e
//这是个延时子函数,单位为 毫秒,是通过单片机的指定执行时间实现的
void delay(char MS)
{
char us,usn
while(MS!=0)
{
usn = 0
while(usn!=0)
{
us=0xff
while (us!=0){us-}
usn-
}
MS-
}
}
//此按数用来判断,是否有按键被按下,如果没有按键按下返回0 ,否而返回1
bit knock()
{
bit k
k=0
if(x[1]>7||y[1]>7) k=0
return k
}
void turnkey()
{//up=1
if(keyenable)
{
if(left)
{
addy=0
if(addx!=1)
addx=1
else
addx=1
}
if(right)
{
addy=0
if(addx!=1)
addx=1
else
addx=1
}
if(up)
{
addx=0
if(addy!=1)
addy=1
else addy=1
}
if(down)
{
addx=0
if(addy!=1)
addy=1
else
addy=1
}
{
addy=0
if(keyx)
if(addx==1)
addx=1
else
addx=1
else
if(addx==1)
addx=1
else
addx=1
}
else
{
addx=1
if(keyx)
if(addy==1)
addy=1
else
addy=1
else
if(addy==1)
addy=1
else
addy=1
}
}
}
uchar mux(uchar temp)
{
if(temp==7)return 128
if(temp==6)return 64
if(temp==5)return 32
if(temp==4)return 16
if(temp==3)return 8
if(temp==2)return 4
if(temp==1)return 2
if(temp==0)return 1
return 0
}
void timer0(uchar k)
{
while(k--)
{
for(i=0i<SNAKE+1i++)
{
P2=mux(x[i])
P1=255-mux(y[i])
turnkey()
delay(TIME)//延时50ms
P2=0x00
P1=0xff
}
}
}
void main(void)
{
e=SPEED
P0=0x00
P1=0xff
P2=0x00
P3=0x00
while(1)
{
//初始化变量
//if(keyenable==1){P1=0x00P2=0xff}else{P1=0xffP2=0x00}
for(i=3i<SNAKE+1i++) x[i]=100
for(i=3i<SNAKE+1i++) y[i]=10
x[0]=4y[0]=4 x[1]=1y[1]=0
x[2]=0y[2]=0
addx=0addy=0
//k=1
//等待连接P3^6的按钮按下,如果按下跳出循环进行下一步 *** 作,这个应该是个"开始按钮"
while(1)
{
if(keyenable)break
timer0(1)
}
while(1)
{
timer0(e)
if(knock()){e=SPEEDbreak}
{
n++
if(n==SNAKE+1)
{
n=3e=e-10
for(i=3i<SNAKE+1i++)x[i]=10
for(i=3i<SNAKE+1i++)y[i]=100
}
x[0]=x[n-2]
y[0]=y[n-2]
}
for(i=n-1i>1i--){x[i]=x[i-1]y[i]=y[i-1]}
//x[n-1]=x[2]y[n-1]=y[2]
x[1]=x[2]+addxy[1]=y[2]+addy
}
}
}
分支定界法:把全部可行解空间反复的分割为越来越小的子集;并且对子集内的解集计算一个目标下界(最小值问题),称为定界。算法过程:
假设:A问题是要求解的整数规划问题,与之对应的线性规划问题为B(即去除整数约束),z*是A的最优解,~z是任一可行解,z~是B的最优解。
(1) 分支,在B的最优解中任选一个不符合整数条件的变量xj,其值为bj,以[bj]表示不大于bj的整数。构造两个约束条件xj<=[bj]和xj>=[bj]+1,将这两个条件加入B问题,分支成为新的规划B1和B2问题
定界,以B1和B2问题求解,与其他问题的解的结果中,找到最优目标函数的最大值作为新的上界~z。从已符合整数条件的各个分支中,找到目标函数值为最大者为新的下界~z,若无作用~z=0
(2) 比较与剪支,各分支的最优目标函数中若有小于z~者,则剪去这一支,即以后不再考虑了。若大于~z,且不符合整数条件,则重复(1)步骤。直到最后得到z*=~z为止。
知道原理理解就好了。其实可以不去理解程序本身的,知道原理自己也可以编程的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)