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

📄 keil.c

📁 提供包括硬件、软件在内的高效、低成本的完整嵌入式开发平台及解决方案。典型产品为以386EX CPU为核心的嵌入式网络模块系列
💻 C
字号:
/*************测试控制器程序  *************************
**   编号    中断源      入口地址   **
**    0     外部中断0     0003H     **
**    1     定时计数0     000BH     **
**    2     外部中断1     0013H     **
**    3     定时记数1     001BH     **
**    4     串口中断      0023H     **
*******************************************************
***仓控制板硬件定义
 P35--出牌电机    P11--出牌计数     P12--传感器电源开关
 P15--传动电机    P10--有无牌检测   P13--传感器电源开关
 P27--开始按键    P25--蜂鸣器       P0---LEDdata
 P14--DIP拨码     P16--选择传动电机转动方式
 P26--个     P2.2--十     P2.4--百      P2.0--千
 ******************************************************
 计数传感器有牌时为H、无牌时为L
 有无牌检测传感器有牌时为L、无牌时为H
NUMLAB:  ;共阳
db 0A0H  ;NUM_0
db 0BBH  ;NUM_1
db 62H   ;NUM_2
db 2AH   ;NUM_3
db 39H   ;NUM_4
db 2CH   ;NUM_5
db 24H   ;NUM_6
db 0BAH  ;NUM_7
db 20H   ;NUM_8
db 28H   ;NUM_9
*********************************************************/
#include <stdio.h>
#include <AT89x52.h>
#include <absacc.h>
#include <intrins.h>

#define   Front_motor1  P2_3     //电机一控制
#define   Front_motor2  P2_1     //电机二控制
#define   Back_motor    P1_5     //后电机控制
#define   Count_OPTO    P1_1     //计数传感器OPTO
#define   Back_OPTO     P1_0     //有无感器OPTO
#define   Key           P2_7
#define   Speak         P2_5
#define   OPTOV1        P1_2     /*有无牌检测传感器电源开关*/
#define   OPTOV2        P1_3     /*出牌计数传感器电源开关*/
#define   LED_CS1       P2_6     /*LED个位*/
#define   LED_CS2       P2_2     /*LED十位*/
#define   LED_CS3       P2_4     /*LED百位*/
#define   LED_CS4       P2_0     /*LED千位*/

void    Start(void);      /*初始化*/
void    Delay50ms(void);
void    Delay(void);
void    OutCard(void);    /*发牌*/
void    LEDdisplay(void);
void    TimeINT(void);

