找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2972|回复: 0
收起左侧

请教,随机排布函数的设计

[复制链接]
ID:50562 发表于 2013-5-26 14:01 | 显示全部楼层 |阅读模式
随机排布:任一顺序的0~9的排列,如:8,3,1,5,4,0,9,7,6,2
用单片机生成一个随机排列,然后输出到P2口。
请大神指点啊
程序(有问题)如下:
#include<stdio.h>
#include<REG52.H>
unsigned short rtab[10] = {3, 9, 4, 1, 5, 0, 7, 8, 2, 6};
unsigned short divider[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23};   
unsigned short skip[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};      //skip是在rtab中的偏移
unsigned short temp[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};      //暂存skip
unsigned short result[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0};   //存放随机排布
unsigned int count=1;
void test()        //如果count能够被divider整除,那么skip++。
{
int i;
for(i=0;i<=8;i++)
{
  if(count%divider==0)
  {
   if(skip>=9-i)   //skip[]的进制分别是10,9,8,.....,3,2
    skip=0;
   else
    skip++;
   break;
  }
}
}
void timer1_int() interrupt 3 using 2     //计时器1中断程序,令count非溢出地加1
{
if(count>=65531)
  count=1;
else
  count++;
test();
}
void swap(unsigned short x,unsigned short y)   //将x,y对换
{
unsigned short tep;
tep=x;
x=y;
y=tep;
}
void refresh()                     //刷新,产生随机排布result[10];
{
//TR1 = 0;
int i=0;
for(i=0; i<=8; i++ )
  temp=skip;
//TR1=1;
   
for(i=0;i<=8;i++)                        //问题:该循环中,swap()不能实现rtab[temp]与rtab[9-i]的对换
{
  result=rtab[temp];
  swap(rtab[temp],rtab[9-i]);  //保证下次取到的数rtab[temp[i+1]]不与已经取到的数result[0~i]重复
}
result=rtab[0];
}
void display()                  //将result数组的内容依次输出到P2口                    
{
int i;
for(i=0; i<=9;i++ )
{
  P1=i;
  P2=result;
}
}
void int0_service() interrupt 2 using 3    //有键被按下时,调用外部中断1程序
{
switch(P1)
{
  case'0':
  case'1':
  case'2':
  case'3':
  case'4':
  case'5':
  case'6':
  case'7':
  case'8':
  case'9':P2=P1;/*save(P1);*/refresh();display();break;
// case'c':clear();break;                                 //清除一位
  case'r':refresh();display();break;                     //刷新
// case'e':enter();P2=enter;break;                       //确定
  default:/*P2=error;*/break;                          //显示出错
}
}

void main()
{

TMOD |= 0x20;             //timer 1, mode 2, 8-bit reload
TH1   = 221;              //初始值
EA    = 1;                //开所有中断
ET1   = 1;                //开计时器1溢出中断
EX1   = 1;                //开外部中断1
PX1   = 1;                //设外部中断1为高优先级
PT1   = 0;                //设计时器1中断为低优先级
TR1   = 1;                //计时开始

    while(1)                  //当按下确定键时,开始程序
{
  if(P1=='e')
   break;
}
refresh();               
while(1)
{
  display();
}
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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