• 大小: 9KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: 其他
  • 标签: asasas  

资源简介

这里是马达测试单片机程序,测试马达转的频率。并且用数码管显示

资源截图

代码片段和文件信息

#include 	//最新程序
#define uchar unsigned char
#define uint unsigned int

//变量定义区
/*定义数码管显示字符跟数字的对应数组关系*/
uchar code table[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}; //数码管显示编码(0-9)
uint  pulse_num; //马达脉冲个数计数
uchar NG_flag; //如果NG了就将此标志位置1表示检测马达脉冲NG==============
uchar OK_flag; //如果OK了就将此标志位置1表示检测马达脉冲OK==============           
uchar over; //100ms时间一旦到达表示检测结束此时就将此标志位置1
uint num_Hnum_L; //高电平时间计数和低电平时间计数值
uchar num; //测试总时间计数值
uchar flag_H; //表示脉冲高电平计时标志位
uchar flag_L; //表示脉冲低电平计时标志位
uchar flag1; //表示执行完第一个完整周期之后就会将此标志位置1以后每一个上升沿就会又将此标志位清0
uchar only_flag; //表示只执行一次
uchar only_flag2;
uchar test_time_flag; //总的检测时间,如果总的检测时间
uint flag3; //如果一直是低那么久跳出第一个while
uchar cycle_time; //定义存储周期时间长度
uchar date[5]; //用于发送给串口的 
//uchar ab;
uchar flag5;


//端口位声明
sbit dula=P2^6; //数码管段选端
sbit wela=P2^7; //数码管位选端

sbit start=P2^0; //接收开始测试信号 P2^0
sbit motor_pulse=P2^1; //马达脉冲信号接收端   P2^1

sbit result=P1^3; //测试结果输出 0表示输出PASS 1表示输出NG  P1^3

sbit led_OK=P1^7;
sbit led_NG=P1^0;




//子函数声明
void delay_50ms(uint); //50ms延时函数声明
void delay_50us(uint); //50us延时函数声明
void display(uint); //显示子函数声明
void pulse_catch(void); //脉冲捕捉函数
//void com_port_init(void);
//void send(uint);

//定时器0初始化子函数
void time0_init()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256; //50ms定时
TL0=(65536-50000)%256;
}


//主函数
void main()
{
time0_init(); //执行定时器0初始化函数
//com_port_init();
while(1)
{
   pulse_catch(); //执行脉冲捕捉函数
   if(flag5==0)                 //test_time_flag==1
   display(pulse_num);  //执行显示子函数
}
}

//脉冲捕捉子函数==============================================================
void pulse_catch(void)
{
if(start==0) //一旦接受到开始检测马达信号时,就准备开始测试马达有没转****************************
{
//强制设定检测是由第一个上升沿开始检测-----------------------------------------------------------
if((motor_pulse==0)&&(only_flag==0)) //当开始检测时从一个周期的上升沿开始************************************************
{
pulse_num=0; //将上一次测试的脉冲数结果清0
only_flag=1; //一旦该标志位置1就表示一个周期的运行已经开始
pulse_num=0;
while((!motor_pulse)&&(flag3<1000))      //首先等待第一次高电平
{
delay_50us(1);      //如果50ms时间一直为低的话那么就是NG
if((motor_pulse==0)&&(flag3<1000)) //每延时50us判断1次看有没高电平出现
{
flag3++;
}
}
if(flag3>900) //如果flag3大于900那么久表示马达没转为NG的
{
NG_flag=1; //NG标志位置1表示NG的
flag3=0; //方便下一次测试用
led_NG=0;
led_OK=1;
result=1; //输出NG信号  灭第4个led
}
}
else
if((motor_pulse==1)&&(only_flag2==0)) //如果一直是高电平******************************************************************
{  flag5=1;
pulse_num=0; //将上一次测试的脉冲数结果清0
only_flag2=1; //一旦该标志位置1就表示一个周期的运行已经开始
while((motor_pulse)&&(flag3<1000))      //首先等待第一次高电平
{
delay_50us(1);      //如果50ms时间一直为低的话那么就是NG
if((motor_pulse==1)&&(flag3<1000)) //每延时50us判断1次看有没高电平出现
{
flag3++;
}
}

评论

共有 条评论

相关资源