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

📄 2改rob.c

📁 本人弄的一个C程序
💻 C
字号:
 ///////////////////////12M
 ////////////////改为按一次键即可清除并启动
 ///////加一个开关作为两种抢答模式1不可连续抢答,2可连续抢答

#include<\atmel\AT89X51.h>
#include<intrins.h>


sbit	 	robled1	 =	P3^1;
sbit	 	robled2 =	P3^3;
sbit		robled3 =	P3^5;
sbit		robled4 =	P1^7;
sbit		startled =	P2^0;
sbit		speaker =	P1^5;

sbit		robkey1 =	P1^0;
sbit		robkey2	=	P1^1;
sbit		robkey3 =	P1^2;
sbit		robkey4 =	P1^3;
sbit		startkey =	P1^4;

sbit		statuskey =	P0^1;

unsigned char th0_f; //在中断中装载的T0的值高8位
unsigned char tl0_f; //在中断中装载的T0的值低8位

void delay_10us(unsigned char delayvalue);
void delay_ms(unsigned int delayvalue);	
unsigned char scankey(void);
void dispsub(void);
unsigned char scanrobkey(void);
void alarm(void);
void scankey1(void);

 //T0的值,及输出频率对照表
unsigned char  code freq[36*2]={
        0xA9,0xEF,//00220HZ ,1         //0
        0x93,0xF0,//00233HZ ,1#
        0x73,0xF1,//00247HZ ,2
        0x49,0xF2,//00262HZ ,2#
        0x07,0xF3,//00277HZ ,3
        0xC8,0xF3,//00294HZ ,4
        0x73,0xF4,//00311HZ ,4#
        0x1E,0xF5,//00330HZ ,5 
        0xB6,0xF5,//00349HZ ,5#
        0x4C,0xF6,//00370HZ ,6
        0xD7,0xF6,//00392HZ ,6#
        0x5A,0xF7,//00415HZ ,7    
        0xD8,0xF7,//00440HZ 1     //12
        0x4D,0xF8,//00466HZ 1#    //13
        0xBD,0xF8,//00494HZ 2     //14
        0x24,0xF9,//00523HZ 2#    //15
        0x87,0xF9,//00554HZ 3     //16
        0xE4,0xF9,//00587HZ 4     //17
        0x3D,0xFA,//00622HZ 4#    //18
        0x90,0xFA,//00659HZ 5     //19
        0xDE,0xFA,//00698HZ 5#    //20
        0x29,0xFB,//00740HZ 6     //21
        0x6F,0xFB,//00784HZ 6#    //22
        0xB1,0xFB,//00831HZ 7     //23
        0xEF,0xFB,//00880HZ `1
        0x2A,0xFC,//00932HZ `1#
        0x62,0xFC,//00988HZ `2
        0x95,0xFC,//01046HZ `2#
        0xC7,0xFC,//01109HZ `3
        0xF6,0xFC,//01175HZ `4
        0x22,0xFD,//01244HZ `4#
        0x4B,0xFD,//01318HZ `5
        0x73,0xFD,//01397HZ `5#
        0x98,0xFD,//01480HZ `6
        0xBB,0xFD,//01568HZ `6#
        0xDC,0xFD,//01661HZ `7           //35
};
////////////////////////////////////////////
  timer0() interrupt 1 
{
    TL0=tl0_f;TH0=th0_f;  //调入预定时值
    speaker=~speaker;           //取反音乐输出IO
}


////////////////////
///////////////////////////////////////
void main(){
unsigned char i,j;
i=0;j=0;
speaker=0;
for(;;){
	P3=0x0;
	P1_5=0;
	P1_7=0;
	P2_0=1;
	P2_2=0;
	j=0;
	for(;;){
		j=scanrobkey();
		if(j==0)break;
		delay_ms(1);
		}
	if(statuskey==1){
		if(startkey==0){		
			delay_ms(2);
			if(startkey==0)i=scankey(); 
			}
	 	if(i!=0)dispsub();
	 	i=0;
		}
	if(statuskey==0){
		if(startkey==0){		
			delay_ms(2);
			if(startkey==0)scankey1(); 
			}		
		}
	}	
}
//////////////////12Mhz
unsigned char scanrobkey(void){

		if(robkey1==0)return(1);
		if(robkey2==0)return(1);
		if(robkey3==0)return(1);
		if(robkey4==0)return(1);
		return(0);
		}
