电子科技大学信息科技学院《汽车微控制器应用》实训报告
学号
姓名
指导教师:
实训题目:汽车温度监控系统设计
1 系统设计
1.1 设计要求
1.1.1 设计任务
用温度传感器(18B20)进行温度采集,实现汽车温度监控。
1.1.2 性能指标要求
(1)
用温度传感器(18B20)进行温度测量,并显示温度值。 (2)
设计风扇驱动电路。 (3)
通过按键设置温度报警值,超过设置温度可发出声光报警。 (4)
超过设置温度可自动开启风扇,温度越高,风扇转速越快。 (5) 其他创新功能。
1.2 设计思路及设计框图
1. 2.1设计思路
使用DS18B20进行温度采集,使用L9110H 控制风扇运作,使用两个按键分别控制温度额定值的加减,PWM 调节风扇速度。
1.2.2总体设计框图
2 各个模块电路及程序的设计
测温部分:
按键输入 MC9S12XS 单片机 控制器 PWM 调速
数码管显示 温度传感器
void display_buff(void)
{
int dat ;
Start_DS18B20(); //启动温度转换
wd=Get_Temp(); //读取温度
dat=wd/16;
if(dat<80)shice=dat;
disbuff_tab[2]=shice%10;
disbuff_tab[3]=shice/10;
disbuff_tab[5]=set%10;
disbuff_tab[6]=set/10;
}
风扇部分:
void PWM_Init(void) //PWM初始化
{
PWME=0x00; //禁止模块
PWMPRCLK=0x03; //分频因子8分频
PWMSCLA=50; //SA的分频因子设定植0~255 PWMCLK=0x02; //通道1
PWMPER1=200; //通道1周期系数200
PWMDTY1=0; //占空比
PWMPOL=0x01;
PWMPOL_PPOL1=1;
PWMCAE=0x00; //左对齐
PWMCTL=0x00; //不级联
PWME=0X02; //使能通道1 }
按键部分:
void scan_anjian(void)
{
if(k1==0)
{delay(500);
if(k1==0)
{
set++;
if(set>90)set=90;
}
}
if(k2==0)
{delay(500);
if(k2==0)
{
set--;
if(set<5)set=5;
}
}
}
3 调试过程
首先,检查电路板是否连对,是否有焊错的地方,用万用表测量各VCC与GND之间是否导通,检查无误后接通电路,查看电源指示灯是否亮起。其次,程序每编写完一个模块编译一次,查看是否通过,并验证程序功能是否实现。最后,接通实验箱连接电路板下载程序,查看风扇是否随温度的变化而变化,数码管是否能正常显示额定温度与实测温度。
4 功能测试
4.1 测试仪器与设备
万用表,计算机,飞思卡尔实验箱。
4.2 性能指标测试
(1)用温度传感器(18B20)进行温度测量,能正常显示温度值。
(2)风扇能正常运转。
(3)可通过按键设置温度报警值。
(4)超过设置温度可自动开启风扇,温度越高,风扇转速越快。
4.3 误差分析
采样精确度低,仪器间不精密都是造成误差的原因。
5 实训心得体会
通过这次实训,让我更加深入的了解了飞思卡尔MC9S12XS128单片机,也让我认识了温度传感器DS18B20和电机驱动芯片L9110H。这次实训不仅加强了我们的动手能力,还让我们学到了一些基本的编程能力,其中PWM通道时钟周期与分频因子间的计算关系是让我最混乱的,在反复计算与换算后也终于弄懂了。
6 参考文献
[1] 自美.电子线路设计·实验·测试(第二版).:华中科技大学,2000
[2]阳.单片机原理及嵌入式系统开发.电子工业,2013
[3]新民.微型计算机控制技术(第二版).电子工业,2011
附录
附录1:原理图,实物图
附录2:程序清单
#include
#include "derivative.h"
#include "CRG.h"
#include "DS18B20.h"
#define k1 PORTB_PB1
#define k2 PORTB_PB2
#define k1_dir DDRB_DDRB0
#define k2_dir DDRB_DDRB1
#define uchar unsigned char
const uchar smg_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; const uchar wx_tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar disbuff_tab[8];
static int wd;
unsigned static int shice;
uchar set=25;
void SetBusCLK_32M(void);
void delay(long t)
{
unsigned static int x,y;
for(x=0;x for(y=1000;y>0;y--); void scan_anjian(void) { if(k1==0) {delay(500); if(k1==0) { set++; if(set>90)set=90; } } if(k2==0) {delay(500); if(k2==0) { set--; if(set<5)set=5; } } } void display_buff(void) { int dat ; Start_DS18B20(); //启动温度转换wd=Get_Temp(); //读取温度dat=wd/16; if(dat<80)shice=dat; disbuff_tab[2]=shice%10; disbuff_tab[3]=shice/10; disbuff_tab[5]=set%10; disbuff_tab[6]=set/10; } void display(void) { uchar i; PTH=0x00; for(i=0;i<8;i++) { PORTA=smg_tab[disbuff_tab[i]]; PTH=wx_tab[i]; delay(25); } } void PWM_Init(void) //PWM初始化 { PWME=0x00; //禁止模块 PWMPRCLK=0x03; //分频因子8分频PWMSCLA=50; //SA的分频因子设定植0~255 PWMCLK=0x02; //通道1 PWMPER1=200; //通道1周期系数200 PWMDTY1=0; //占空比 PWMPOL=0x01; PWMPOL_PPOL1=1; PWMCAE=0x00; //左对齐 PWMCTL=0x00; //不级联 PWME=0X02; //使能通道1 } void kongzhi(void) { if(shice>set) PWMDTY1=(shice-set)*4+50; else PWMDTY1=0; }