第一篇:单片机课程设计报告格式
《单片机课程设计》报告格式
一、封面(注明:单片机课程设计报告、课题名称、班级、姓名、指导教师、日期)
二、摘要(课题简要说明)
三、课题设计目标(功能、性能指标)、方案论证(要求作两种以上方案比较)
四、设计过程(关键电路工作原理、元器件参数选用、程序流程图、程序)
五、软硬件的安装、调试方法
六、完整电路图、性能参数测试
七、存在的问题和改进方向
八、参考文献资料
第二篇:单片机课程设计报告
单片机课程设计报告
课程名称:单片机原理及接口课程设计
题目:基于
学院:电气信息学院
专业班级:测控技术与仪器
姓名:江让
学号:
指导老师:刘升老师
时间:
C51单片机的ADC0809数模转换103班1090640772013/1/16
第三篇:单片机课程设计报告
单片机课程设计报告
题目:小直流电机调速实验
教学单位: 机 电 工 程 系
专业: 机械设计制造及其自动化
班级: 0803班学号: 0811050342姓名: 程怀虎
2011 年 11月
(以下内容用宋体,五号,单倍行距)
第四篇:单片机课程设计报告
DS18B20测温及按键控制
课 程 设 计
课程名称 单片机基础课程设计 题目名称 18B20测温及按键控制 学生学院 **** 专业班级 **** 班号 **** 学生组员 ****** 指导教师 *****
DS18B20测温及按键控制
第一章系统的概述及设计任务书
摘要和关键词【摘要】:
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机STC89C52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
【关键词】:单片机,数字控制,温度计,DS18B20,STC89C52 设计任务与技术指标
要求:1.基本范围-50℃-125℃
2.精度误差小于0.5℃ 3.LED数码直读显示
总体设计方案
数字温度计设计方案论证
方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
方案二的总体设计框图
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
第二章 单元模块的设计与分析
主控制器:
单片机STC89C52,具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用。
DS18B20测温及按键控制
个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
系统软件算法分析
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图7所示。3.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图8示
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图9所示
3.4 计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图10所示。
DS18B20测温及按键控制
第三章 实验程序
else
{ b=0-b;
if(b%10==1)f-=1;b=10-(b%10);/*zhwy.c*/ if(b==10)b=0;
for(i=16;i>0;i--)#include
led(a,b,c,d);} #include“DS18B20.h” return f;unsigned char table[]= } {0xC0,0xF9,0xA4,0xB0, void main(void)
0x99,0x92,0x82,0xF8, { unsigned int Sum,k;0x80,0x90,};//不带小数点的编码
signed int h,j;extern unsigned int temp;LED_init();extern float f_temp;h=0;j=0;unsigned int i;while(1)void LED_init(void){tempchange();{ P2=0x0f;Sum=get_temp();P0=0x00;P2=0xff;} for(k=0;k<100;k++)void led(signed int m,signed int { n,signed int p,signed int q)if(P2==0xf7){ P2=0xef;
{delay(10);
P0=table[q];
if(P2==0xf7)
delay(5);
h+=1;
P2=0xdf;h=display(Sum,h,j);
P0=table[p];
}
delay(5);if(P2==0xfb)
P2=0xbf;
{delay(10);
P0=table[n]+0x80;
if(P2==0xfb)
delay(5);
h-=1;
P2=0x7f;
h=display(Sum,h,j);
P0=table[m];
}
delay(5);if(P2==0xfd)}
{delay(10);unsigned int display(unsigned int
if(P2==0xfd)y,signed int f,signed int g)
j+=1;{ signed int a,b,c,d;
h=display(Sum,h,j);
a=y/1000;
} b=(y%1000)/100+f;if(P2==0xfe)c=(y%100)/10+g;
{delay(10);d=(y%10)/1;
if(P2==0xfe)if(b<=9&&b>=0)
j-=1;for(i=16;i>0;i--)
h=display(Sum,h,j);
led(a,b,c,d);
} else if(b>9)
} {a+=b/10;b=b%10;
display(Sum,h,j);for(i=16;i>0;i--)} }
led(a,b,c,d);} void delay(unsigned int z)//延 时函数
/*DS18B20.h */ {unsigned int x,y;sbit ds=P3^5;//温度传感器信号线 for(x=z;x>0;x--)unsigned int temp;for(y=110;y>0;y--);float f_temp;} unsigned int warn_l1=260;void dsreset(void)//18B20复位,unsigned int warn_l2=250;初始化函数 unsigned int warn_h1=300;{unsigned int i;unsigned int warn_h2=320;ds=0;
i=103;
DS18B20测温及按键控制
总电路图结构图
4总结与体会
经过将近四周的单片机课程设计,我终于在参考了众多程序之后完成了我的数字温度计的设计,虽然没有完全达到设计要求,但我还是高兴的,毕竟这次设
第五篇:单片机课程设计报告
课程设计报告
题 目: 自动滴灌系统设计
课程名称: 单片机原理及应用 学 院: 信息工程学院
专 业: 计算机科学与技术 班 级: 2014 级计本 1 班
学生姓名: *** 学 号: 201403031 指导教师: 巫 宗 宾
成 绩:
开课时间: 2016~2017 学年 2 学期
目录
第一章 系统概要.........................................................................................................................2 1.1系统背景............................................................................................................................2 1.2系统功能............................................................................................................................2 1.3设计要求............................................................................................................................2 第二章 系统硬件原理...............................................................................................................3 2.1AW60主要模块和特点........................................................................................................3 2.2 LCD模块............................................................................................................................3 2.3 LED模块............................................................................................................................4 第三章 系统软件设计.................................................................................................................6 3.1系统流程............................................................................................................................6 3.2主程序(main.c)............................................................................................................7 3.2中断处理程序(isr.c)..................................................................................................7 3.3构件组成............................................................................................................................9 第四章 系统测试.......................................................................................................................27 4.1测试结果..........................................................................................................................27 第五章 总结展望........................................................................................................................31 5.1总结..................................................................................................................................31 5.2展望..................................................................................................................................31 参考文献.....................................................................................................................................32
第一章 系统概要
1.1系统背景
随着科学技术的发展电子技术产业结构调整,单片机开始迅速发展,由于单片机本身的易于控制,精度高,自动化全面,市场对于智能控制系统的需求也越来越大。自动滴灌系统,就是在单片机程序的控制下实现湿度监测、滴灌控制的设备。单片机系统座位一种典型的嵌入式系统,其系统设计包括硬件设计和软件设计编程设计两个方面,其调试过程一般分为软件调试,硬件调试,系统调试。自动滴灌系统需要实现湿度采集,A/D转换,湿度显示,工作状态显示,电机驱动的功能。
1.2系统功能
首先要进行湿度监测,每隔固定的时间就采集一次湿度,在内部转换后与标准值进行比较如果湿度值低于给定值的话就切换至工作状态,滴灌结束时自动切换至结束模式,继续监测湿度。
仿真状态下湿度监测采用软件模拟实现,采集湿度信息使用LED显示,每隔5s采集一次。工作状态由LCD显示。分别有滴灌开始(“Drip-irrigation is starting..”),和滴灌结束(“Drip-irrigation has ended..”)。滴灌时间为5s。结束后切换至结束模式。
1.3设计要求
学生在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。学生要在老师的指导下制定好自己各环节的详细设计进程计划,按给定的时间计划保质保量的完成个阶段的设计任务。设计中可边设计,边修改,软件设计与硬件设计可交替进行,问题答疑与调试和方案修改相结合,提高设计的效率,保证按时完成设计工作并交出合格的设计报告。1
第二章 系统硬件原理
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.2 LCD模块
LCD作为电子信息产品的主要显示器件,相对于其他类型的显示器件来说有其自身的特点,主要包括:
(1)低电压,低功耗;(2)平板型结构;
(3)使用寿命长;
(4)被动显示;
(5)显示信息量大且易于彩色化; 1
(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.3 LED模块
LED发光二极管分为共阴极和共阳极数码管,若为共阴极数码管则公共端接地,若为共阳极数码管则公共端接电源正极。如图1: 1
图1
实际应用中是多个LED共同使用,MCU通过一个称为数据口的8位数据端口来控制位段而原来8段数码管的公共端,原来接到公共电平,现在接MCU的一个引脚,由MCU来控制,通常叫做位选信号,这样MCU的8个端口就可以控制8连排的数码管了。若要控制更多数码管则需加一个译码芯片。每个时刻只让一个数码管有效,由于人的视觉暂留效应(100ms)可以达到同时显示的效果。
图2是MCU与4排8段数码管的连接:
图2 1
第三章 系统软件设计
3.1系统流程
开始初始化土壤湿度数据采集显示湿度N小于设定值Y显示滴灌开始计时结束,结束滴灌显示滴灌结束 图3 图3是系统流程图,开始时先初始化各个部件,LCD显示结束滴灌信息,LED显示为全零。后每隔五秒采集一次湿度数据用LED显示湿度。判断湿度值是否低于设定值,低于设定值的话立即启动滴灌,此时湿度上升,结束滴灌。若没有低于设定值的话,则继续监测。LED不断刷新显示当前湿度值。1
3.2主程序(main.c)
#include “includes.h” //包涵总头文件 int main(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(;;){
}
} return 0;3.2中断处理程序(isr.c)
//================== //文件名称:isr.c //功能概要: 中断底层驱动构件源文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)1
//================== #include “includes.h” void tpm0_isr(void){ static uint_32 TPMCounter = 0;//计时器 static uint_8 LEDindex=0;//位选口声明 uint_8 LEDDataBuffer[4];//LED显示缓冲区
changeCode(shidu,LEDDataBuffer);//将湿度值转化为对应字符输出 uint_8 i;uint_8 * working;uint_8 * stop;working =(uint_8 *)“Drip-irrigation is starting......”;stop =(uint_8 *)“Drip-irrigation has ended......”;if((TPM_SC_REG(TPM0_BASE_PTR)TPM_SC_TOF_MASK){ TPMCounter++;
&
TPM_SC_TOF_MASK)
== } 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){ 1
} 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底层驱动构件源文件 1
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)//====================== #include “tpm.h” //定时器模块0,1,2地址映射 Const TPM_MemMapPtr TPM_ARR[]={TPM0_BASE_PTR,TPM1_BASE_PTR,TPM2_BASE_PTR};//====================== //函数名称:tpm_enable_int //功能概要:使能tpm模块中断。
//参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//====================== void tpm_enable_int(uint_8 tpmModule){ } //====================== //函数名称:tpm_disable_int //功能概要:禁止tpm模块初始化。enable_irq(tpm0_irq_no + tpmModule);//参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//====================== void tpm_disable_int(uint_8 tpmModule){ } //====================== //函数名称:tpm_init //功能概要:初始化tpm模块.1
disable_irq(tpm0_irq_no + tpmModule);
//参数说明:tpmModule:模块号:0、1、2 //clk_src_sel:时钟源选择:1:PLL/FLL(推荐)、2:晶振、3:内部参考时钟。1,2可用
// int_us:中断毫秒数,中断时间间隔,单位为毫秒,10ms=10000 //函数返回:函数执行状态:0=正常;非0=异常
//====================== uint_8 tpm_init(uint_8 tpmModule,uint_8 clk_src_sel,uint_32 int_us){
if(tpmModule>2)//防止越界值 { } //开启SIM时钟门 tpmModule=2;BSET(SIM_SCGC6_TPM0_SHIFT+tpmModule,SIM_SCGC6);//使能TPM时钟
//中断时间计算:(48000/8)*10000/1000=0x7530 10ms中断一次 switch(clk_src_sel){ case 1: //MCGPLL/2或者MCGFLL作为时钟源 BSET(SIM_SOPT2_PLLFLLSEL_SHIFT,SIM_SOPT2);
//使能PLL为时钟源
int_us=(48000/8)*int_us/1000;break;case 2: //晶振作为时钟源
int_us=(8000/8)*int_us/1000;OSC0_CR|=OSC_CR_ERCLKEN_MASK;//开启晶振输出时钟
break;case 3: //内部参考时钟,由MCG决定 break;
default: 1
} return 1;//传参错误,返回
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);return 0;} //====================== //函数名称:tpm_stop //功能概要:禁止tpm模块。
//参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//====================== void tpm_stop(uint_8 tpmModule){ } Tpm.h //====================== //文件名称:tpm.c //功能概要:tpm底层驱动构件源文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)//====================== #ifndef TPM_H 1
TPM_ARR[tpmModule]->SC&=~TPM_SC_CMOD(3);
#define TPM_H
#include “common.h” #include “sysinit.h” //中断号
#define tpm0_irq_no 17 #define tpm1_irq_no 18 #define tpm2_irq_no 19 //时钟选择
#define TPM_CLKSRC_PLL 1 #define TPM_CLKSRC_OSC 2 #define TPM_CLKSRC_IRC 3 //模块号 #define TPM0 0 #define TPM1 1 #define TPM2 2
//====================== //函数名称:tpm_enable_int //功能概要:使能tpm模块中断。
//参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//====================== void tpm_enable_int(uint_8 tpmModule);//====================== //函数名称:tpm_disable_int //功能概要:禁止tpm模块初始化。
//参数说明:tpmModule:模块号:0、1、2 //函数返回:无 1
//====================== void tpm_disable_int(uint_8 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_8 tpm_init(uint_8 tpmModule,uint_8 clk_src_sel,uint_32 int_us);//====================== //函数名称:tpm_stop //功能概要:禁止tpm模块。
//参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//====================== void tpm_stop(uint_8 tpmModule);#endif
2、LED构件
//===================== // 文件名称:led.c // 功能概要:led构件源文件
// 版权所有: 苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)//====================== #include “led.h” //led位选端口 struct GPIO led_cs[4]= 1
{
{LED_CS0_PORT,LED_CS0}, {LED_CS1_PORT,LED_CS1}, {LED_CS2_PORT,LED_CS2}, {LED_CS3_PORT,LED_CS3}, };//led数据端口 struct GPIO led_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初始化。
//====================== void LEDInit(){ uint_8 i = 0;//定义8根数据线为输出,初始输出0 for(i = 0;i < 8;i++)gpio_init(led_d[i].gpio_port, led_d[i].gpio_pin, 1, 0);1
//定义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。
//====================== void LEDshow1(uint_8 i, uint_8 c){ uint_8 temp;uint_8 j;//位选全部置0 for(j=0;j<=3;j++)gpio_set(led_cs[j].gpio_port, led_cs[j].gpio_pin, 0);//数据上线 for(j=0;j<=7;j++){ temp =(c>>j)& 0x01;
gpio_set(led_d[j].gpio_port, led_d[j].gpio_pin, temp);} //选择的位选置1 gpio_set(led_cs[i].gpio_port, led_cs[i].gpio_pin, 1);}
//显示码表
const uint_8 Dtable[24] = 1
// 0 1 2 3 4 5 6 7 8 9 {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F, // 11 12 13 14 15 16 17 18 19 20 // 0.1.2.3.4.5.6.7.8.9.0xBF,0x86,0xDB,0x4F,0x66, 0x6D,0x7D,0x07,0xFF,0x6F, // 21 22 23(全亮)24(全灭)// E F 0x79,0x71, 0xFF, 0x00};//====================== //函数名称:LEDchangeCode //函数返回:返回数据num对应的显示码 //参数说明:num:需要转换成显示码的数字 //功能概要:数字转成显示码
//===================== uint_8 LEDchangeCode(uint_8 num){ return Dtable[num];} LED.h //====================== // 文件名称:led.h // 功能概要:led构件头文件
// 版权所有: 苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)//======================
#ifndef led_H //防止重复定义(开头)#define led_H #include “GPIOapp.h” //LED数据口分别接PORTB的{11,10,9,8,3,2,1,0}引脚 1
#define LED_D1_PORT PORTB #define LED_D1 11 #define LED_D2_PORT PORTB #define LED_D2 10 #define LED_D3_PORT PORTB #define LED_D3 9 #define LED_D4_PORT PORTB #define LED_D4 8 #define LED_D5_PORT PORTB #define LED_D5 3 #define LED_D6_PORT PORTB #define LED_D6 2 #define LED_D7_PORT PORTB #define LED_D7 1 #define LED_D8_PORT PORTB #define LED_D8 0 //LED位选口分别接PORTB的{19,18,17,16}引脚 #define LED_CS0_PORT PORTB #define LED_CS0 19 #define LED_CS1_PORT PORTB #define LED_CS1 18 #define LED_CS2_PORT PORTB #define LED_CS2 17 #define LED_CS3_PORT PORTB #define LED_CS3 16 //====================== //函数名称:LEDInit //函数返回:无 //参数说明:无 1
//功能概要:LED初始化。
//====================== void LEDInit();//====================== //函数名称:LEDshow1 //函数返回:无
//参数说明:i:指定LED哪一位显示,c:显示的内容 //功能概要:指定LED的第i位显示c。
//====================== void LEDshow1(uint_8 i, uint_8 c);//====================== //函数名称:LEDchangeCode //函数返回:返回数据num对应的显示码 //参数说明:num:需要转换成显示码的数字 //功能概要:数字转成显示码
//====================== uint_8 LEDchangeCode(uint_8 num);#endif //防止重复定义(结尾)
3、LCD构件
//====================== // 文件名称:lcd.c // 功能概要:lcd构件头文件
// 版权所有: 苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)//====================== #include “lcd.h”//lcd控制位和数据位端口及引脚号 struct GPIO LCD[11]= { {LCD_RS_PORT,LCD_RS}, 1
{LCD_RW_PORT,LCD_RW}, {LCD_E_PORT,LCD_E}, {LCD_D0_PORT,LCD_D0}, {LCD_D1_PORT,LCD_D1}, {LCD_D2_PORT,LCD_D2}, {LCD_D3_PORT,LCD_D3}, {LCD_D4_PORT,LCD_D4}, {LCD_D5_PORT,LCD_D5}, {LCD_D6_PORT,LCD_D6}, {LCD_D7_PORT,LCD_D7}, };//内部函数原型说明
extern void LCDCommand(uint_8 cmd);//====================== //函数名称:LCDInit //函数返回:无 //参数说明:无
//功能概要:LCD初始化。
//====================== void LCDInit(){ uint_32 i = 0; //定义数据口和控制口为输出 for(i = 0;i < 11;i++){ gpio_init(LCD[i].gpio_port, LCD[i].gpio_pin, 1,0);} //设置指令,RS,R/W = 00, 写指令代码
gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 0);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);1
//功能设置-//设置指令
LCDCommand(0x38);//5*7点阵模式,2行显示,8位数据总线 LCDCommand(0x08);//关显示,关光标显示,不闪烁
LCDCommand(0x01);//清屏
for(i=0;i<40000;i++)asm(“NOP”);//延时 LCDCommand(0x06);LCDCommand(0x14);//光标右移一个字符位,AC自动加1 LCDCommand(0x0C);//开显示,关光标显示,不闪烁 } //====================== //函数名称:LCDShow //函数返回:无
//参数说明:需要显示的数据 //功能概要:液晶显示data中的数据。
//====================== void LCDShow(uint_8 data[32]){ uint_8 i;LCDInit();//LCD初始化 //显示第1行16个字符
gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 0);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//后7位为DD RAM地址(0x00)LCDCommand(0x80);//写16个数据到DD RAM gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 1);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//将要显示在第1行上的16个数据逐个写入DD RAM中 1
for(i = 0;i < 16;i++){ } //显示第2行16个字符
gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 0);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//后7位为DD RAM地址(0x40)LCDCommand(0xC0);gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 1);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//将要显示在第2行上的16个数据逐个写入DD RAM中 for(i = 16;i < 32;i++){ } } //====================== //函数名称:LCDCommand //函数返回:无
//参数说明:cmd:待执行的命令
//功能概要:执行给定的cmd命令,且延时。
//====================== void LCDCommand(uint_8 cmd){
uint_8 i;uint_16 j;uint_8 temp;LCDCommand(data[i]);LCDCommand(data[i]);//等待延迟防止重复调用此函数而LCD卡死 1
for(j=0;j<1600;j++);asm(“NOP”);//数据送到LCD的数据线上 for(i = 3;i < 11;i++){ gpio_set(LCD[i].gpio_port, LCD[i].gpio_pin, 0);} for(i = 3;i < 11;i++){ temp = 0x01 &(cmd>>(i-3));gpio_set(LCD[i].gpio_port, LCD[i].gpio_pin, temp);} //给出E信号的下降沿(先高后低),使数据写入LCD gpio_set(LCD[2].gpio_port, LCD[2].gpio_pin, 1);for(j=0;j<25;j++)asm(“NOP”);gpio_set(LCD[2].gpio_port, LCD[2].gpio_pin, 0);} LCD.h //====================== // 文件名称:lcd.h // 功能概要:lcd构件头文件
// 版权所有: 苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)// 版本更新: 2013-03-17 V1.2 //====================== #ifndef LCD_H #define LCD_H #include “GPIOapp.h” //LCD寄存器选择信号引脚 #define LCD_RS_PORT PORTD #define LCD_RS 7 //LCD读写信号引脚 1
#define LCD_RW_PORT PORTD #define LCD_RW 6 //LCD读写信号引脚
#define LCD_E_PORT PORTD #define LCD_E 5 //LCD数据引脚
#define LCD_D0_PORT PORTD #define LCD_D0 4 #define LCD_D1_PORT PORTD #define LCD_D1 3 #define LCD_D2_PORT PORTD #define LCD_D2 2 #define LCD_D3_PORT PORTD #define LCD_D3 1 #define LCD_D4_PORT PORTD #define LCD_D4 0 #define LCD_D5_PORT PORTC #define LCD_D5 17 #define LCD_D6_PORT PORTC #define LCD_D6 16 #define LCD_D7_PORT PORTC #define LCD_D7 13 //====================== //函数名称:LCDInit //函数返回:无 //参数说明:无
//功能概要:LCD初始化。
//====================== extern void LCDInit();1
//====================== //函数名称:LCDShow //函数返回:无
//参数说明:data[32]:需要显示的数组 //功能概要:LCD显示数组的内容。
//====================== extern void LCDShow(uint_8 data[32]);#endif //防止重复定义(结尾)
4、辅助函数 /* * qzh.h * * Created on: Jun 5, 2017 * Author: administrator */
#ifndef QZH_H_ #define QZH_H_ #include “GPIOapp.h” void changeState(int*);//改变工作状态函数 int sdmn(int);//湿度变化模拟函数
void changeCode(int,uint_8 s[4]);//LED显示转码函数 #endif /* QZH_H_ */ /* * fun.c * * Created on: Jun 5, 2017 1
* Author: administrator */ #include“qzh.h” void changeState(int *a){
} int sdmn(int a){ } void changeCode(int a,uint_8 s[4]){
} 1
if(*a == 0){ } else { } *a = 0;*a = 1;return a-=5;uint_8 c[10] = {'0','1','2','3','4','5','6','7','8','9'};s[3] = c[a%10];s[2] = c[a/10];s[1] = c[a/100];s[0] = c[a/1000];
第四章 系统测试
4.1测试结果
图4 图4 是开始是湿度显示是72%,工作状态显示为停止。1
图5 图5 是第二次采集湿度显示为69%,工作状态显示为停止。1
图6 图6 是第三次采集湿度显示为66%度,已经逼近设定值65%,此时工作状态显示为停止。1
图7 再次采集时湿度低于65%,滴灌立即开始,湿度上升至75%。1
第五章 总结展望
5.1总结
通过本次课程设计,对中断处理有了更加深入的理解。对于计时器,LED和LCD的工作原理也有了更深的认识。LCD在试验中遇到的问题不大,主要问题在于中断处理函数的编写和LED显示上,LED显示是每次中断显示一个数,所以要每次中断显示,才能使得四个值看起来是同时显示的且没有闪烁效果。
其次LED的显示是要求是字符,所以在显示湿度是加上了转码函数加以转换。这里又涉及到了参数为数组的函数的写法,因为学过好几种语言,其传递方式偶所不同所以在这里也出现了不少问题。
通过此次课程设计不仅对单片机应用有了很好的实践经验,而且也帮助巩固了以前的知识。
5.2展望
1、滴灌系统可以增加通信模块,使得所有者可以实时监测农作物生长环境,也可以远程操控进行滴灌等功能。
2、滴灌系统可以增加温度监测,土壤酸碱性监测,空气CO2浓度监测,并配套处理设备使得对农作物的管理更加智能化。
1
参考文献
[1] 王宜怀、张书奎、王林、吴瑾著.嵌入式技术基础与实践(第3版),北京:清华大学 出版社,2011.[2] 田泽.嵌入式系统开发与应用.北京:北京航天航空大学出版社,[3] 王宜怀、陈建明、蒋银珍著.基于32位ColdFire构建嵌入式系统.北京:电子工业出
版社,2006.[4] 王粉花、王志良.嵌入式系统与单片机实践教程.北京:清华大学出版社,2010.32 1