///////////////////////////////////
void scankey1(void){
	unsigned char temp;
	unsigned char k1,k2,k3,k4;
	k1=0;k2=0;k3=0;k4=0;
	temp=0;
	for(;;){	//testing startkey until startkey have been free
		if(startkey==1){delay_ms(1);if(startkey==1)break;}
		delay_ms(1);
		}
	P2_0=0;
	P2_2=1;

	for(;;){	//every key haved press will setup disabel
		for(;;){
			if((robkey1==0)&&(k1==0)){
				k1=1;

				robled1=1;
				robled2=0;
				robled3=0;
				robled4=0;
				break;
				}
			if((robkey2==0)&&(k2==0)){
				k2=1;

				robled1=0;
				robled2=1;
				robled3=0;
				robled4=0;
				break;
				}
			if((robkey3==0)&&(k3==0)){
				k3=1;

				robled1=0;
				robled2=0;
				robled3=1;
				robled4=0;
				break;
				}
			if((robkey4==0)&&(k4==0)){
				k4=1;

				robled1=0;
				robled2=0;
				robled3=0;
				robled4=1;
				break;
				}
			if(startkey==0){
				delay_ms(2);
				if(startkey==0){
			
						P3=0x0;
						P1_5=0;
						P1_7=0;
						return;
						}
				}
			}

		P2_0=1;
		P2_2=1;
		alarm();
		for(temp=0;temp<100;temp++){	//delay 2second exact startkey active other key disabel		
			delay_ms(20);
			if(startkey==0){
				delay_ms(2);
				if(startkey==0){
			
						P3=0x0;
						P1_5=0;
						P1_7=0;
						return;
						}
				}
			}
		}
	
	return;  
   }

//////////////////////
unsigned char scankey(void){

	unsigned char key;
	key=0;
	for(;;){
		if(startkey==1){delay_ms(1);if(startkey==1)break;}
		delay_ms(1);
		}
	P2_0=0;
	P2_2=1;
	for(;;){
		if(robkey1==0){key=1;robled1=1;break;}
		if(robkey2==0){key=2;robled2=1;break;}
		if(robkey3==0){key=3;robled3=1;break;}
		if(robkey4==0){key=4;robled4=1;break;}
		if(startkey==0){
				delay_ms(2);
				if(startkey==0){key=0;break;}
				}
		}
	//if(key==0){
	//	for(;;){
	//	if(startkey==1){delay_ms(1);if(startkey==1)break;}
	//	delay_ms(1);
	//	}
	//  }
	//if(key!=0)speaker=1;
	return(key);  
   }
///////////////////
void dispsub(void){
	P2_0=1;
	P2_2=1;
	alarm();
	delay_10us(10);
	for(;;){
		speaker=0;
		//switch(k){
		//	case 1:robled1=1;break;
		//	case 2:robled2=1;break;
		//	case 3:robled3=1;break;
		//	case 4:robled4=1;break;
		//	default: break;
		//	}
		if(startkey==0){
				delay_ms(2);
				if(startkey==0)break;
				}
		}
	//for(;;){
	//	if(startkey==1){delay_ms(1);if(startkey==1)break;}
	//	delay_ms(1);
	//	}
	P3=0x0;
	P1_5=0;
	P1_7=0;
	}
	
 
///////////////////

void delay_10us(unsigned char delayvalue){
	
	while(--delayvalue!=0){
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		continue;
		}
	}
//////////////////////////12Mhz
void delay_ms(unsigned int delayvalue){
	unsigned int i,j;
	for(i=0;i<delayvalue;i++)
		for(j=0;j<123;j++);
	}
////////////////////////////////
void alarm(void){
  		unsigned long n;
        unsigned char i,j=0;

        unsigned char  code jie8[8]={12,14,16,17,19,21,23,24};//1234567`1八个音符在频率表中的位置
        unsigned char  code Led[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

        TMOD = 0x01;  //使用定时器0的16位工作模式
        TR0 = 1;
        ET0 = 1;
        EA = 1;

        
        
                 for(i=7;i<8;i++)        //循环播放8个音符
                 {
                         P0=Led[j];
                        j++;
                        if(j==8)
                          j=0;
                        tl0_f=freq[jie8[i]*2];          //置一个音符的值
                        th0_f=freq[jie8[i]*2+1];
                         for(n=0;n<15000;n++);        //延时1秒左右
                        
                 }
        speaker=0;
		EA = 0;
	 	TR0 = 0;
        ET0 = 0;
        
   }
/*
void alarm(void){
	signed char i,j;
	signed stone;
	//stone=
	for(i=1;i<10;i++){
		for(j=1;j<20;j++){
			speaker=0;
			delay_10us(i*30);
			speaker=1;
			delay_10us((50-i)*30);
			}
			delay_ms(j);
		  }
		 
	 }

*/

⌨️ 快捷键说明

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