关于 51单片机 12C5A60S2 AD转换输出电压值通过运算公式显示的问题 100
部分程序如下voidtimer0()interrupt1//interrupt1:定时器0,interrupt3:定时器3{TH0=(65536-20000)/256;/...
部分程序如下
void timer0() interrupt 1 //interrupt 1: 定时器0,interrupt3:定时器3
{
TH0=(65536-20000)/256; //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)
TL0=(65536-20000)%256; //低八位
InitADC();
}
void adc_isr() interrupt 5 //FLAG标志位置位触发中断,没有设优先级,但是同优先级下定时器0更高
{
if(ADC_Chanul_Turn%3==0) //外部基准电压
{
da1=ADC_RES; //获取转换结果
Data=((double)da1/256)*5; //取八位计算基准电压Data,
c =Data;
cos = 0.052*c + 1.0069-0.653*c*c ;//16 角度
sin = 1.1233*c - 0.080;
flag1=1; // LCD_Write_String(0,0,a);
}
if(ADC_Chanul_Turn%3==1)
{
da2=ADC_RES; //获取转换结果
Data=((double)da2/256)*5; //取八位计算实际值Data,
c =Data;
d1= 1141*c*c - 2961*c + 2698-149.1*c*c*c;// 17 一号红外
flag2=1; // LCD_Write_String(5,0,a);
}
if(ADC_Chanul_Turn%3==2)
{
da3=ADC_RES; //获取转换结果
Data=((double)da3/256)*5; //取八位计算实际值Data,
c =Data;
d2 = 1210*c*c - 3121*c + 2823-159.1*c*c*c; // 14 二号红外
flag3=1; //LCD_Write_String(0,1,a);
}
if(flag1==1&&flag2==1&&flag3==1){
L=sqrt((d1*sin+5)*(d1*sin+5)+(d1*cos-d2)*(d1*cos-d2));
a[2]=((int)L%10+0x30); //0x30: ASCAI码里代表“0”,必须转换成字符存在字符型数组里才可以在1602液晶屏上显 a[1]= ((int)(L)%100/10+0x30); // 十分位
a[0]=((int)(L)/100+0x30);// 百分位
a[3]='\0'; // 加了串尾符才成了字符串哦
LCD_Write_String(0,0,a);
flag1=0;
flag2=0;
flag3=0; }
ADC_CONTR&=0xEF; //标志位清零
ADC_Chanul_Turn++;
if(ADC_Chanul_Turn==252)
ADC_Chanul_Turn=0;
}
void main()
{
LCD_Init();
LCD_Clear(); //清屏
DelayMs(255);
TH0=(65536-20000)/256; //开定时器0
TL0=(65536-20000)%256;
EA=1; //开全局中断
ET0=1; //允许定时器零中断
EADC=1; //允许ADC中断
TR0=1;
while(1);
} 展开
void timer0() interrupt 1 //interrupt 1: 定时器0,interrupt3:定时器3
{
TH0=(65536-20000)/256; //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)
TL0=(65536-20000)%256; //低八位
InitADC();
}
void adc_isr() interrupt 5 //FLAG标志位置位触发中断,没有设优先级,但是同优先级下定时器0更高
{
if(ADC_Chanul_Turn%3==0) //外部基准电压
{
da1=ADC_RES; //获取转换结果
Data=((double)da1/256)*5; //取八位计算基准电压Data,
c =Data;
cos = 0.052*c + 1.0069-0.653*c*c ;//16 角度
sin = 1.1233*c - 0.080;
flag1=1; // LCD_Write_String(0,0,a);
}
if(ADC_Chanul_Turn%3==1)
{
da2=ADC_RES; //获取转换结果
Data=((double)da2/256)*5; //取八位计算实际值Data,
c =Data;
d1= 1141*c*c - 2961*c + 2698-149.1*c*c*c;// 17 一号红外
flag2=1; // LCD_Write_String(5,0,a);
}
if(ADC_Chanul_Turn%3==2)
{
da3=ADC_RES; //获取转换结果
Data=((double)da3/256)*5; //取八位计算实际值Data,
c =Data;
d2 = 1210*c*c - 3121*c + 2823-159.1*c*c*c; // 14 二号红外
flag3=1; //LCD_Write_String(0,1,a);
}
if(flag1==1&&flag2==1&&flag3==1){
L=sqrt((d1*sin+5)*(d1*sin+5)+(d1*cos-d2)*(d1*cos-d2));
a[2]=((int)L%10+0x30); //0x30: ASCAI码里代表“0”,必须转换成字符存在字符型数组里才可以在1602液晶屏上显 a[1]= ((int)(L)%100/10+0x30); // 十分位
a[0]=((int)(L)/100+0x30);// 百分位
a[3]='\0'; // 加了串尾符才成了字符串哦
LCD_Write_String(0,0,a);
flag1=0;
flag2=0;
flag3=0; }
ADC_CONTR&=0xEF; //标志位清零
ADC_Chanul_Turn++;
if(ADC_Chanul_Turn==252)
ADC_Chanul_Turn=0;
}
void main()
{
LCD_Init();
LCD_Clear(); //清屏
DelayMs(255);
TH0=(65536-20000)/256; //开定时器0
TL0=(65536-20000)%256;
EA=1; //开全局中断
ET0=1; //允许定时器零中断
EADC=1; //允许ADC中断
TR0=1;
while(1);
} 展开
2个回答
展开全部
你的问题是什么呢?
追问
显示不对 只显示一位 还很闪 sin值是0.2左右,cos值是1左右,d1是0到50,d2是0到50,L是0到100;
追答
看看这个对你有没有帮助http://www.51hei.com/mcu/4330.html,请问你的问题解决了吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询