📄 edit1.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 + -