⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xssy.c

📁 就是一个单片机c程序,实现硬件测试功能,主要测试数码管和按键
💻 C
字号:
#include <REG54.H>
#include <absacc.h>
#define unchar unsigned char
#define unint unsigned int

//定义地址
//定义p8155

unchar xdata p8155con _at_ 0x7ff8;
unchar xdata p8155a _at_ 0x7ff9;
unchar xdata p8155b _at_ 0x7ffa;
unchar xdata p8155c _at_ 0x7ffb;
unint  xdata p8155ram[100] _at_ 0x7e00;
//

//定义8253
unchar xdata p8253_0_con _at_ 0xefff;//p24
unchar xdata p8253_0_0   _at_ 0xeffc;
unchar xdata p8253_0_1   _at_ 0xeffd;
unchar xdata p8253_0_2   _at_ 0xeffe;

unchar xdata p8253_1_con _at_ 0xdfff;//p25
unchar xdata p8253_1_0   _at_ 0xdffc;
unchar xdata p8253_1_1   _at_ 0xdffd;
unchar xdata p8253_1_2   _at_ 0xdffe;
//8253 end
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p14=P1^4;
sbit p15=P1^5;//AB
sbit p16=P1^6;//CD
sbit p17=P1^7;//泵
sbit p30=P3^0;
sbit p31=P3^1;
sbit p33=P3^3;
sbit p34=P3^4;

bit lu_flag;
bit hong_flag;
bit time_flag;
bit tjcd_flag;
bit ydbz_flag;

