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

📄 edit1.c

📁 单片机编程
💻 C
字号:
#include <reg51.h>
sbit reset_count=P2^5;           //转速计数器复位控制位
sbit select1=P2^0;               //选择信号
sbit select2=P2^1;
sbit select3=P2^2;
sbit select4=P2^3;
sbit watchdog=P2^4;
sbit INT0_ctrl=P0^0;            //中断控制位
sbit INT1_ctrl=P0^1;
sbit RESET_oil=P0^2;			//脉宽测量计数器复位控制位
sbit RESET_speed=P0^3;
//sbit d1_flag=P0^2;
//sbit d2_flag=P0^3;
/*#define l_oilduty 0xf0;
#define h_oilduty 0xf1;
#define l_speedduty 0xf2;
#define h_speedduty 0xf3;
#define l_speedmotor 0xf4;
#define h_speedmotor 0xf5;
#define l_speedin 0xf6;
#define h_speedin 0xf7;
#define l_speedout 0xf8;
#define h_speedout 0xf9;*/
//#define Data_delay 0x10;
bit oilduty_flag;				//脉宽测量标志位,用来表示脉冲的开始还是结束
bit speedduty_flag;
bit INT0_flag;					//中断标志位,用来表示是否有过中断
bit INT1_flag;

//bit Comstart_flag=0;
//unsigned int num1=0;
unsigned char num=0;//,num1=0  //
unsigned char DATA1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//用来储存测量的数据
//struct
//{
//	unsigned char speed_flag : 1;
//	unsigned char speed_in_flag : 1;
//	unsigned char speed_out_flag : 1;
//	unsigned char BYTE_flag : 1;
//	unsigned char Comstart_flag : 1;
//	unsigned char turn_flag : 1;
//	unsigned char DATA_flag ;
//}flags;
//串口初始化
void Init_COMM()
{
	SCON = 0x50;

      	TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
   	PCON |= 0x80;       //SMOD=1;
    	TH1   = 0xFA;       //Baud:9600  fosc=11.0592MHz
    	IE   |= 0x90;       //Enable Serial Interrupt
    	TR1   = 1;          // timer 1 run
 /* 	PCON = 0x80 | PCON;
	T2CON=0x30;
	RCAP2H=0xFF;		//9600 @ 11.0592MHz: 11059200/(32*(65536-(RCAP2H,RCAP2L)))
	RCAP2L=0xDC;
	TR2=0;
	ES = 1;
	//EA=1;*/
}
//定时器0的初始化
void Init_T0()
{
	TMOD|=0x01;
	TH0=0x4c;		//50ms      65536-110592*5/12
	TL0=0x00;
	TR0= 1;
	EA=1;
	ET0=1;
}
//外部中断0的初始化
void Init_INT0()
{
	IT0=1;
	EX0=1;
	EA=1;
	PX0=1;
}
//外部中断1的初始化
void Init_INT1()
{
	IT1=1;
	EX1=1;
	EA=1;
	PX1=1;
}
//外部中断0的中断函数,判断是否是脉冲的结束,若是就读计数器值
void INT0_fun()interrupt 0
{
	if(oilduty_flag)
	{
		INT0_ctrl=0;
		select1=0;
		select2=0;
		select3=0;
		select4=0;
		DATA1[6]=P1;
		select1=1;
		select2=0;
		select3=0;
		select4=0;
		DATA1[7]=P1;
		oilduty_flag=0;
		RESET_oil=1;
		INT0_flag=1;
		EX0=0;
	}
	else
	{
		
		RESET_oil=0;
		INT0_ctrl=1;
		oilduty_flag=1;
	}
}
//外部中断1的中断函数,判断是否是脉冲的结束,若是就读计数器值
void INT1_fun()interrupt 2
{
	if(speedduty_flag)
	{
		INT1_ctrl=0;
		select1=0;
		select2=1;
		select3=0;
		select4=0;
		DATA1[8]=P1;
		select1=1;
		select2=1;
		select3=0;
		select4=0;
		DATA1[9]=P1;
		speedduty_flag=0;
		RESET_speed=1;
		INT1_flag=1;
		EX1=0;
	}
	else
	{
		RESET_speed=0;
		INT1_ctrl=1;
		speedduty_flag=1;
	}
}
void delay()
{
	unsigned int i=0;
	for(i=0;i<200;i++)
	{
		watchdog=1;
		watchdog=0;
	}
}

/*void Init_INT1()
{
	TMOD=0x9f&TMOD;
	TH1=0x00;
	TL1=0x00;
	TR1=0;
	//EA=1;
	ET1=0;
}*/
//void Com_fun()interrupt 4
//{
//}串口发送程序
void send_char_com(unsigned char ch)
{
     	SBUF=ch;
	 //P0=ch;
    	while(TI==0);
    	TI=0;
}
//定时半秒钟到,读计数器值
void read_data()
{
	EX0=0;
	EX1=0;
	select1=0;
	select2=0;
	select3=1;
	select4=0;
       // delay();
	DATA1[0]=P1;
      //  delay();
	select1=1;
	select2=0;
	select3=1;
	select4=0;
       // delay();
	DATA1[1]=P1;
      //  delay();
	select1=0;
	select2=1;
	select3=1;
	select4=0;
       // delay();
	DATA1[2]=P1;
      //  delay();
	select1=1;
	select2=1;
	select3=1;
	select4=0;
       // delay();
	DATA1[3]=P1;
       // delay();
	//d2_flag=1;
	//d1_flag=0;
	select1=0;
	select2=0;
	select3=0;
	select4=1;
       // delay();
	DATA1[4]=P1;
       // delay();
	//d2_flag=0;
	//d1_flag=1;
	select1=1;
	select2=0;
	select3=0;
	select4=1;
        //delay();
	DATA1[5]=P1;
	if(INT0_flag==0)
	{
		DATA1[6]=0x00;
		DATA1[7]=0x00;
	}
	if(INT1_flag==0)
	{
		DATA1[8]=0x00;
		DATA1[9]=0x00;
	}
	INT0_flag=0;
	INT1_flag=0;
	IE0=0;
	IE1=0;
	EX0=1;
	EX1=1;
       // delay();
	
	//d2_flag=1;
	//d1_flag=1;
}

void send_string_com()//unsigned char *str,unsigned int strlen)
{
    	unsigned int k=0;
	//num1++;
	//send_char_com(num1);
    	do
    	{

        	send_char_com(DATA1[k]);
        	k++;
    	} while(k < 10);
	//Comstart_flag=0;
}
void T0_fun ()interrupt 1
{
	TR0=0;
	TH0=0x4c;		//50ms      65536-110592*5/12
	TL0=0x00;
	TR0=1;
	num++;
	if(num==10)
	{
		//Comstart_flag=1;
		//reset_count=0;
		read_data();
		send_string_com();
		num=0;
	//	reset_count=1;
		//TR0=0;
	}
//	else

}


void main()
{
       // unsigned char *p;
	//unsigned int length;
	INT0_flag=0;
	INT1_flag=0;
	RESET_oil=1;
	RESET_speed=1;
	INT0_ctrl=0;
	INT1_ctrl=0;
	oilduty_flag=0;
	speedduty_flag=0;
	reset_count=1;
	
	reset_count=0;
	delay();
	Init_COMM();
	//Comstart_flag=0;
	Init_T0();
	Init_INT0();
	Init_INT1();
	watchdog=1;
	watchdog=0;
	//length=10;
        //p=DATA1;
	while(1)
	{
		watchdog=1;
		watchdog=0;
/*		if(INT0_flag==1)
		EX0=0;
		else
		EX0=1;
		if(INT1_flag==1)
		EX1=0;
		else
		EX1=1;*/
	//	if(Comstart_flag==1)
	//	{
	//		//TR1=1;
		//	Comstart_flag=0;
		//	send_string_com();
		//	TR1=0;
	//
		//	TR0=1;
		
	//	}
	}
}





⌨️ 快捷键说明

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