📄 main.c
字号:
//*********************************************//
//****main.c***********************************//
//*****sanxianv1.0********************************//
//*****testencode,*******************************//
//*****testlcd, ********************************//
//*****testkey?
//***2005.10.11********************************//
//*********************************************//
#include <math.h>
#include <absacc.h>
#include <string.h>
//#include <lcd_c51.h>
#include <intrins.h>
#include <sanxian.h>
#define M 1607695
/* 常数定义 */
//#define para1 0x10; //文本图形显示区域宽度
/* 定义标志位 */
//void lcddisp();
void delay(unsigned char); //延时8+6N个周期
void delay40n(unsigned int);
unsigned long counter();
void calculate(unsigned long);
unsigned long maxest();
void autoup();
void lcddisp();
//void key_func();
//uchar keypro();
//uchar key_test();
void clr_counter();
//位口线定义{
sbit b_qubai = P3^3;//P2^2; //取摆输出
sbit b_tuixiao = P2^2; //退销输出
sbit b_impact = P2^4; //冲击输出
sbit b_fangbai = P2^3; //放摆输出
sbit b_squp = P2^5; //取摆到位信号输入
sbit b_sqxiao = P2^6; //退销到位信号输入
sbit P_T0 = P3^4;
sbit P_T1 = P3^5;
//位口线定义}
//变量定义{
uchar O_X,O_Y;
uchar n_cycle; //计数器满的次数:即相对移动超过计数满量程的次数;无符号数
uint idata sample_no;
uint n_xshnl,n_chjrx; //应定义为全局变量//此处最好不要定义为全局变量,内存要不够!!
uint shiceangle; //实测预扬角
ulong idata n_liju,n_nlxzh; //力矩,能量修正值
unsigned long num_encode , maxer_encode ; //编码器的值,编码器计数的较大的值;
bit n_cycle_flag; //n_cycle的正负号标识,"0"为正,"1"为负;
bit num_encode_flag; //编码器所计数的符号;"0"为正,"1"为负;
bit k_fangbai=1; //放摆输入按键
bit b_level; //big 0 little 1
bit b_print_auto;
bit b_qubai_flag;
//bit b_disp_once;
bit b_firstinleft , b_do_once ; //第一次检到进入左侧为"1"时第一次检出;只执行一次,为"0"且在左侧时执行;
//bit b_autoprint; //是否自动打印,是则为1,否
uchar idata key_number,keypro_rtn;
float idata temp;
unsigned long maxest_encode;
unsigned long num1=0,encode_num;
/***************************/
/* 演示主程序 14m */
/***************************/
main()
{
// uchar i;
b_qubai = 0; //取摆输出
b_tuixiao = 0; //退销输出
b_impact = 0; //冲击输出
b_fangbai=0;
//********************************************************************
//定时器设置
//********************************************************************
TMOD=0X55;//0X01; T0T1用作16位计数器 //定时器0方式1
TH0=0x0;//(65536-9216)/256; //预置计数初值
TL0=0x0;//(65536-9216)%256;
TH1=0x0;
TL1=0x0;
P_T0=1;
P_T1=1;
ET1=1; //开T1中断
ET0=1; //开T/C0中断
TR0=1; //启动T/C0
TR1=1; //启动T0
EA=1; //开CPU中断
delay40n(0xffff);
delay40n(0xffff);
initilcd();
//*******************************************************************e
//显示模块初始化
//********************************************************************
// INT_1(); /* 初始化函数 */
// CLEAR(); /* 清屏函数 */
//lcddisp(); //显示液晶屏上固定的文字
temp = cos(((float)(shiceangle))/100.0*3.14159/180.0);
while(1)
{
sb_cont244 = 0;
sb_test = !sb_test;
// delay40n(0xfff);
// sb_cont244 = 1;
lcddisp();
delay40n(0x8fff);
if (k_fangbai==0)
{
if(num_encode<80)
{
b_fangbai = 0;
k_fangbai=1;
}
}
// keypro();
if(num_encode_flag==0)
{
maxest();
}
// key_func();
autoup();
if(1==num_encode_flag)
{
b_firstinleft = 0;
b_do_once = 0;
}
}
}
//------------------------//
//----取摆函数-------------//
//------------------------//
void qubai()
{
b_qubai=1;
delay40n(0xfff);
b_qubai=0;
}
/*
//----------------------//
//----退销函数-----------//
//----------------------//
void tuixiao()
{
b_tuixiao=1;
delay40n(0xfff);
b_tuixiao=0;
}
//-----------------------//
//----冲击函数------------//
//-----------------------//
void impact()
{
//在此处预置实测预扬角
if(b_squp)
{
clr_counter();
TH1 = 0xd;
TL1 = 0X06;
sample_no++;
}
/////
b_impact=1;
delay40n(0x3fff);
b_impact=0;
b_qubai_flag = 1;
}
//-----------------------------//
//-----放摆函数-----------------//
//-----------------------------//
void fangbai()
{
b_fangbai=1;
b_qubai_flag = 1;
}
*/
//--------------------------------------------------------------------//
//--处理计数函数:即编码器的实际计数--------------------------------------//
//--返回值为编码器所计的当前无符号数,符号在num_encode_flag中0时为正,1时为负---//
//----------------------------------------------------------------------//
unsigned long counter()
{
unsigned long num_encode;//编码器的脉冲数
unsigned int n_t0,n_t1; //t0和t1计数器里的值
unsigned char n_th0,n_tl0,n_th1,n_tl1; //t0和t1各自高低字节内的值
do
{
n_th0 = TH0;
n_th1 = TH1;
n_tl0 = TL0;
n_tl1 = TL1;
}
while((n_th0 != TH0)||(n_th1 != TH1)); //采集t0和t1的高低字节的值
n_t0 = n_th0*256 + n_tl0;
n_t1 = n_th1*256 + n_tl1;
if(n_cycle == 0) //超过满量程的次数为0
{
if(n_t0 >= n_t1) //如果t0的值大于t1的值;
{
num_encode = n_t0 - n_t1;
num_encode_flag = 0; //符号为正
}
else //如果t0的值小于t1的值;
{
num_encode = n_t1 - n_t0;
num_encode_flag = 1; //符号为负;
}
}
else //如果超过满量程的次数不为0
{
if(n_cycle_flag==0)
{
num_encode = 65536*n_cycle + n_t0 - n_t1;
}
else
{
num_encode = 65536*n_cycle - n_t0 + n_t1;
}
num_encode_flag = n_cycle_flag;
}
return(num_encode); //返回值为编码器所计的当前无符号数,符号在num_encode_flag中;
}
//--------------------------------------------//
//----计算能量值及冲击韧性-----------------------//
//----当前脉冲下的角度能量和韧性值---------------
//-------------------------------------------//
void calculate(unsigned long num_encode) //取摆后角度为负值 unsigned long
{
bit b_cy; //判断是否进住,以进行四舍五入运算
unsigned long ul_angleb;
ul_angleb = num_encode * 360; //4位小数,2500线编码器,4倍频
n_xshnl = ( uint ) ((float) n_liju * ( cos( ( float )( ul_angleb )* 3.14159/10000.0/180.0)+0.866)/100.0);//吸收能量有两位小数
//b_cy = n_xshnl % 2; //此处的四舍五入方法不对,要注意!!!!
n_xshnl = n_xshnl-(uint)(n_nlxzh*(ul_angleb/100/150+50)/100) ;
if( _testbit_ ( b_cy ) )
n_xshnl ++;
n_chjrx = n_xshnl / 8*10; //s
}
//------------------------------------------------//
//-------------求出冲后到达的最大值------------------//
//------------------------------------------------//
unsigned long maxest()
{
num_encode = counter();
if( 0==num_encode_flag)
{
if(0==b_do_once)
{
maxer_encode = 0;
b_do_once = 1;
}
if(num_encode > maxer_encode)
{
maxer_encode = num_encode;
maxest_encode = maxer_encode;
calculate(maxer_encode);
}
}
return(maxer_encode);
}
//---------------------------------------//
//----------自动扬摆----------------------//
//---------------------------------------//
void autoup()
{
num_encode = counter();
if(num_encode>300)
{
if(num_encode_flag==1)
{
if(counter()>num_encode)
{
if(num_encode>=maxest_encode-200)
{
if(b_qubai_flag)
{
qubai();
b_qubai_flag = 0;
}
}
}
}
}
}
//------------------------------------------------//
//----------------编码器计数------------------------//
//------------------------------------------------//
timer0()interrupt 1 using 1 //+计数//
{
TH0 = 0x0;
TL0 = 0x0;
ET0 =1;
TR0=1;
P_T0=1;
if(n_cycle_flag == 0) //如果符号为正
{
n_cycle++;
}
else if(n_cycle_flag == 1) //如果符号为负
{
n_cycle--;
if(n_cycle == 0)
{
n_cycle_flag = 0;
}
}
}
//--------------------------------//
//-------编码器计数----------------//
//--------------------------------//
timer1() interrupt 3 using 2 //-计数
{
TH1 = 0x0;
TL1 = 0x0;
ET0 = 1;
TR0 = 1;
P_T1 = 1;
if( n_cycle_flag == 0 )
{
if( n_cycle == 0 )
{
n_cycle ++ ;
n_cycle_flag = 1 ;
}
else
n_cycle -- ;
}
else if(n_cycle_flag == 1) //就加入ELSE否则计数不对
{
n_cycle++ ;
}
}
//------------------------------------------------//
//----------------clr_counter()-------------------//
//----------------清零----------------------------//
//------------------------------------------------//
void clr_counter()
{
n_cycle = 0 ;
num_encode_flag = 0 ; //符号为正
TH0 = 0x0 ; //(65536-9216)/256; //预置计数初值
TL0 = 0x0 ; //(65536-9216)%256;
TH1 = 0x0 ;
TL1 = 0x0 ;
num1 = 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -