#include<STC12C5A60S2.h>
#include<intrins.h>
sbit key1 =P2^4; //打开激光
sbit key2 =P2^5; //关闭激光
sbit key3 =P2^6; //加电流
sbit key4 =P2^7; //减电流
char i=0;
unsigned int Ab=0; //设置电流的
/////////////////ADC控制////////////////////////
void AD_init();
void delay(unsigned char a);
float AD_work();
float benc0[30],temp;
unsigned int ADC_P;
/////////////////ADC控制/////////////////////
unsigned char table1[]={0xff,0x01,0x01,0x01,0x01,0x00,0x04}; //打开激光
unsigned char table2[]={0xff,0x01,0x01,0x01,0x00,0x00,0x03}; //关闭激光
unsigned char table3[]={0xff,0x01,0x01,0x02,0x00,0x00,0x04}; //加电流
unsigned char table4[]={0xff,0x01,0x01,0x05,0x2d,0xa0,0xd4}; //激光最小角度
void InitUART(void)
{
TMOD=0x21; //设置T0 T1 定时器为工作方式二 8位定时器计数器
SCON = 0x50; //串口1工作在方式1 10位异步收发 REN=1允许接收
IP = 0xF0;
IPH = 0xf0;
TR0=1; //启用T0定时器/计数器
PCON = 0x00;
TH1 = 0xF4; //定时器1初值 2400
TL1 = 0xF4;
TR1 = 1; //定时器1开始计数
EA = 1; //开总中断
// ES = 1; //开串口1中断
ES=0;
}
/****************串行口1发送****************/
void key_ALL()
{
if(key1==0)
{
while(!key1)
{}
ES=0;
for(i=0;i<7;i++)
{
//UART_1SendOneByte(table1[i]);
SBUF = table1[i];
while(!
ti); //若TI=0,在此数据等待发送结束
TI = 0;
}
}
if(key2==0)
{
while(!key2);
{}
for(i=0;i<7;i++)
{
SBUF = table2[i];
while(!TI); //若TI=0,在此数据等待发送结束
TI = 0;
}
}
}
void main()
{
InitUART();
AD_init();
while(1)
{
key_ALL();
if(key3==0)
{
while(!key3)
{}
Ab = Ab +5;
if(Ab>254)
{
Ab = 254;
}
table4[4] =Ab;
table4[6] =(5+Ab)%0x100;
for(i=0;i<7;i++)
{
SBUF = table3[i];
while(!TI); //若TI=0,在此数据等待发送结束
TI = 0;
}
}
}
if(key4==0)
{
while(!key4)
{}
for(i=0;i<7;i++)
{
SBUF = table4[i];
while(!TI); //若TI=0,在此数据等待发送结束
TI = 0;
}
}
}
// ADC_P =AD_work()*1000 ;
// if(ADC_P>2000)
// {
// for(i=0;i<7;i++)
// {
// SBUF = table3[i];
// while(!TI); //若TI=0,在此数据等待发送结束
// TI = 0;
// }
// }
// else
// {
// for(i=0;i<7;i++)
// {
// SBUF = table4[i];
// while(!TI); //若TI=0,在此数据等待发送结束
// TI = 0;
// }
// }
/*AD模块数据处理,加数据平滑处理*/
float AD_work()
{
float AD_val = 0; //定义处理后的数值AD_val为浮点数
unsigned char i;
unsigned char k;
for(i=0;i<30;i++) //在这块位置提
{
ADC_CONTR=0x88|0x00; //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&0x10)); //等待转换完成
ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0
benc0[i]=(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)
}
for(i=0;i<30;i++) //经典部分 数据排序
{
for(k=0;k<30-i;k++)
if( benc0[i]>benc0[i+1])
{
temp=benc0[i];benc0[i]=benc0[i+1];benc0[i+1]=temp;
}
}
AD_val=(benc0[14]+benc0[15]+benc0[16])/3;
AD_val=(AD_val*5)/1024; //AD的参考电压是
单片机上的5v,所以乘5即为实际电压值 2的10次方 1024
return AD_val;
}
/*AD模块初始化*/
void AD_init()
{
P1ASF =0x01; //P1.0口全部作为模拟功能AD使用
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80; //开启AD
电源
delay(3); //等待1ms,让AD电源稳定
}
void delay(unsigned char a_time) //延时约1ms
{
unsigned int i_time;
while (--a_time!=0)
//1T单片机i_time=600,若是12T单片机i_time=125
for(i_time=600;i_time>0;i_time--);
}
一周热门 更多>