📄 sourse__.c
字号:
#include <90s2313.h>
#include <math.h>
#include <delay.h>
void volage_light(void); /* MADE (LED) TRUE*/
void init_system(void);
void UART_INIT();
void SendIntoUp(unsigned char abc); //发送到上位机器
int int_diff(unsigned int first,unsigned int second);
long int comp();
void get_count(unsigned char mode);
/*mode=0 ->Get Base Freq mode=1 -->Get CaiYang Freq*/
unsigned int base_count,caiyang_count,inter_count;
unsigned char base_times,caiyang_times,inter_times;
unsigned int diff[8]={200,400,600,800,1000,1200,1400,1600};
void main(void)
{
long int comp_result=0;
long int MaxZeroMove=0; //在自学阶段记录出最大的零漂值
volage_light(); //made sourse LED ture
init_system(); //system init
delay_ms(1);
SendIntoUp(2);
get_count(0); //get base_*(count,times)
while(1)
{
get_count(1); //get caiyang_*(count,times)
comp_result=comp();
while(comp_result--) {PORTD.2=0;}PORTD.2=1;
if(comp_result>=diff[PIND&0x07])
{PORTD.0=1; //信号指示灯有效
} //输出正常的驱动电平
else
{PORTD.0=2;
MaxZeroMove=0;
}
}
}
long int comp()
{
char diff_times; //caiyang_times-base_times
long int comp_result=0; //caiyang_MU-base_MU
/***********OLD comp() start!!**************/
diff_times=caiyang_times-base_times;
if(diff_times>=0)
{ for(;diff_times>0;diff_times--)
{comp_result+=0xfffe;}
comp_result=comp_result+int_diff(caiyang_count,base_count);
}
else
{
for(;diff_times<0;diff_times++) comp_result+=0xfffe;
comp_result=int_diff(caiyang_count,base_count)-comp_result;
}
return labs(comp_result);
}
int int_diff(unsigned int first,unsigned int second)
{int abc;abc=first-second;return abc;}
void get_count(unsigned char mode)
{
/*T0-->time T1-->count*/
unsigned int round;
inter_times=0;
TCNT0=55;
TCNT1=0; /***Here will change into init_value**/
TCCR0=0X01; //启动定时器20MS
TCCR1B=0X07; //启动外部计数器 T1
for(round=0;round<400;round++)//200*0.25us *400 =20ms*/
{
while((TIFR&0X02)!=0X02)
{
if((TIFR&0x80)==0x80) //Count interrupt
{TIFR|=0X80; //Cls T1 flag
TCNT1=0;
inter_times++; }
}
TIFR|=0X02; //cls T0 flag
TCNT0=55; //T0 =Init Value
}
TCCR0=0X0; //停止定时器 T0
TCCR1B=0X0; //停止外部计数器 T1
/*T0 as a timer finish ,now read TCNTH1~~~TCHTL1*/
inter_count=TCNT1;
if(mode==0) //save into base_*
{base_times=inter_times;
base_count=inter_count;
//send_out(base_times); send_out(0xa0);
//send_out(TCNT1L);send_out(0xa1);
//send_out(TCNT1H);send_out(0xa2);
}
else if(mode==1) // save into CaiYang_*
{caiyang_times=inter_times;
caiyang_count=inter_count;
//send_out(caiyang_times); send_out(0xb0);
// send_out(TCNT1L);send_out(0xb1);
// send_out(TCNT1H);send_out(0xb2);
}
}
void volage_light(void)
{DDRB.7=1; PORTB.7=0; //加电工作指示灯
DDRD.2=1;PORTD.2=0; //自学指示灯 INT1脚为0--->自学功能
DDRB.6=1;PORTB.6=0; //检测到信号指示灯
DDRD.6=1;PORTD.2=1; //检测到信号给出真正的驱动电平脚(输出)
}
void init_system(void)
{#asm("cli");
UART_INIT();
}
void UART_INIT()
{UBRR=25; //4M ----9600 BIT/S
UCR=0X18;
DDRD.1=1;
DDRD.0=0;//OUT ,TXD
}
void SendIntoUp(unsigned char abc)
{ // 将数据发送到上位观察
UDR=abc;
while((USR&0X40)!=0X40);
USR=USR|0X40;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -