单片机课程设计报告.docx
- 文档编号:5530830
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:30
- 大小:2.70MB
单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告
课程设计报告
题目:
自动滴灌系统设计
课程名称:
单片机原理及应用
学院:
信息工程学院
专业:
计算机科学与技术
班级:
2014级计本1班
学生:
***
学号:
201403031
指导教师:
巫宗宾
成绩:
开课时间:
2016~2017学年2学期
第一章系统概要
1.1系统背景
随着科学技术的发展电子技术产业结构调整,单片机开始迅速发展,由于单片机本身的易于控制,精度高,自动化全面,市场对于智能控制系统的需求也越来越大。
自动滴灌系统,就是在单片机程序的控制下实现湿度监测、滴灌控制的设备。
单片机系统座位一种典型的嵌入式系统,其系统设计包括硬件设计和软件设计编程设计两个方面,其调试过程一般分为软件调试,硬件调试,系统调试。
自动滴灌系统需要实现湿度采集,A/D转换,湿度显示,工作状态显示,电机驱动的功能。
1.2系统功能
首先要进行湿度监测,每隔固定的时间就采集一次湿度,在部转换后与标准值进行比较如果湿度值低于给定值的话就切换至工作状态,滴灌结束时自动切换至结束模式,继续监测湿度。
仿真状态下湿度监测采用软件模拟实现,采集湿度信息使用LED显示,每隔5s采集一次。
工作状态由LCD显示。
分别有滴灌开始(“Drip-irrigationisstarting..”),和滴灌结束(“Drip-irrigationhasended..”)。
滴灌时间为5s。
结束后切换至结束模式。
1.3设计要求
学生在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。
学生要在老师的指导下制定好自己各环节的详细设计进程计划,按给定的时间计划保质保量的完成个阶段的设计任务。
设计中可边设计,边修改,软件设计与硬件设计可交替进行,问题答疑与调试和方案修改相结合,提高设计的效率,保证按时完成设计工作并交出合格的设计报告。
第二章系统硬件原理
2.1AW60主要模块和特点
AW60系列主要常规模块和特点:
(1)最高达40MHz的CPU工作频率和20MHz的部总线工作频率;时钟源选项包括晶振,谐振器,外部时钟或,部产生的时钟。
(2)相比HC08CPU指令集,S08CPU增加了BGND指令。
(3)单线后台调试模式接口:
增强的断点能力,允许单一的断点设置在线调试(在片调试模块增加了多于两个的断点)。
(4)含32个中断/复位源;含2KB的片RAM;含60KB的片在线可编程的Flash存储器,带有块保护和安全选项。
(5)可选的计算机正常操作(COP)复位;低电压检测与复位或中断;非法操作码检测与复位;非法地址检测与复位。
(6)ADC:
多达16个通道,10个A/D转换器与动动比较功能;两个串行通信接口SCI模块与可选的13位中断;一个串行外设接口SPI模块;集成电路互联总线IIC模块运行高达100kbps的最高总线负载;8引脚键盘中断KBI模块。
(7)Timers:
1个2通道和一个6通道16位定时器/脉冲宽度调制器模块。
既有输入捕获,输出比较,脉宽调制功能。
AW子系列MCU的4种封装形式只是引脚数量和形式有所区别,其他方面是一致的。
2.2LCD模块
LCD作为电子信息产品的主要显示器件,相对于其他类型的显示器件来说有其自身的特点,主要包括:
(1)低电压,低功耗;
(2)平板型结构;
(3)使用寿命长;
(4)被动显示;
(5)显示信息量大且易于彩色化;
(6)无电磁辐射。
点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义符号的液晶显示器。
这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的阻容元件等集成一个液晶显示模板。
鉴于字符型液晶显示模块目前在国际上已经规化,其电特性及接口特性是统一的,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示器模块。
字符型液晶显示器模块的特点如下:
(1)液晶显示屏是以若干5*8或5*11点阵块等组成的显示字符群。
每个点阵块块为一个字符位,字符间距和行间距都是一个点的宽度。
(2)主控制电路为HD44780(HITACHI及其他公司的兼容电路。
从程序员的角度来看LCD显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。
(3)部具有字符发生器ROM,可显示192种字符。
(4)具有64字节的字符发生器RAM,可以定义8个5*8点阵字符或4个5*11的点阵字符。
(5)具有64字节的数据显示RAM,供显示器编程使用。
(6)标准接口特性,与MC9S08系列的MCU容易接口。
(7)模块结构紧凑,轻巧,装配容易。
(8)单+5V电源供电(宽温型需要加-7V驱动电源)。
(9)低功耗,高可靠性。
2.3LED模块
LED发光二极管分为共阴极和共阳极数码管,若为共阴极数码管则公共端接地,若为共阳极数码管则公共端接电源正极。
如图1:
图1
实际应用中是多个LED共同使用,MCU通过一个称为数据口的8位数据端口来控制位段而原来8段数码管的公共端,原来接到公共电平,现在接MCU的一个引脚,由MCU来控制,通常叫做位选信号,这样MCU的8个端口就可以控制8连排的数码管了。
若要控制更多数码管则需加一个译码芯片。
每个时刻只让一个数码管有效,由于人的视觉暂留效应(100ms)可以达到同时显示的效果。
图2是MCU与4排8段数码管的连接:
图2
第三章系统软件设计
3.1系统流程
图3
图3是系统流程图,开始时先初始化各个部件,LCD显示结束滴灌信息,LED显示为全零。
后每隔五秒采集一次湿度数据用LED显示湿度。
判断湿度值是否低于设定值,低于设定值的话立即启动滴灌,此时湿度上升,结束滴灌。
若没有低于设定值的话,则继续监测。
LED不断刷新显示当前湿度值。
3.2主程序(main.c)
#include"includes.h"//包涵总头文件
intmain(void)
{
work=0;
shidu=75;
enter_critical();
LEDInit();//LED初始化
LCDInit();//LCD初始化
tpm_init(TPM0,TPM_CLKSRC_PLL,1000);//初始化TPM模块,1ms中断一次
light_init(LIGHT_PORT,LIGHT_PIN_RED,LIGHT_OFF);
light_init(LIGHT_PORT,LIGHT_PIN_GREEN,LIGHT_OFF);
tpm_enable_int(0);
init_critical();
for(;;)
{
}
return0;
}
3.2中断处理程序(isr.c)
//================================================================
//文件名称:
isr.c
//功能概要:
中断底层驱动构件源文件
//所有:
大学飞思卡尔嵌入式中心()
//================================================================
#include"includes.h"
voidtpm0_isr(void)
{
staticuint_32TPMCounter=0;//计时器
staticuint_8LEDindex=0;//位选口声明
uint_8LEDDataBuffer[4];//LED显示缓冲区
changeCode(shidu,LEDDataBuffer);//将湿度值转化为对应字符输出
uint_8i;
uint_8*working;
uint_8*stop;
working=(uint_8*)"Drip-irrigationisstarting......";
stop=(uint_8*)"Drip-irrigationhasended......";
if((TPM_SC_REG(TPM0_BASE_PTR)&TPM_SC_TOF_MASK)==TPM_SC_TOF_MASK)
{
TPMCounter++;
}
BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR));//中断置标志位写1清0
LEDindex++;//位选位+1
if(LEDindex>=4)LEDindex=0;//大于4位选口置0
i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0');//转码
LEDshow1(LEDindex,i);
if(TPMCounter>5000)
{
shidu=sdmn(shidu);
if(shidu<=65)
{
changeState(&work);//改变工作状态
}
if(work==0)
{
LCDShow(stop);
TPMCounter=0;
light_control(LIGHT_PORT,LIGHT_PIN_RED,LIGHT_ON);
light_control(LIGHT_PORT,LIGHT_PIN_GREEN,LIGHT_OFF);
}
if(work==1)
{
LCDShow(working);
TPMCounter=0;
shidu=80;
light_control(LIGHT_PORT,LIGHT_PIN_GREEN,LIGHT_ON);
light_control(LIGHT_PORT,LIGHT_PIN_RED,LIGHT_OFF);
changeState(&work);
}
}
}
3.3构件组成
1、TPM构件:
//=================================================================
//文件名称:
tpm.c
//功能概要:
tpm底层驱动构件源文件
//所有:
大学飞思卡尔嵌入式中心()
//====================================================================
#include"tpm.h"
//定时器模块0,1,2地址映射
ConstTPM_MemMapPtr
TPM_ARR[]={TPM0_BASE_PTR,TPM1_BASE_PTR,TPM2_BASE_PTR};
//====================================================================
//函数名称:
tpm_enable_int
//功能概要:
使能tpm模块中断。
//参数说明:
tpmModule:
模块号:
0、1、2
//函数返回:
无
//====================================================================
voidtpm_enable_int(uint_8tpmModule)
{
enable_irq(tpm0_irq_no+tpmModule);
}
//====================================================================
//函数名称:
tpm_disable_int
//功能概要:
禁止tpm模块初始化。
//参数说明:
tpmModule:
模块号:
0、1、2
//函数返回:
无
//====================================================================
voidtpm_disable_int(uint_8tpmModule)
{
disable_irq(tpm0_irq_no+tpmModule);
}
//====================================================================
//函数名称:
tpm_init
//功能概要:
初始化tpm模块.
//参数说明:
tpmModule:
模块号:
0、1、2
//clk_src_sel:
时钟源选择:
1:
PLL/FLL(推荐)、2:
晶振、3:
部参考时钟。
1,2可用
//int_us:
中断毫秒数,中断时间间隔,单位为毫秒,10ms=10000
//函数返回:
函数执行状态:
0=正常;非0=异常
//====================================================================
uint_8tpm_init(uint_8tpmModule,uint_8clk_src_sel,uint_32int_us)
{
if(tpmModule>2)//防止越界值
{
tpmModule=2;
}
//开启SIM时钟门
BSET(SIM_SCGC6_TPM0_SHIFT+tpmModule,SIM_SCGC6);//使能TPM时钟
//中断时间计算:
(48000/8)*10000/1000=0x753010ms中断一次
switch(clk_src_sel)
{
case1:
//MCGPLL/2或者MCGFLL作为时钟源
BSET(SIM_SOPT2_PLLFLLSEL_SHIFT,SIM_SOPT2);//使能PLL为时钟源
int_us=(48000/8)*int_us/1000;
break;
case2:
//晶振作为时钟源
int_us=(8000/8)*int_us/1000;
OSC0_CR|=OSC_CR_ERCLKEN_MASK;//开启晶振输出时钟
break;
case3:
//部参考时钟,由MCG决定
break;
default:
return1;//传参错误,返回
}
SIM_SOPT2|=SIM_SOPT2_TPMSRC(clk_src_sel);//使能时钟选择
TPM_ARR[tpmModule]->CNT=0x00;
TPM_ARR[tpmModule]->MOD=int_us;
//TOF写1清0,TOIE中断使能,CMOD选择每次时钟加1,PS=0x011选择8分频;
TPM_ARR[tpmModule]->SC=TPM_SC_TOF_MASK|TPM_SC_TOIE_MASK|TPM_SC_CMOD
(1)|TPM_SC_PS(3);
return0;
}
//====================================================================
//函数名称:
tpm_stop
//功能概要:
禁止tpm模块。
//参数说明:
tpmModule:
模块号:
0、1、2
//函数返回:
无
//====================================================================
voidtpm_stop(uint_8tpmModule)
{
TPM_ARR[tpmModule]->SC&=~TPM_SC_CMOD(3);
}
Tpm.h
//====================================================================
//文件名称:
tpm.c
//功能概要:
tpm底层驱动构件源文件
//所有:
大学飞思卡尔嵌入式中心()
//====================================================================
#ifndefTPM_H
#defineTPM_H
#include"common.h"
#include"sysinit.h"
//中断号
#definetpm0_irq_no17
#definetpm1_irq_no18
#definetpm2_irq_no19
//时钟选择
#defineTPM_CLKSRC_PLL1
#defineTPM_CLKSRC_OSC2
#defineTPM_CLKSRC_IRC3
//模块号
#defineTPM00
#defineTPM11
#defineTPM22
//====================================================================
//函数名称:
tpm_enable_int
//功能概要:
使能tpm模块中断。
//参数说明:
tpmModule:
模块号:
0、1、2
//函数返回:
无
//====================================================================
voidtpm_enable_int(uint_8tpmModule);
//====================================================================
//函数名称:
tpm_disable_int
//功能概要:
禁止tpm模块初始化。
//参数说明:
tpmModule:
模块号:
0、1、2
//函数返回:
无
//====================================================================
voidtpm_disable_int(uint_8tpmModule);
//====================================================================
//函数名称:
tpm_init
//功能概要:
初始化tpm模块.
//参数说明:
tpmModule:
模块号:
0、1、2
//clk_src_sel:
时钟源选择:
1:
PLL/FLL(推荐)、2:
晶振、3:
部参考时钟。
1,2可用
//int_us:
中断毫秒数,中断时间间隔,单位为毫秒,10ms=10000
//函数返回:
函数执行状态:
0=正常;非0=异常
//====================================================================
uint_8tpm_init(uint_8tpmModule,uint_8clk_src_sel,uint_32int_us);
//====================================================================
//函数名称:
tpm_stop
//功能概要:
禁止tpm模块。
//参数说明:
tpmModule:
模块号:
0、1、2
//函数返回:
无
//====================================================================
voidtpm_stop(uint_8tpmModule);
#endif
2、LED构件
//===================================================================
//文件名称:
led.c
//功能概要:
led构件源文件
//所有:
大学飞思卡尔嵌入式中心()
//====================================================================
#include"led.h"//led位选端口
structGPIOled_cs[4]=
{
{LED_CS0_PORT,LED_CS0},
{LED_CS1_PORT,LED_CS1},
{LED_CS2_PORT,LED_CS2},
{LED_CS3_PORT,LED_CS3},
};//led数据端口
structGPIOled_d[8]=
{
{LED_D1_PORT,LED_D1},
{LED_D2_PORT,LED_D2},
{LED_D3_PORT,LED_D3},
{LED_D4_PORT,LED_D4},
{LED_D5_PORT,LED_D5},
{LED_D6_PORT,LED_D6},
{LED_D7_PORT,LED_D7},
{LED_D8_PORT,LED_D8},
};
//====================================================================
//函数名称:
LEDInit
//函数返回:
无
//参数说明:
无
//功能概要:
LED初始化。
//====================================================================
voidLEDInit()
{
uint_8i=0;
//定义8根数据线为输出,初始输出0
for(i=0;i<8;i++)
gpio_init(led_d[i].gpio_port,led_d[i].gpio_pin,1,0);
//定义4位选线定义为输出,初始输出0
for(i=0;i<4;i++)
gpio_init(led_cs[i].gpio_port,led_cs[i].gpio_pin,1,0);
}
//====================================================================
//函数名称:
LEDshow1
//函数返回:
无
//参数说明:
i:
指定LED哪一位显示,c:
显示的容
//功能概要:
指定LED的第i位显示c。
//====================================================================
voidLEDshow1(uint_8i,uint_8c)
{
uint_8temp;
uint_8j;
//位选全部置0
for(j=0;j<=3;j++)
gpio_set(led_cs[j].gpio_port,led_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告