单片机课程设计报告

时间:2019-05-15 07:06:47下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《单片机课程设计报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《单片机课程设计报告》。

第一篇:单片机课程设计报告

单片机课程设计报告

题目:小直流电机调速实验

教学单位: 机 电 工 程 系

专业: 机械设计制造及其自动化

班级: 0803班学号: 0811050342姓名: 程怀虎

2011 年 11月

(以下内容用宋体,五号,单倍行距)

第二篇:单片机课程设计报告

单片机课程设计报告

 课程名称:单片机原理及接口课程设计

 题目:基于

 学院:电气信息学院

 专业班级:测控技术与仪器

 姓名:江让

 学号:

 指导老师:刘升老师

 时间:

C51单片机的ADC0809数模转换103班1090640772013/1/16

第三篇:单片机课程设计报告

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

第五篇:单片机课程设计报告

《单片机原理与接口技术》

课程设计报告

设计题目: 基于80C51单片机系统实验板的制作

与程序设计

业:应用电子专业

级: 11应电班

名: 丁文俊

指导教师: 余静老师

2013 年 5 月20 日

目录 前 言………………………………………………………………… 2 课程设计的目的及要求…………………………………………… 3 硬件电路设计……………………………………………………… 4 软件程序设计…………………………………………………… 5 小结………………………………………………………………

参考文献 附录A 电路总图 附录B 程序清单

基于80C51单片机系统实验板的制作与程序设计

1.前言

2、课程设计的目的及要求 2.1课程设计目的

2.2课程设计要求

3、系统主要硬件电路设计

3.1 STC89C51单片机简介

MCS-51是美国Intel公司生产的一系列单片机的总称,包括多个品种,如8031、8051、8751、8032、80C52、8752等。其中8051是最典型的产品,其他单片机都是在其基础上进行功能增减而来的,所以人们习惯于用8051来称呼MCS-51系列单片机。Intel公司将MCS-51的核心技术授权给了多家公司,这些厂家生产的单片机在功能上或多或少有些改变,以满足不同的需求,其中美国的ATMEL公司生产的AT89C51是曾经在我国非常流行的51单片机。当前AT89C51/52已经停产,其替代产品为AT89S51/52。深圳宏晶公司出品的STC89C51可以直接代替传统的AT89S51和AT89C51芯片,也可以代替菲利普、华帮等其他公司的89C51,由于时代的发展,工艺的进步,STC89C51功能更强,寿命更长(4K字节Flash存储器、128字节片内RAM、支持ISP下载编程)

图2.1 STC89c51单片机

单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTALl和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图2-2所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。

图2-2中外接晶体以及电容C2和C1构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值均为30P左右,晶振频率选11.0592MHz。

为了初始化单片机内部的某些特殊功能寄存器,必须采用复位的方式,复位后可使CPU及系统各部件处于确定的初始状态,并从初始状态开始正常工作。单片机的复位是靠外电路来实现的,在正常运行情况下,只要RST引脚上出现两个机器周期时间以上的高电平,即可引起系统复位,但如果RST引脚上持续为高电平,单片机就处于循环复位状态。复位后系统将输入/输出(1/0)端口寄存器置为FFH,堆栈指针SP置为07H, SBUF内置为不定值,其余的寄存器全部清0,内部RAM的状态不受复位的影响,在系统上电时RAM的内容是不定的。复位操作有两种情况,即上电复位和手动(开关)复位。本系统采用上电复位方式。图2-2中R9和Cl组成上电复位电路,其值R取为10K, C取为10μF.4

图2.2 最小系统结构图

3.2 电平转换电路 3.3

4、软件程序设计

5、小结

参考文献

[1] 张伟,《单片机原理及应用》,机械工业出版社,2005(这是格式)

附录

江西工业职业技术学院电子与信息工程系

课程设计指导教师评语

班级:

学生姓名:

学号:

指导教师评语(包括工作态度,遵守纪律;基本理论、知识、技能;独立工作能力和分析解决问题的能力;完成任务情况及水平):

学生成绩(五级分制):

指导教师签名:

****年**月**日

下载单片机课程设计报告word格式文档
下载单片机课程设计报告.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机课程设计实习报告

    单片机课程设计实习报告 课程 2009-06-09 23:23:55 阅读1900 评论2 字号:大中小 订阅 实训任务: 做单一灯的左移右移,八个发光二极管L1-L8分别接在单片机的P1.0→P1.2→P1.3......

    单片机课程设计报告[5篇]

    《单片机课程设计报告》 学校:专业:班级: 姓名: 学号: 指导教师: 摘要 由于单片机体积小、成本低、使用方便,所以被广泛地应用于仪器仪表、现场数据的采集和控制。通过本次课程......

    单片机计算器课程设计报告

    大连民族学院2007级电子信息工程专业单片机系统课程设计报告 机电信息工程学院 单片机系统课程设计报告 完成日期:2010年5月31日 系: 专业: 班级: 设计题目: 学生姓名: 指导教师:......

    单片机课程设计报告(范文)

    片 机 课 程 设 计 报学号、姓名:年级、专业:培养层次:课程名称:授课学时学分:考试成绩:授课或主讲教师签字:单 告1 单片机最小系统功能说明单片机的最小系统是由组成单片机系统必......

    单片机课程设计实习报告

    单片机课程设计实习报告本文由xiexiebang.comwww.xiexiebang.com小编推荐给大家参考阅读!实训任务:做单一灯的左移右移,八个发光二极管l1-l8分别接在单片机的p1.0→p1.2→p1.3......

    单片机课程设计报告--高云

    临沂师范学院信息学院07级电子信息科学与技术高云200707840111一、实验目的:1.掌握在8031系统中扩展8279键盘显示接口的方法。2.掌握8279的工作原理和编程方法。3.进一步掌握......

    PIC单片机课程设计报告

    河北联合大学轻工学院QINGGONG COLLEGE, HEBEI UNITED UNIVERSITY《PIC单片机课程设计》学生姓名: 学号: 学部:专业班级:指导教师:年月日一、课程设计目的本课程设计是在《PIC单......

    单片机课程设计报告规范

    《单片机原理与应用》课程设计规范1.课程设计说明书的组成A.封面:采用学院统一规定的封面。题目不超过25个字,要简练准确,可分两行书写。B.课程设计任务书:采用学院规定的统一格式,......