資源簡介
這里是馬達測試單片機程序,測試馬達轉的頻率。并且用數碼管顯示
代碼片段和文件信息
#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++;
}
}
評論
共有 條評論