这是个用51做的计数器的程序,已加了注释。请哪位好心人帮帮忙。。问题是,计数会不定时出现乱码。。主要是个位上。
具体
电路图在附件。。
#include<reg51.h>
#include"24c02.h" //24c02存储器
#define uc unsigned char
#define ui unsigned int
uc code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e//共阳极数码管段
};
int num_qian,
time_qian,num_bai,time_bai,num_shi,time_shi,num_ge,time_ge,sum_qian,sum_bai,sum_shi,sum_ge,tiao,mode,time,num;
long sum;
ui i,j ;
sbit move=P1^7;//移位&清零
sbit add=P1^6; //加
sbit set=P1^5; //设置
sbit jiejin=P1^4; //接近开关
sbit yuan=P1^3; //输出控制1
sbit ping=P1^2; //输出控制2
sbit led=P1^1; //报警灯
sbit guangqian=P3^2; //计数光纤
sbit al
ARM=P1^1; //蜂鸣器
void delay(ui z) //延时1us函数
{
ui x,y;
for(x=z;x--;x>0)
for(y=12;y--;y>0);
}
void system_ini ( void) //函数初始化
{
ping=1; // 初始化控制1
yuan=1; // 初始化控制2
led =1; //报警灯
EA=1;
EX0=1;
IT0=1;
x24c02_init();
num_qian=x24c02_read(1); //读取存储器 保存的设定的个数
num_bai=x24c02_read(2);
num_shi=x24c02_read(3);
num_ge=x24c02_read(4);
sum_qian=x24c02_read(5); //读取存储器 保存的已计的个数
sum_bai=x24c02_read(6);
sum_shi=x24c02_read(7);
sum_ge=x24c02_read(8);
time_qian=x24c02_read(9); //读取存储器 保存的设定的计数到位延时时间
time_bai=x24c02_read(10);
time_shi=x24c02_read(11);
time_ge=x24c02_read(12);
num=num_ge+num_shi*10+num_bai*100+num_qian*1000;
sum=sum_ge+sum_shi*10+sum_bai*100+sum_qian*1000;
time=time_ge+time_shi*10+time_bai*100+time_qian*1000;
}
void system_led (led) //数码管 动态显示函数
{
//P2=0xff ;
P2=0xf7; //位选
//P0=0X00
P0=table[sum_ge]; //段选
;
delay(10);
//P2=0xf0;
P2=0xff ;
P2=0xfb;
//P0=0x00;
P0=table[sum_shi];
delay(10);
//P2=0xf0;
P2=0xff ;
P2=0xfd;
//P0=0x00;
P0=table[sum_bai];
delay(10);
//P2=0xf0;
P2=0xff ;
P2=0xfe;
//P0=0x00;
P0=table[sum_qian];
delay(10);
//P2=0xf0;
P2=0xff ;
}
///////////设置,1、按一下“设置”按钮,数码管最右边有数字显示,这是控制1停止后,控制2继续振得时间。按下“加”按钮,可以是数字增加,按一下“移位”按钮,显示十位,以此类推。
/////////// /////2、上面的时间设置完成后,按一下“设置”按钮,数码管显示的是要设置的个数,下面步骤同上。
/////////// /////3、最后按下“设置”按钮,数码管显示的是当前走料的个数,“设置“按钮只能在托盘不在设备上或“
电源”按钮关闭的情况下才能起作用。
void system_set ( void ) //设置
{
if(set==0)
{
delay(1000);
if(set==0)
{
EA=0;
tiao=1;
mode++;
if(mode==3)
{
mode=0;
EA=1;
}
}
}
if(mode==0) //正常计数模式
{
if(move==0)
{
delay(100);
if(move==0)
{
sum_ge=0;
sum_shi=0;
sum_bai=0;
sum_qian=0;
x24c02_write(5,sum_qian);
delay(10);
x24c02_write(6,sum_bai);
delay(10);
x24c02_write(7,sum_shi);
delay(10);
x24c02_write(8,sum_ge);
delay(10);
}
}
system_led (led);
if(sum_ge==10)
{
sum_ge=0;
sum_shi++;
if(sum_shi==10)
{
sum_shi=0;
sum_bai++;
if(sum_bai==10)
{
sum_bai=0;
sum_qian++;
if(sum_qian==10)
sum_qian=0;
}
}
}
x24c02_write(5,sum_qian);
delay(10);
x24c02_write(6,sum_bai);
delay(10);
x24c02_write(7,sum_shi);
delay(10);
x24c02_write(8,sum_ge);
delay(10);
sum=sum_ge+sum_shi*10+sum_bai*100+sum_qian*1000;
if((sum>=num)&(num>1))
{
if(sum_ge==10)
{
sum_ge=0;
sum_shi++;
if(sum_shi==10)
{
sum_shi=0;
sum_bai++;
if(sum_bai==10)
{
sum_bai=0;
sum_qian++;
if(sum_qian==10)
sum_qian=0;
}
}
}
yuan=1;
P2=0xf0;
for(i=1;i<=time;i++)
{
for(j=1;j<200;j++)
{
system_led (led);
}
}
ping=1;
while(jiejin==1)
{
led=1;
for(j=1;j<100;j++)
{
system_led (led) ;
}
led=0;
for(j=1;j<100;j++)
{
system_led (led);
}
}
led=1;
sum_ge=0;
sum_shi=0;
sum_bai=0;
sum_qian=0;
}
}
if(mode==1) //设置延时时间模式
{
if(move==0)
{
delay(1000);
if(move==0)
{
tiao++;
if(tiao==5)
tiao=1;
}
}
if(tiao==1)
{
delay(10);
P2=0xf7;
P0=table[time_ge];
if(add==0)
{
delay(1000);
if(add==0)
{
time_ge++;
if(time_ge==10)
time_ge=0;
}
}
}
if(tiao==2)
{
delay(10);
P2=0xfb;
P0=table[time_shi];
if(add==0)
{
delay(1000);
if(add==0)
{
time_shi++;
if(time_shi==10)
time_shi=0;
}
}
}
if(tiao==3)
{
delay(10);
P2=0xfd;
P0=table[time_bai];
if(add==0)
{
delay(1000);
if(add==0)
{
time_bai++;
if(time_bai==10)
time_bai=0;
}
}
}
if(tiao==4)
{
delay(10);
P2=0xfe;
P0=table[time_qian];
if(add==0)
{
delay(1000);
if(add==0)
{
time_qian++;
if(time_qian==10)
time_qian=0;
}
}
}
x24c02_write(9,time_qian);
delay(10);
x24c02_write(10,time_bai);
delay(10);
x24c02_write(11,time_shi);
delay(10);
x24c02_write(12,time_ge);
delay(10);
time=time_ge+time_shi*10+time_bai*100+time_qian*1000;
}
if(mode==2) //设置计数总数模式
{
if(move==0)
{
delay(1000);
if(move==0)
{
tiao++;
if(tiao==5)
tiao=1;
}
}
if(tiao==1)
{
delay(10);
P2=0xf7;
P0=table[num_ge];
if(add==0)
{
delay(1000);
if(add==0)
{
num_ge++;
if(num_ge==10)
num_ge=0;
}
}
}
if(tiao==2)
{
delay(10);
P2=0xfb;
P0=table[num_shi];
if(add==0)
{
delay(1000);
if(add==0)
{
num_shi++;
if(num_shi==10)
num_shi=0;
}
}
}
if(tiao==3)
{
delay(10);
P2=0xfd;
P0=table[num_bai];
if(add==0)
{
delay(1000);
if(add==0)
{
num_bai++;
if(num_bai==10)
num_bai=0;
}
}
}
if(tiao==4)
{
delay(10);
P2=0xfe;
P0=table[num_qian];
if(add==0)
{
delay(1000);
if(add==0)
{
num_qian++;
if(num_qian==10)
num_qian=0;
}
}
}
x24c02_write(1,num_qian);
delay(10);
x24c02_write(2,num_bai);
delay(10);
x24c02_write(3,num_shi);
delay(10);
x24c02_write(4,num_ge);
delay(10);
num=num_ge+num_shi*10+num_bai*100+num_qian*1000;
}
}
main()
{
system_ini ( ) ;
if (jiejin==0) //接近开关拿走
{
ping=1; //
yuan=1; //
led =1; //
}
while(1)
{
if(jiejin==1) //接近开关在位
{
ping=0;
yuan=0;
led =1;
}
system_set ( ) ;
}
}
void int0(void) interrupt 0 using 0
{
sum_ge++;
}
-
-
原理图新.zip
下载积分: 积分 -1 分
7.99 KB, 下载次数: 13, 下载积分: 积分 -1 分
也试过了。可是。还是效果不明显。哎,头大。
一周热门 更多>