原创 【博客大赛】手把手教你写电子打奶器软件程序(二)-定时器和AD模块

2016-4-25 23:18 1482 17 17 分类: MCU/ 嵌入式

一、定时器模块程序:

由于中颖单片机也是51内核的单片机,因此对于学校学习过中颖单片机的小伙伴来说,用起来是毫无压力的。所以,datasheet上的东西就不细说了,直接贴上初始化代码吧。

/**********************************************************************

          名    称:init_timer1

         功    能:初始化定时器

         参    数:无

        返    回:无

        说    明:中颖SH79F084A系统时钟16.6MHz,2ms定时中断初值

        为0XF531。                                                                      

*****************************************************************************/

void init_timer1(void)

{

       TMOD |= 0x10;//定时器1工作在方式1

       TL1 = 0x31;

       TH1 = 0xf5;

       TF1 = 0;//清楚定时中断

       ET1 = 1;//使能定时器1中断

       TR1 = 1;//开启定时器1

}

定时器中断函数源代码如下:

/******************************************************************************

名    称:timer1_isr

功    能:定时器1中断处理

参    数:无

返    回:无                                                                          

*********************************************************************************/

void timer1_isr(void) interrupt 3

   {

       TL1 = 0x31;

       TH1 = 0xf5;

}

以上完成了定时器模块的程序编写,有了2ms的定时最小时基,那么接下来的所有定时工作,都可以在这个基础上完成了,很简单吧!( ^_^ )

二、NTC温度采集模块软件程序:

整个系统的温度控制是通过单片机AD口采集NTC热敏电阻和10K精密电阻的分压值转化成温度的,进而控制所需的奶温,中颖单片机的AD为10位。

20160425231053715.jpg

如上图所示,根据AD转换原理,有如下公式:

(AD/1024)*Ref = 5*10/(10 + Rntc),由于中颖单片机采用内部参考电压VDD,因此Ref = 5,所以根据上式可以算出单片机所采集到的AD值,公式中Rntc可以根据NTC规格书的阻值表查询到。因此我们可以根据每个温度值对应的阻值计算出该温度所对应的AD值,将所有的温度AD值计算出来,然后建立一个表到单片机里面,从而可以得知此时的奶温。下面贴出源代码:

  1. AD初始化代码:

/******************************************************************************

名    称:init_ADC

功    能:初始化ADC

参    数:无

返    回:无                                                                          

*********************************************************************************/

void init_ADC(void)

{

       ADCH |= (1 << 6 | 1 <<6);//规格书Datasheet有说明,请大家查阅//附件规格书的AD部分相关寄存器,此基础器是将相关IO口配置为AD功能

       ADT = 0x0f|0xe0;//设置ADC的时钟周期和采样时间

       ADCON |= 0x80;//使能ADC功能

}

  1. 、获取AD值函数:

/******************************************************************************

名    称:get_ADC_val

功    能:获得ADC 转换结果

参    数:需要采集的ADC通道

返    回:返回获取到的AD值                                                                          

*********************************************************************************/

u16 get_ADC_val(u8 ADC_channel)

{

  u16 ADC_val = 0;

 

  ADCON &= ~(7 << 1);//清楚ADC通道

  ADCON |= ADC_channel << 1;//将需要采集的ADC通道通过参数传入

 

  ADCON |= 0x01;//开始ADC转换

 

  while (ADCON & 0x01);//等待ADC转换完成

 

  ADC_val = ((ADDH << 2) | (ADDL & 0x03));//获取转换的AD值

 

  return ADC_val;//返回采集到的AD值

}

好了,今天就先写到这里了,有了定时器模块和AD模块,再把按键框架程序写好后,基本的程序框架就已经完成了,上层的应用功能就是通过调用这些底层的函数来实现了。下一讲我们会讲怎样通过转换出的AD值来得到实际的温度,并且根据定时器的最小时基2ms来进行一些滤波处理,有什么问题,欢迎来信探讨,兄弟们晚安!

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条