打印

C51程序

[复制链接]
2455|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hrg13579|  楼主 | 2011-3-14 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,
与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止
然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“765666”。到此保持住*/
//定时器0采用查询法,定时器1采用中断法
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit FM=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
#define TH_M2 (65636-50000)/256;
#define TL_M2 (65636-50000)%256;
void delayms(int);/*延时函数*/
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//void display(uchar,uchar);
uchar num,num1,num2,bai,shi,ge;
int k=1,z1=765,z2=432,z=0,b=0,n=0;
void main()
{
  P1=0x7f;
  TH1=TH_M2;
  TL1=TL_M2;
  TMOD=0X11;/*t0工作在方式1*/
  EA=1;/* 开全局中断.*/  
  ET1=1;
  TR1=1;
  while(1)  
  {    if(z==2) //每0.1s送一个数据 //if(z==2)   如果写成后面那种那么在while中的程序是自动
       {  z=0;              // z=0;    一直在扫的,那么还没等0.1S到,程序就自己
   if(z2>398)             // if(z2>398)  在以大于5ms一点的时间在扫描。
        z2--;             //   z2--;    其中z2一定要在里面,这样即使没到0.1S而程序
    }            //自己运行也不会改变数据的状态
      dula=1;
         P0=table[z1/100];
         dula=0;
         P0=0x00;
         wela=1;
      P0=0xfe;//低电平开启
      wela=0;
         P0=0x00;
   delayms(5);

      dula=1;
         P0=table[z1%100/10];
      dula=0;
         P0=0x00;
         wela=1;
      P0=0xfd;//低电平开启
      wela=0;
         P0=0x00;
      delayms(5);
     
  
      dula=1;
         P0=table[z1%100%10];
      dula=0;
         P0=0x00;
         wela=1;
      P0=0xfb;//低电平开启
      wela=0;
         P0=0x00;
      delayms(5);//     
      //如果if的小包含while中全部程序,那么意思就是每到1s才执行里面的程序,所以前面两个数只能1S显示扫一次,就显示不出来(人眼的余辉效应就失效了)   
   
     dula=1;
         P0=table[z2/100];
      dula=0;
         P0=0x00;
         wela=1;
      P0=0xf7;//低电平开启
      wela=0;
         P0=0x00;
      delayms(5);
   
   dula=1;
         P0=table[z2%100/10];
      dula=0;
         P0=0x00;
         wela=1;
      P0=0xef;//低电平开启
      wela=0;
         P0=0x00;
      delayms(5);
   dula=1;
         P0=table[z2%100%10];
      dula=0;
         P0=0x00;
         wela=1;
      P0=0xdf;//低电平开启
      wela=0;
         P0=0x00;
      delayms(5);
  
   
///////////////////////////////////////////////////////////////////
     if(z2!=398)
   {  
      for(k=0;k<10;k++)
      {  TH0=TH_M2;
            TL0=TL_M2;
   TR0=1;
   while(TF0==0);
   TF0=0;
   }
      P1=P1>>1;
     // delayms(500);
   if(P1==0x00)
   P1=0x7f;
  // break;
   }   
     //  if(z2==10)
     // k=0;

//////////////////////////////////////////////////////////////////
   if(z2==398)
   {   
     for(k=0;k<100;k++) //当z2=398,开始启动定时器0
      {   TH0=TH_M2;
             TL0=TL_M2;
    TR0=1;
    while(TF0==0);
    TF0=0;
    /*if(k==20)
    P1=0x00;  
    if(k==40)
    P1=0xff;
    if(k==60)
    P1=0x00;
    if(k==80)
    P1=0xff;
    if(k==100)
    P1=0x00;
    //P0=0xff; */
   }
   while(1)
   {  z1=765;
      z2=666;
      dula=1;
            P0=table[z1/100];
            dula=0;
            P0=0x00;
            wela=1;
         P0=0xfe;//低电平开启
         wela=0;
            P0=0x00;
      delayms(5);

         dula=1;
            P0=table[z1%100/10];
         dula=0;
            P0=0x00;
            wela=1;
         P0=0xfd;//低电平开启
         wela=0;
            P0=0x00;
         delayms(5);
     
  
         dula=1;
            P0=table[z1%100%10];
         dula=0;
            P0=0x00;
            wela=1;
         P0=0xfb;//低电平开启
         wela=0;
            P0=0x00;
         delayms(5);//     
      //如果if的小包含while中全部程序,那么意思就是每到1s才执行里面的程序,所以前面两个数只能1S显示扫一次,就显示不出来(人眼的余辉效应就失效了)   
   
        dula=1;
            P0=table[z2/100];
         dula=0;
            P0=0x00;
            wela=1;
         P0=0xf7;//低电平开启
         wela=0;
            P0=0x00;
         delayms(5);
   
      dula=1;
            P0=table[z2%100/10];
         dula=0;
            P0=0x00;
            wela=1;
         P0=0xef;//低电平开启
         wela=0;
            P0=0x00;
         delayms(5);
      dula=1;
            P0=table[z2%100%10];
         dula=0;
            P0=0x00;
            wela=1;
         P0=0xdf;//低电平开启
         wela=0;
            P0=0x00;
         delayms(5);
   }  
  }
   }
}
void t1(void)interrupt 3
{  z++;
   TH1=TH_M2;
   TL1=TL_M2;
}
void delayms(int x)
{
  unsigned int i,j;
  for(i=0;i<x;i++)
    for(j=1;j<=120;j--);   //1ms
}


帮我看看,为什么程序停止在下面这段程序中啊,谢谢了
if(z2!=398)
   {  
      for(k=0;k<10;k++)
      {  TH0=TH_M2;
            TL0=TL_M2;
   TR0=1;
   while(TF0==0);
   TF0=0;
   }
      P1=P1>>1;
     // delayms(500);
   if(P1==0x00)
   P1=0x7f;
  // break;
   }

相关帖子

沙发
hrg13579|  楼主 | 2011-3-14 12:03 | 只看该作者
没人回复:'(

使用特权

评论回复
板凳
hezhe131| | 2011-3-14 13:43 | 只看该作者
收藏

使用特权

评论回复
地板
大道至简| | 2011-3-14 13:55 | 只看该作者
没人回复:'(
hrg13579 发表于 2011-3-14 12:03


这么长的code,谁有空看呢?
你的问题不够简洁

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:胸有凌云志,无高不可攀!

300

主题

587

帖子

4

粉丝