unsigned  char  TAB[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
unsigned  char  LEDdata1,LEDdata2,LEDdata3,LEDdata4;
unsigned  char  Tdata,Card_data;
unsigned  char  Ydata;

bit  RXbit,OutCardBit,CLRbit;

void main(void)
{
	TMOD=0x01;      /*设定时器0,工作方式1 */
	TH0=0x3c;        /*定时器0初值*/
	TL0=0xb0;        /*定时器0初值*/
	//TR0=0;
	ET0=1;          /* 中断0边沿触发方式 */
	EA=1;
	Front_motor1=0;   /*不转*/
	Front_motor2=1;   /*不转*/
	LEDdata1=0;       /*初始化LED所有位清零*/
	LEDdata2=0;
	LEDdata3=0;
	LEDdata4=0;
	Tdata=0;
	Ydata=0;
	Speak=0;         /*响声50ms*/
	Delay50ms();
	Speak=1;

	while(P1_6)
 	{
		Delay50ms(); 
  		Delay50ms();
  		Delay50ms(); 
  		Delay50ms();
  		Delay50ms();
  		Back_motor=0;     /*传牌电机转*/
  		Front_motor1=1;   /*正转*/
  		Front_motor2=1;   /*正转*/
  		Delay50ms(); 
  		Delay50ms();  
  		Delay50ms(); 
  		Delay50ms();  
  		Delay50ms(); 
  		Delay50ms();
  		Back_motor=1;     /*传牌电机停*/
  		Front_motor1=0;   /*出牌电机停*/
  		Front_motor2=1;   /*出牌电机停*/
  	}

	if(P1_6)      /*读拨码判断传牌电机是否为间歇运转*/
 		TR0=1;     /*间歇运转*/
	else
 		TR0=0;     /*连续运转*/

	while(1)
 	{ 
		OPTOV1=0;         /*开传感器电源*/
   		OPTOV2=0;         /*开传感器电源*/
   		while(Back_OPTO)        /*检测牌盒是否无牌?*/
     	{	
			if(Ydata==20)        /*检测20次*/
       		{
				while(Back_OPTO)
         		{
					Ydata=0;
          			TR0=0;
          			Back_motor=1;     /*传牌电机停*/
          			Delay50ms();
          			Front_motor1=0;   /*出牌电机停*/
          			Front_motor2=1;   /*出牌电机停*/
          		}
        	}
      		Ydata++;
      		break;
      	}
   		if(Card_data==5)
    	{
			TR0=0;
     		Front_motor1=0;   /*出牌电机停*/
     		Front_motor2=1;   /*出牌电机停*/
     		Back_motor=1;     /*传牌电机停*/
     		Card_data=0;     /*发牌计数清零*/
     		Delay50ms();
     		Delay50ms();
     		if((Count_OPTO))      /*检测计数传感器是否有牌*/
       		{
				while(Count_OPTO)
          		{
					Front_motor1=0;   /*有牌出牌电机反转*/
           			Front_motor2=1; 
				}
        		Delay50ms();
        		Delay50ms();
        		Front_motor1=0;   /*出牌电机停*/
        		Front_motor2=1;   /*出牌电机停*/
        	}
     		Delay50ms();
     		Delay50ms();
     	}

   		if(P1_6)      /*读拨码判断传牌电机是否为间歇运转*/
     		TR0=1;     /*间歇运转*/
   		else
     	{
			TR0=0;    /*连续运转*/
      		Back_motor=0;
		}

   		Front_motor1=1;   /*正转*/
   		Front_motor2=1;   /*正转*/
   		//Front_motor=0;
   		LEDdisplay();
   		if(Count_OPTO)
    	{
			do{
				Back_motor=1;
				TR0=1;	
				LEDdisplay();
			}
     		while(Count_OPTO);
       		{
				Card_data++;
        		LEDdata1++;
        		if(LEDdata1>9)        /*计数进位*/
          		{
					LEDdata1=0;
           			LEDdata2++;
           			if(LEDdata2>9)
             		{
						LEDdata2=0;
              			LEDdata3++;
              			if(LEDdata3>9)
                		{
							LEDdata3=0;
                 			LEDdata4++;
                 			if(LEDdata4>9)
                   			{
								LEDdata1=0;
                    			LEDdata2=0;
                    			LEDdata3=0;
                    			LEDdata4=0;
                    			Speak=0;
                    			Delay50ms();
                    			Speak=1;
                    		}
                 		}
              		}
           		}
        	}
     	}
   	}
}

/************************************/
void  LEDdisplay(void)   /*数码显示*/
{ 
	LED_CS4=1;
	P0=TAB[LEDdata1];
	LED_CS1=0;
	Delay();
	LED_CS1=1;
	P0=TAB[LEDdata2];
	LED_CS2=0;
	Delay();
	LED_CS2=1;
	P0=TAB[LEDdata3];
	LED_CS3=0;
	Delay();
	LED_CS3=1;
	P0=TAB[LEDdata4];
	LED_CS4=0;
	Delay();
}
/**********************************/
void TimeINT(void) interrupt 1 using 0
{
	Tdata++;
	if(P1_4==1)
	{
		if(Tdata==5)
  		{
			Tdata=0;
   			Back_motor=!Back_motor;
   		}
	}
	else
	{
		if(Tdata==10)
  		{
			Tdata=0;
   			Back_motor=!Back_motor;
   		}
	}
	TH0=0x3c;        /*定时器0初值*/
	TL0=0xb0;        /*定时器0初值*/
	TR0=1;
}
/**********************************/
void  Delay50ms(void)
{
	unsigned  char i;
	for(i=0;i<0x20;i++)
	{
		LEDdisplay();
	}
}
/**********************************/
void  Delay(void)
{
	unsigned  char i,Count0;
	for(i=0;i<0x2;i++)
	{
		for(Count0=0;Count0<0xff;Count0++)
  		{
			_nop_(); 
		}
	}
}

⌨️ 快捷键说明

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