中级会员
 
- 积分
- 223
- 金钱
- 223
- 注册时间
- 2013-4-14
- 在线时间
- 24 小时
|

楼主 |
发表于 2013-5-4 15:53:19
|
显示全部楼层
回复【4楼】正点原子:
---------------------------------
#include "timer.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001) //溢出中断
{
u16 adc8; //用来保存ADC的通道8的值
u16 adc10; //用来保存ADC的通道10的值
u16 adc11; //用来保存ADC的通道11的值
u16 adc12; //用来保存ADC的通道12的值
u16 adc13; //用来保存ADC的通道13的值
float temp13,temp12,temp11,temp10,temp8;
u8 table[]={adc13,temp13,adc12,temp12,adc8,temp8,adc11,temp11,adc10,temp10};
//此数组用来保存按键key0的选择值!!!后续要改
u8 k1=1; //用来保存按键key1按了多少次
u8 k0=0; //用来保存按键key0按了多少次
u16 num=1; //当c=25则进入采集adc数据的程序
u8 t; //用来保存键值
u8 able=0; //用来判断键值
t=KEY_Scan(); //得到键值
u8 lv=0; //用来标记是否进行Lvbo程序
if(t)
{
switch(t)
{
case 1:
if(able=1) //表示进入''key0按下''数值调节模式
{
k0++;
}
break;
case 2:
if(able=1) //表示进入''key2按下''选位调节模式
{
k1++;
u8 k1data;
if(k1<=5)
{
k1data=44+8*k1; //表示位的地址
LCD_ShowNum(k1data,150," ",1,16)
}
if(k1>5)
{
k1data=44+8*(k1-5); //表示位的地址
LCD_ShowNum(k1data,170," ",1,16)
}
}
break;
case 3: //设定able以便确定wk-up是否按下
able++;
break;
}
if(able>=2) able=0;
if(k1>10) k1=1;
if(k0>9) k0=0;
}
if(num==5)
{
lv++;
adc13+=Get_Adc(13); //获得ADC通道13的值并储存在adc13中,准备滤波(下同)
adc12+=Get_Adc(12); //获得ADC通道12的值
adc8+=Get_Adc(8); //获得ADC通道8的值
adc11+=Get_Adc(11); //获得ADC通道11的值
adc10+=Get_Adc(10); //获得ADC通道10的值
if(lv=5)
{
adc13=adc13/5; //取得5次采集的平均数(下同)
temp13=(float)adc13*(3.3/4096);
temp13=(500/3.3)*temp13; //转换成液位高度
adc13=temp13; //将整数部分赋给adc13,因为adc是u8类型
LCD_ShowNum(140,30,adc13,3,16); //显示下水箱水位值(第70行)的整数部分
temp13-=(u8)temp13; //减掉整数部分
LCD_ShowNum(172,30,temp13*10,1,16); //显示下水箱水位值(第70行)的小数部分
adc12=adc12/5;
temp12=(float)adc13*(500/4096); //直接转换成液位高度
adc12=temp12; //将整数部分赋给adc12
LCD_ShowNum(140,50,adc12,4,16); //显示上水箱水位整数值(第110行)
temp12-=(u8)temp12; //减掉整数部分
LCD_ShowNum(172,50,temp12*10,1,16); //显示上水箱水位值的小数部分(第70行)
adc8=adc8/5;
temp8=(float)adc8*(80/4096); //直接转换成压力值
adc8=temp8; //将整数部分赋给adc8
LCD_ShowNum(148,70,adc8,2,16); //显示压力传感器的整数部分值(第150行)
temp8-=(u8)temp8; //减掉整数部分
LCD_ShowNum(172,70,temp8*100,2,16); //显示小数部分(第150行)
adc11=adc11/5;
temp11=(float)adc11*(120/4096); //直接转换成下管道流速值
adc11=temp11; //将整数部分赋给adc11
LCD_ShowNum(124,90,adc11,3,16); //显示下水管流速的整数部分值(第190行)
temp11-=(u8)temp11; //减掉整数部分
LCD_ShowNum(156,90,temp11*10,1,16); //显示下水管流速的小数部分(第190行)
adc10=adc10/5;
temp10=(float)adc10*(120/4096); //直接转换成上道流速值
adc10=temp10; //将整数部分赋给adc10
LCD_ShowNum(124,110,adc10,3,16); //显示上水管流速值(第230行)
temp10-=(u8)temp10; //减掉整数部分
LCD_ShowNum(156,110,temp10*10,1,16); //显示下水管流速的小数部分(第230行)
adc8=adc10=adc11=adc12=adc13=0; //将adc的值清零,完成一次数字滤波显示
lv=0;
}
num=0; //将c赋值为0
}
}
TIM3->SR&=~(1<<0); //清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3-> SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
这是在终端服务函数里面的代码,目前写到这里了,就剩不知道怎么实现变色或者闪烁了 |
|