unchar code number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //number0-9 
unchar code number1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unchar sj[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
unchar dlz[2]={0x00,0x00};
unchar jshu[2]={0x00,0x00};
unint dlzh;
unint jshuh;  
unchar  channel;
unchar count;
unchar i;
unchar j; 

//delay  begin
void delayus(unchar i)//delay  3+2*i uS
{
	unchar uscanshu;
	uscanshu=i;
	while (--uscanshu);
	return;
}
void delayms(unsigned int n_milisecond)  //mS delayms 
{
	unsigned char i;
	while(--n_milisecond)
	{
		i=37;
		while(--i);
	}
	return;
}
void delays(unsigned char timers) //dalay s
{
	unsigned char i;
	for (i=0; i<timers; i++)
	{
		delayms(200);
		delayms(200);
		delayms(200);
		delayms(200);
		delayms(200);
	}
	return;
}
//delay   end 
void setp8253(void)
{
	p8253_0_con=0x30;
	p8253_0_con=0x70;
	p8253_0_con=0xb0;
	
	p8253_1_con=0x30;
	p8253_1_con=0x70;
	p8253_1_con=0xb0;
	
	p8253_0_con=0xb0;//out2=0
	
	p8253_1_1=0x05;
	p8253_1_1=0x05;
	
	p8253_1_2=0x06;
	p8253_1_2=0x06;
	
	p8253_1_0=0x04;
	p8253_1_0=0x04;	
	
	p8253_0_con=0xb8;//out2=1
	p8253_0_con=0xb0;//out2=0
	p8253_1_con=0x70;//out1=0
	
	p8253_0_1=0x02;
	p8253_0_1=0x02;

	p8253_0_2=0x03;
	p8253_0_2=0x03;
	
	p8253_0_0=0x01;
	p8253_0_0=0x01;
	
	
	p8253_1_con=0x78;//out=1
	p8253_1_con=0x70;//out=0	
	
	p8253_1_1=0x05;
	p8253_1_1=0x05;
	
	p8253_1_2=0x06;
	p8253_1_2=0x06;
	
	p8253_1_0=0x04;
	p8253_1_0=0x04;	
	
	
	
	p8253_0_1=0x02;
	p8253_0_1=0x02;
	
	p8253_0_2=0x03;
	p8253_0_2=0x03;
	
	p8253_0_0=0x01;
	p8253_0_0=0x01;	
}

void dup8253_1(void)
{
	unchar i;
	unint temp;
	p8253_0_con=0x00;
	dlz[0]=p8253_0_0;
	delayus(1);
	dlz[1]=p8253_0_0;
	
	dlzh=dlz[1]*256+dlz[0];
	
	temp=dlzh;
	for(i=0;i<=4;i++)
		{
			sj[i]=temp%10;
                	temp=temp/10;	
		}
	
}
void dup8253_2(void)
{
	unchar i;
	unint temp;
	p8253_0_con=0x40;
	dlz[0]=p8253_0_1;
	delayus(1);
	dlz[1]=p8253_0_1;
	
	dlzh=dlz[1]*256+dlz[0];
	
	temp=dlzh;
	for(i=0;i<=4;i++)
		{
			sj[i]=temp%10;
                	temp=temp/10;	
		}
	
}
void dup8253_3(void)
{
	unchar i;
	unint temp;
	p8253_0_con=0x80;
	dlz[0]=p8253_0_2;
	delayus(1);
	dlz[1]=p8253_0_2;
	
	dlzh=dlz[1]*256+dlz[0];
	
	temp=dlzh;
	for(i=0;i<=4;i++)
		{
			sj[i]=temp%10;
                	temp=temp/10;	
		}
	
}
void dup8253_4(void)
{
	unchar i;
	unint temp;
	p8253_0_con=0x00;
	dlz[0]=p8253_1_0;
	delayus(1);
	dlz[1]=p8253_1_0;
	
	dlzh=dlz[1]*256+dlz[0];
	
	temp=dlzh;
	for(i=0;i<=4;i++)
		{
			sj[i]=temp%10;
                	temp=temp/10;	
		}
	
}
void dup8253_5(void)
{
	unchar i;
	unint temp;
	p8253_0_con=0x40;
	dlz[0]=p8253_1_1;
	delayus(1);
	dlz[1]=p8253_1_1;
	
	dlzh=dlz[1]*256+dlz[0];
	
	temp=dlzh;
	for(i=0;i<=4;i++)
		{
			sj[i]=temp%10;
                	temp=temp/10;	
		}
	
}
void dup8253_6(void)
{
	unchar i;
	unint temp;
	p8253_0_con=0x80;
	dlz[0]=p8253_1_2;
	delayus(1);
	dlz[1]=p8253_1_2;
	
	dlzh=dlz[1]*256+dlz[0];
	
	temp=dlzh;
	for(i=0;i<=4;i++)
		{
			sj[i]=temp%10;
                	temp=temp/10;	
		}
	
}

void int_display(void) interrupt 3//1mS
{
//	EA=0;

	TR1=0;//停止计数
	ET1=1;//允许T1中断
        TH1=0xf0;
        TL1=0x0c; 
        i=0;
        i=count%8;
        count=count+1;
		j=j+1;
        switch(i)
        {
        	case 0:
        	{
        		p8155a=0x01;
        		p8155b=number[sj[0]];        		
        		break;
        	}
        	case 1:
        	{
        		p8155a=0x02;
        		p8155b=number[sj[1]];        		
        		break;
               	}
               	case 2:
               	{
               		p8155a=0x04;
               		p8155b=number[sj[2]];               		
               		break;
               	}
               	case 3:
               	{
               		p8155a=0x08;
               		p8155b=number[sj[3]];               		
               		break;
               	}
               	case 4:
               	{
               		p8155a=0x10;
               		p8155b=number[sj[4]];               		
               		break;
               	}
               	case 5:
               	{
               		p8155a=0x20;
               		p8155b=number[sj[5]];               		
               		break;
               	}
               	case 6:
               	{
               		p8155a=0x40;
               		p8155b=number1[sj[6]];               		
               		break;
               	}
               	case 7:
               	{
               		p8155a=0x80;
               		p8155b=number[sj[7]];               		
               		break;
               	}
        }
	if (time_flag==1)
        {
        	
        	if (count>=89)
        	{
	        	sj[7]=sj[7]+1;
	        	if (sj[7]>=10)
	        	{
	        		sj[7]=0;
	        		sj[6]=sj[6]+1;
	        	}
	        	if (sj[6]>=10)
	        	{
	        		sj[6]=0;
	        		sj[5]=sj[5]+1;
	        	}
	        	if (sj[5]>=10) sj[5]=0;
				count=0;
	        }
			
	}
	TR1=1;
        EA=1;
                 
}

void int_honglu(void) interrupt 0
{
	EA=0;
	
	if(p13==0&p14==1)
	{
		
		
		if(lu_flag==0)
		{
			EX1=0;
			lu_flag=1;
		}
		
	}
	else
	{
		if(p13==1&p14==0)
		{
			EX1=0;		
			hong_flag=1;
		
		}
	}
	EX1=1;
	EA=1;
}

void int_select(void) interrupt 2
{
	
	unchar i;
//	unchar j;
//	EA=0;
	if (p33==0)
	{ 		delayus(5);
            if(p33==0)
            {
			channel=channel+1;
	 		
	 		if(ydbz_flag==0)
	 		{
	 			i=channel%6;
	 			switch(i)
	 			{
	 				case 0:
	 				{
	 					p8155c=0x04;
//	 					for(j=0;j<=7;j++)sj[j]=0x01;
	 					break;
	 				}
	 				case 1:
	 				{
	 					p8155c=0x02;
//	 					for(j=0;j<=7;j++)sj[j]=0x02;
	 					break;
	 				}
	 				case 2:
	 				{
	 					p8155c=0x01;
//	 					for(j=0;j<=7;j++)sj[j]=0x03;
	 					break;
	 				}
	 				case 3:
	 				{
	 					p8155c=0x20;
//	 					for(j=0;j<=7;j++)sj[j]=0x04;
	 					break;
	 				}
	 				case 4:
	 				{
	 					p8155c=0x10;
//	 					for(j=0;j<=7;j++)sj[j]=0x05;
	 					break;
	 				}
	 				case 5:
	 				{
	 					p8155c=0x08;
//	 					for(j=0;j<=7;j++)sj[j]=0x06;
	 					break;
	 				}
	 			}
	 	
			}
			else
			{
				i=channel%2;
				switch(i)
				{
					case 0:
					{
yy:
						p8155c=0x02;
						delays(1);
						p8155c=0x00;
						goto yy;
						break;

					}
					case 1:
					{
yy1:
						p8155c=0x10;
						delays(1);
						p8155c=0x00;
						goto yy1;
						break;
					}
				}
			
			
		}
	
	}
}
loop1://等待按键抬起?
	if(p33==0)
	{
		goto loop1;
	}
	else
	{
		if(p33==1)
		delayus(5);
		if(p33==0)
		goto loop1;
	}
}
void ydbz(void)
{
	unchar i;
	
//	for(i=0;i<=2;i++)fivetest();
	
}
//体积测定
void tjcd(void)
{
	unchar i;
	EA=1;
	ET1=1;
	lu_flag=0;
	hong_flag=0;
	time_flag=0;
	for (i=0; i<8; i++) sj[i]=0x00;
	p11=0;
	p12=0;
	p13=1;
	p14=1;
	p15=0;//起泵
tjloop1:
	if(p31==0) goto tjloop1;
	else 
	{
		p15=1;//停泵
		p17=0;//AB打开
		p16=1;//CD关闭
		time_flag=1;
		while(1)
		{
			
			if(lu_flag==1)
			{
				goto tjloop2;
			}
		}
	}
tjloop2:
		time_flag=0;
		p11=1;p12=0;//体积测试灯亮		
		p17=1;p16=1;//abcd关闭				
		EA=0;//检测体积测定按键
tjkey1:
		EA=1;
		delayms(20);
		EA=0;
		p8155a=0x00;
		if(p30==1)goto tjkey1;
		EA=1;
		delayms(20);
		EA=0;
		p8155a=0x00;
		if(p30==0)
		{
			p8155a=0xfe;
   			if(p30==0) tjcd_flag=1;
   			else tjcd_flag=0;
		}
		if(tjcd_flag==0) goto tjloop2;
		EA=1;
		EX1=1;
		p17=0;//继续进样
		p16=1;		
		while(1)
		{
			time_flag=1;
			if(hong_flag==1)goto tjloop3;
		}
tjloop3:
		time_flag=0;
		p16=1;
		p17=1;
		delayus(1);
		p16=0;
		p17=1;
		delays(4);
		p16=1;
		p17=1;
}
//体积测定end
void fivetest(void)
{
	unchar i;
	EA=1;
	ET1=1;
	lu_flag=0;
	hong_flag=0;
	for (i=0; i<8; i++) sj[i]=0x00;
	p11=0;
	p12=0;
	p13=1;
	p14=1;
	p15=0;//起泵
loop2:
	if(p31==0) goto loop2;
	else 
	{
		p15=1;//停泵
		p17=0;//AB打开
		p16=1;//CD关闭
		while(1)
		{
			
			if(lu_flag==1)
			{
				goto loop3;
			}
		}
	loop3:
		time_flag=1;
		for(i=0;i<=4;i++)sj[i]=0x01;
//		delays(1);
		while(1)
		{
			for(i=0;i<=4;i++)sj[i]=0x02;
			if(hong_flag==1)
			goto loop4; 
		}
	loop4:
		
		time_flag=0;
//		delays(1);
		p16=0;//cd打开
		p17=1;//AB关闭
		delays(2);
		p16=1;
		p17=1;
		for(i=0;i<=4;i++)sj[i]=0x03;
	}
	
	
}
void key_check(void)
{
	unchar key;
	unchar i;
	EA=0;
key1:
	EA=1;
	delayms(20);
	EA=0;
	p8155a=0x00;
	if(p30==1)goto key1;
	EA=1;
	delayms(20);
	EA=0;
	p8155a=0x00;
	if(p30==0)
	{
		p8155a=0xfe;
   		if(p30==0) key=0;//体积测定
   		p8155a=0xfd;
   		if(p30==0) key=1;//打印
   		p8155a=0xfb;
   		if(p30==0) key=2;//空
   		p8155a=0xf7;
   		if(p30==0) key=3;//5ml测试
   		p8155a=0xef;
   		if(p30==0) key=4;//药典标准
   		p8155a=0xdf;
   		if(p30==0) key=5;//针剂测试
   		p8155a=0xbf;
   		if(p30==0) key=6;//暂停
   		p8155a=0x7f;
   		if(p30==0) key=7;//500ml
	}
	else
	{
		EA=1;
		goto key1;
	}
	switch(key)
	{
		case 0://体积测定
		{
			tjcd();
			break;
			
		}
		case 1://打印
		{
			for(i=0;i<=7;i++)sj[i]=0x02;
			break;	
		}
		case 2://空
		{
			for(i=0;i<=7;i++)sj[i]=0x03;
			break;
		}
		case 3://5ml测试
		{
			for(i=0;i<=7;i++)sj[i]=0x04;
			fivetest();
			break;
		}
		case 4://药典标准
		{
			if(ydbz_flag==0)
			{
				ydbz_flag=1;
				p8155c=0x02;	
			}
			else 
			{
				ydbz_flag=0;
			}
			
			break;
		}
		case 5://暂停
		{
			for(i=0;i<=7;i++)sj[i]=0x06;
			break;
		}
		case 6://结束
		{
			for(i=0;i<=7;i++)sj[i]=0x07;
			
			break;
		}
		case 7://针剂测试
		{
		loop5:
			p15=0;
			if(p31==0)goto loop5;
			else
			{
				p15=1;
				p16=0;
				p17=1;
				delays(5);
				p16=1;
				p17=1;
			}
			
			for(i=0;i<=7;i++)sj[i]=0x08;
			break;
		}
	}
}
    
void main(void)
{

    IE=0x00;//中断允许控制寄存器
    IP=0x0b;//中断优先级控制寄存器
    TMOD=0x06;//T1为定时方式13位计数器不受中断1的控制
    IT0=0;//外部中断0为电平触发
    IT1=0;//外部中断1为电平触发
    TCON=0x00;//定时器控制寄存器
    TL1=0x0c;//定时1ms
    TH1=0xf0;
    TL0=0xff;
    TH0=0xff;
    EX0=1;//外部中断0允许位 =1 允许  =0 禁止
    EX1=1;//外部中断1允许位 =1允许  =0禁止
    TR0=1;//定时器0开始定时控制位
    ET0=1;//定时器0溢出中断允许位  =0  禁止溢出中断 =1 允许溢出中断
    TR1=1;//定时器1开始定时控制位
    ET1=1;//定时器1溢出中断允许位  =0 禁止溢出中断 =1 允许溢出中断
    EA=1;//中断允许位
    P1=0xff;
    p8155con=0x0f;
    p8155a=0x00;
    p8155b=0x00;
    p8155c=0x04;//开机通道指示灯在通道0上
    count=0;
    time_flag=0;
	lu_flag=0;
	hong_flag=0;
    i=0;
    setp8253();
/*kk:
    for(i=0;i<=7;i++) sj[i]=0x00;
    delays(3);
    dup8253_1();
    delays(3);
    dup8253_2();
    delays(3);
    dup8253_3();
    delays(3);
    dup8253_4();
    delays(3);
    dup8253_5();
    delays(3);
    dup8253_6();
    delays(3);
    goto kk;*/

//    fivetest(); 
    while(1) key_check();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -