tag 标签: 手把手

相关博文
  • 热度 20
    2016-4-27 16:17
    1509 次阅读|
    0 个评论
    一、 温度处理模块程序: 我们采用模块化编程风格,有利于管理项目工程,也更容易查找BUG,大家千万要形成一个好的代码风格,不要一个main.c文件从头写到尾,各种函数都在main.c里面,这样让人看起来烟花缭乱,程序出现BUG也不利于分析问题。因此,最好是每个模块建立一个.c文件和一个.h文件,这样其他模块通过调用该模块的头文件即可。建议大家有空多看看代码风格方面的帖子,会对大家有个好的帮助的。好了,废话不多说,进入正题吧。 1、首先,我们建立一个temperature.h和一个temperature.c文件,将temperature.c文件添加到项目keil工程,并且在temperature.c文件中包含temperature.h文件; 2、其次,由于我们这个模块是个温度处理模块,因此我们需要定义如下三个模块,以便其他模块使用本模块的变量。所以需要在temperature.c文件中定义如下三个变量;   u16 current_temperature = 0;//用来保存当前温度值 u16 current_AD = 0;//当前温度值对应的NTC的AD值 u16 next_temperature = 0;//上一次采样温度   定义了如上三个变量以后,我们需要在temperature.h文件中声明如上三个变量为外部变量,只有这样,其他模块才能使用temperature.c文件里面定义的变量,因此需要在temperature.h文件中增加如下三行代码。   extern u16 current_temperature; extern u16 current_AD; extern u16 next_temperature;   以上三个变量就是本模块定义的全局外部变量,剩下的一些其他变量就是本模块的静态变量了,只供本模块使用,接下来的工作就是要编写程序,将采集到的值赋值给以上三个全局外部变量了。   、根据第二篇帖子的原理,大家先把NTC阻值表里面,从0到100度对应的电阻值输入EXCEL表,然后把1024和10K电阻输入excel,利用EXCEL工具,可以快速的计算出每个温度对应的AD值,本项目将AD值扩大了10倍。通过计算,得出AD值表如下表: u16 code tab_AD_to_temperature )(tmp tab_AD_to_temperature )){                                        current_temperature = i * 10;//满足if条件,当前温度为i度,并//扩大10倍                                         current_temperature += (((tmp - tab_AD_to_temperature ) * 10) / (tab_AD_to_temperature - tab_AD_to_temperature ));                               }                      }                                           if (tmp tab_AD_to_temperature ){                               current_temperature = 0;                      }                        if (tmp = tab_AD_to_temperature ){                               current_temperature = TAB_TEMPERATURE_NUMBER * (u16)10;                      }                                                    ADC_sum = 0;                      ADC_count = 0;                      process_temperature_statu = 0;//处理完成返回状态0重新采集温度                      break;            default:                      process_temperature_statu = 0;                      break;          }   } 二、 NTC 故障处理部分代码: 由于功能规格书里面要求有NTC故障检测功能,因此我们还需要编写NTC故障报警处理程序。所以我们要新建check_self.h和check_self.c文件作为故障处理模块。由于要记录各种系统故障,所以我们需要在check_self.c文件中定义如下变量: u8 error_num = 0;//错误代码变量;0:正常;1:NTC故障;2:干烧故障;3:初始//奶温过高故障。 由于error_num变量需要供外部模块调用,因此需要在check_self.h头文件中声明为外部变量,方法和温度处理模块一样。 下面直接贴出NTC故障报警处理代码: /*************************************************************************************** 名    称:check_NTC 功    能:检查NTC 参    数:无 返    回:无                                                                           ***************************************************************************************/ void check_NTC(void) {   static u8 process_check_NTC_statu = 0;//静态变量,NTC故障处理状态变量   static u16 process_check_NTC_count = 0;//计时变量     process_check_NTC_count++;//计时变量自加,2ms自加一次   switch (process_check_NTC_statu){            case 0:                      if (process_check_NTC_count = 68){//延时,确保//AD采集完成                               process_check_NTC_count = 0;                               process_check_NTC_statu = 1;//跳到状态1处理                              }                      break;            case 1:                      if (current_AD = 3 || current_AD = 1021){//NTC开路或者短路故障检测,//当前AD值小于4或者大于1020,则判断NTC故障                               set_standy_statu();//恢复所有变量为初始值                               error_num = 1;                                 PIN_LED_BUBBLE_BLUE = 0;//蓝灯亮                               PIN_LED_BUBBLE_RED = 1;//红灯灭                                 process_check_NTC_count = 0;                               process_check_NTC_statu = 2;//跳到状态2处理                              }                      break;            case 2://只有断电才能恢复process_check_NTC_statu为0                      if (process_check_NTC_count = 250){//执行NTC故障报警,500ms翻     //转LED状态                               PIN_LED_BUBBLE_RED = !PIN_LED_BUBBLE_RED;                               PIN_LED_BUBBLE_BLUE = !PIN_LED_BUBBLE_BLUE;                                 process_check_NTC_count = 0;//清楚计时变量                        }                      break;            default:                      break;         }                 } 好了,相信大家看完源代码已经清楚了NTC采集温度的处理方法了,是不是觉得很简单啊。采集到了实际奶温后,上面的逻辑控制,温度控制程序就比较好写了。 大家有没有注意到使用switch-case语句编程很简单啊,这就是传说中所谓的状态机编程,状态机就是把一个任务切割成一个一个小的部分处理,小的处理完成了,综合起来就变成完整的功能了,而且使用状态机编程,程序结构清晰明了,容易找BUG。 下一讲我会讲按键逻辑部分代码,希望大家喜欢。 由于这里面不太好编辑文档,大家可以下载附件阅读。
  • 热度 17
    2016-4-25 23:18
    1482 次阅读|
    0 个评论
    一、 定时器模块程序: 由于中颖单片机也是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位。 如上图所示,根据AD转换原理,有如下公式: (AD/1024)*Ref = 5*10/(10 + Rntc),由于中颖单片机采用内部参考电压VDD,因此Ref = 5,所以根据上式可以算出单片机所采集到的AD值,公式中Rntc可以根据NTC规格书的阻值表查询到。因此我们可以根据每个温度值对应的阻值计算出该温度所对应的AD值,将所有的温度AD值计算出来,然后建立一个表到单片机里面,从而可以得知此时的奶温。下面贴出源代码: 、 AD 初始化代码: /****************************************************************************** 名    称:init_ADC 功    能:初始化ADC 参    数:无 返    回:无                                                                           *********************************************************************************/ void init_ADC(void) {        ADCH |= (1 6 | 1 6);//规格书Datasheet有说明,请大家查阅//附件规格书的AD部分相关寄存器,此基础器是将相关IO口配置为AD功能        ADT = 0x0f|0xe0;//设置ADC的时钟周期和采样时间        ADCON |= 0x80;//使能ADC功能 } 、获取 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来进行一些滤波处理,有什么问题,欢迎来信探讨,兄弟们晚安!
  • 热度 14
    2016-4-24 22:39
    1159 次阅读|
    0 个评论
         一、前言 大家好,从今天开始,我将连载电子打奶器的软件程序编写教程,尽可能的做到手把手的带你从零开始编写软件。有些初学者看到一份功能规格书后,会感到无从下手。那么我在这份连载教程里,带你一行一行的敲出电子打奶器的软件程序,让你学习怎么将功能规格书转化成实际的软件程序,本教程旨在帮助初学者尽快的进入到真正的产品开发中。好了,不多废话了,首先贴出该项目的功能规格书及原理图吧,有兴趣的同学可以试着先编写一下。 二、功能操作说明 1 、概要 冷态起泡 热态起泡 牛奶加热 最大的待机功率 0,5 W  在220V-240V AC 50/60 HZ 420-500W 2 、冷态起泡功能 允许牛奶最大容量:150 ml 起泡完成时间≤120s±10s (没有延时功能) 左键长按1次(2秒)为冷打奶。左指示灯显示篮色。再按一次左键关闭,(正在运行时,需更换功能时要先关闭正在运行的功能,否则操作无效);发热盘不发热,马达快速转动直到时间达到120±10s马达停止转动,电源开关LED灯熄灭,完成冷态起泡功能.起泡完成后把奶泡倒入500ml的容器,马上记录其比例,牛奶最多三分之一,泡沫至少三分之二。 3 、热态起泡功能 允许牛奶最大容量:150 ml 热态起泡完成时间≤150s(包含延时20s±3s) 起泡温度规格:67±5℃ 温度测试距离:感温线距离内胆底部6±1mm. 左键短按1次(=2秒)为热打奶。左指示灯显示红色。再按一次左键关闭,(正在运行时,需更换功能时要先关闭正在运行的功能,否则操作无效);发热盘发热,马达慢到快转速,直到发热盘停止发热,马达延时20s±3s停止转动之后温度达到67±5度时,电源开关LED灯熄灭,完成热态牛奶起泡功能 起泡完成后读取其牛奶温度数据是否符合规格要求,在把奶泡倒入500ml的容器后马上记录其比例,牛奶最多三分之一,泡沫至少三分之二 内胆底部不能出现牛奶变味,烧焦,残留大量奶垢及难清洁现象. 内胆底部不能出现刮花,搅拌头脱落,工作时不能出现搅拌头脱磁现象. 4 、牛奶加热功能 允许牛奶最大容量:250 ml 牛奶加热完成时间≤180s(包含延时20s±3s) 牛奶加热度规格:67±5℃ 温度测试距离:感温线距离内胆底部6±1mm. 右键按1次(不限制时间)为加热。右指示灯显示红色。再按一次右键关闭, (正在运行时,需更换功能时要先关闭正在运行的功能,否则操作无效);发热盘发热,马达慢转速动,直到发热盘停止发热,马达延时20s±3s停止转动之后温度达到67±5度时,电源开关LED灯熄灭,完成牛奶加热功能 牛奶加热完成后读取其牛奶温度是否符合规格要求,在把牛奶倒入500ml的容量马上查看其牛奶与泡沫的比例,泡沫最多占总容量的20%.(例如总量300ml,那泡沫的容量不能超过60ml.) 内胆底部不能出现牛奶变味,烧焦,残留大量奶垢及难清洁现象. 内胆底部不能出现刮花,搅拌头脱落,工作时不能出现搅拌头脱磁现象. 5 、干烧时间 20s±2s 产品在无水状态下进行加热工作(不用放搅拌支架)时间应在20±2s.内实现跳挚切断工作功能同时LED灯出现红蓝灯交替闪烁发出警报现象,预示消费者该产品刚已进入非正常工作状态. 6 、复位时间≤30S 产品工作完成后重新加入5-20度300ml的牛奶或水,产品应在≤30S的时间内实现再次工作功能. 7 、NTC故障报警功能 如若检测到NTC温度传感器发送短路或者开路,则LED灯出现红蓝灯交替闪烁发出警报现象。发送NTC故障时,按键按下无效。 8 、初始奶温过高报警功能 如若检测到初始奶温大于50度,则LED灯蓝灯闪烁发出警报现象,当初始奶温低于50度时,按下按键则行按键功能。发生初始奶温过高报警时,按下所有按键无效。 三、原理图 本方案采用国产中颖单片机SH79F084A单片机作为MCU,具体的功能就不细说了,大家可以去中颖官网下载datasheet。由于公司保密要求,就不贴出全部原理图了,只贴出MCU控制单元。原理图如下: RLY是继电器控制口,高电平打开发热盘,开始加热,反之则停止加热; LED1和RED,BLUE是三个LED指示灯控制口; MOTOR是马达控制端口,通过PWM控制,马达转轴上面安装了一个磁铁,这样马达转动的时候会带动搅拌器转动,从而实现将牛奶搅拌起泡的功能; I_MOTOR是检测马达卡死的AD端口,检测AD值的大小来判断马达是否卡死; NTC端口是温度传感器采集端口,将采集到的AD值转根据NTC规格书中的阻值表转换成实际的温度; NTC 电路如下: 好了,今天就先说这么多了。下一讲我会开始一步一步的教大家开始编写该产品的软件程序,希望能够对大家有帮助。由于字数严重被限制,因此很多东西都不能再这短短的文章里面描述出来,因此特意贴出了附件文档,希望大家喜欢。(∩_∩)。