第一篇:单片机课程设计报告--高云
临沂师范学院信息学院07级电子信息科学与技术高云20070784011
1一、实验目的:
1.掌握在8031系统中扩展8279键盘显示接口的方法。
2.掌握8279的工作原理和编程方法。
3.进一步掌握中断处理程序的编程方法。
二、实验设备:
CPU挂箱、8031CPU模块
三、实验内容:
利用8279键盘显示接口电路和实验箱上提供的6个数码显示,做成一个电子钟。
四、实验原理:
利用8279可实现对键盘/显示器的自动扫描,以减轻CPU的负担,且具有显示稳定、程序简单、不会出现误动作等特点。本实验利用8279实现显示扫描自动化。
8279操作命令字较多,根据需要来灵活使用,通过本实验可初步熟悉其使用方法。
电子钟做成如下格式:
HHMMSS由左向右分别为时、分、秒的十位、个位。
五、实验原理图:
六、程序框图:
七、实验程序
NAMESHIZHONG
PORTEQU0CFE8H
BUFEQU23H;
SBFEQU22H;
MBFEQU21H;
HBFEQU20H;
CSEG AT 0000H
LJMP START
CSEG AT 401BH
LJMP CLOCK
CSEG AT 4100H
START:MOVR0,#40H;40H-45H
MOVA,#00H;
MOV@R0,A;
INCR0
MOV@R0,A
INCR0
MOV@R0,A
INCR0
MOV@R0,A存放计数值 存放秒值 存放分值 存放时值 是显示缓冲区,依次存放 时高位、时低位,分高位、分低位,以及秒高位、秒底位
MOV@R0,A
INCR0
MOV@R0,A
MOVTMOD,#10H;定时器1初始化为方式1MOVTH1,#3CH;置时间常数,延时0.1秒MOVTL1,#0B0H
MOVBUF,#00H
MOVSBF,#55H;
MOVMBF,#58H
MOVHBF,#23H
SETBET
1SETBEA
SETBTR1;
DS1:MOVR0,#45H;
MOVR2,#5H;
DS2:MOVDPTR,#PORT+1
MOVA,R
2ORLA,#80H
MOVX@DPTR,A
MOVDPTR,#PORT
MOVA,@R0;
ACALLTABLE
MOVX@DPTR,A
MOVR3,#0FFH;
DEL:NOP
DJNZR3,DEL
DECR0;
CLRC
DECR2
MOVA,R2;
INCA
JNZDS2;
MOVR0,#45H
MOVA,SBF;
ACALLGET
MOVA,MBF;置显示时间初值 计时开始置显示缓冲区首址 置扫描初值,点亮最左边的LED6 得到的段显码输出到段数据口 延时一小段时间 显示缓冲字节加一 最末一位是否显示完毕?,如无则继续往下显示 把秒值分别放于44H,45H中 把分值分别放入42H,43H中
MOVA,HBF;把时值分别放入40H,41H中ACALLGET
SJMPDS1;转DS1从头显示起
TABLE:INCA;取与数字对应的段码
MOVCA,@A+PC
RET
DB3FH,06H,5BH,4FH,66H,6DH,7DH, 07H, 7FH,6FH
GET:MOVR1,A;
ANLA,#0FH;
MOV@R0,A
DECR0
MOVA,R1;
SWAPA;
ANLA,#0FH
MOV@R0,A
DECR0;R0
RET
CLOCK:MOVTL1,#0B0H;
MOVTH1,#3CH
PUSHPSW
PUSHACC
INCBUF;
MOVA,BUF;
CJNEA,#0AH,QUIT
MOVBUF,#00H;
MOVA,SBF
INCA;
DAA;
MOVSBF,A
CJNEA,#60H,QUIT;
MOVSBF,#00H;
MOVA,MBF
INCA;
DAA;
MOVMBF,A
CJNEA,#60H,QUIT;
MOVMBF,#00H;
MOVA,HBF
INCA;
DAA;
MOVHBF,A
CJNEA,#24H,QUIT;把从时或分或秒字节中取来的值高 位屏蔽掉,并送入缓冲区 把从时或分或秒字节中取来的值低 位屏蔽掉,并送入缓冲区 指针下移一位 置时间常数 计数加一 计到10否?没有则转到QUIT退出中断置初值 秒值加一,经十进制调整后放入 秒字节 计到60否?没有则转到QUIT退中断是,秒字节清零 分值加一,经十进制调整后放入 分字节 分值为60否?不是则退出中断 是,清零 时值加一,经十进制调整后放入 时字节 时值为24否?不是则退出中断
MOVHBF,#00H;是,清零
QUIT:POPACC
POPPSW
RETI;中断返回
END
八、实验步骤:
本试验不必接线。运行shizhong.asm,观察数码管显示。
九、实验结果:
数码管上显示由左向右分别为时、分、秒的十位、个位。
第二篇:单片机课程设计报告格式
《单片机课程设计》报告格式
一、封面(注明:单片机课程设计报告、课题名称、班级、姓名、指导教师、日期)
二、摘要(课题简要说明)
三、课题设计目标(功能、性能指标)、方案论证(要求作两种以上方案比较)
四、设计过程(关键电路工作原理、元器件参数选用、程序流程图、程序)
五、软硬件的安装、调试方法
六、完整电路图、性能参数测试
七、存在的问题和改进方向
八、参考文献资料
第三篇:单片机课程设计报告格式
单片机课程设计报告格式要求
统一的A4纸打印。每页约44行,每行约34字;打印正文用宋体小四号字;版面页边距上空2.5cm,下空2cm,左空2.5cm,右空2cm;页码用小五号字,底端居中。
A、封面;B、课程设计任务书;C、摘要; D、目录; E、正文;F、参考文献;G、附录(源程序代码);H、有关图纸(系统的总体原理图)
摘要(内容提要)
摘要是论文内容的简要陈述,应尽量反映主要信息,内容包括研究目的、方法、成果和结论,不含图表,不加注释,具有独立性和完整性,‚摘要‛字样位置居中。
目录
目录按三级标题编写,要求层次清晰,且要与正文标题一致。主要包括绪论、正文主体、结论、主要参考文献及附录等。
题序层次大致有以下几种格式:
1、绪论
1.1课题背景
ˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ
1.2交会对接技术发展概况
ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ
1.2.1俄罗斯空间交会对接发展概况
ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ
1.2.2美国空间交会对接发展概况
ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ
2、空间飞行器
2.1引言
ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ
结论
ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ
主要参考文献
为了反映报告的科学依据和作者尊重他人研究成果的严肃态度,同时向读者提供有关信息的出处,正文之后一般应列出主要参考文献(只限于那些作者亲自阅读过的,最重要的且发表在公开出版物上的文献或网上下载的资料)。报告中被引用的参考文献序号置于所引用部分的右上角。参考文献所列著作按报告中引用顺序排列,著作按如下格式著录:序号、著作者、书名、出版地、出版社、出版日期。
例1(著作):1.宋尚桂.大学通识教育的理论和模式.青岛:中国海洋大学出版社,2007年9月
例2(文章):2.朱晓刚.以人为本----美国大学通识教育理念和实践的解读.民办教育研究,2005(5)
设计报告装订顺序
(一)课程设计封面
(二)课程设计任务书
(三)摘要
(四)目录
例:
1、绪论ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ
11.1课题背景ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ1
1.2交会对接技术发展概况ˉˉˉˉˉˉˉˉˉˉˉˉˉ
31.2.1俄罗斯空间交会对接发展概况ˉˉˉˉˉˉˉˉˉ
51.2.2美国空间交会对接发展概况ˉˉˉˉˉˉˉˉˉˉ72、空间飞行器ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ20
2.1引言ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ20
2.2空间飞行器姿态表示ˉˉˉˉˉˉˉˉˉˉˉˉˉˉ23 结论ˉˉˉˉˉˉˉˉˉˉˉˉ ˉˉˉˉˉˉˉˉˉˉ50 主要参考文献ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ
51(五)正文
(六)参考文献
(七)附录
(八)有关图纸
撰写设计报告的几点要求
1、文字
设计中汉字应采用《简化汉字总表》规定的简化字,并严格执行汉字的规范,所有文字字面清晰,不得涂改。
第一层次(章)题序和标题居中放置,其余各层次(节、条、款)题序和标题一律沿版面左侧边线顶格排列。第一层次(章)题序和标题距下文双倍行距。段落开始后缩两个字。行与行之间,段落和层次标题以及各段落之间均为单倍行距。
第一层次(章)题序和标题用小二号黑体字。题序和标题之间空两个字,不加标点,下同。
第二层次(节)题序和标题用小三号黑体字。
第三层次(条)题序和标题用四号黑体字。
第四层次及以下层次题序及标题一律用小四号黑体字。
结论(结束语)作为单独一章排列,但标题前不加‚第XXX‛字样。结论是整个设计的总结,应以简练的文字说明所做的工作。
2、表格
设计中的表格可以统一编序,也可以逐章单独编序,方式应与插图及公式的编序方式统一。表序必须连续,不得重复或跳跃。表格的结构应简洁,各栏都应标注量和相应的单位。表格内数字须上下对齐,相邻栏内的数值相同时,不能用‘同上’、‘同左’和其它类似用词,应一一重新标注。表序和表题置于表格上方中间位置,无表题的表序置于表格的左上方或右上方(同一篇论文位置应一致)。
3、插图
插图要精选,图序可以连续编序,也可以逐章单独编序,方式应与表格、公式的编序方式统一,图序必须连续,不得重复或跳跃。仅有一图时,在图题前加‘附图’字样。设计中的插图以及图中文字符号应打印,无法打印时一律用钢笔绘制和标出。由若干个分图组成的插图,分图用a,b,c,……标出。图序和图题置于图下方中间位置。
4、公式
设计中重要的或者后文中须重新提及的公式应注序号并加圆括号,序号一律用阿拉伯数字连续编序或逐章编序,序号排在版面右侧,且距右边距相等。公式与序号之间不加虚线。
5、数字用法
公历世纪、年代、年、月、日、时间和各种计数、计量,均用阿拉伯数字。年份不能简写(如1999年不能写成99年)。数值的有效数字应全部写出,如:0.50∶20.0不能写作0.5∶20。
6、软件
软件流程图和原程序清单要按软件文档格式附在报告后面,特殊情况可在答辩时展示,不附在报告内。
7、计量单位的定义和使用方法按国家计量标准执行。
第四篇:单片机课程设计报告
《单片机原理与接口技术》
课程设计报告
设计题目: 基于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(这是格式)
附录
江西工业职业技术学院电子与信息工程系
课程设计指导教师评语
班级:
学生姓名:
学号:
指导教师评语(包括工作态度,遵守纪律;基本理论、知识、技能;独立工作能力和分析解决问题的能力;完成任务情况及水平):
学生成绩(五级分制):
指导教师签名:
****年**月**日
第五篇:单片机课程设计报告
课程设计报告
题 目: 自动滴灌系统设计
课程名称: 单片机原理及应用 学 院: 信息工程学院
专 业: 计算机科学与技术 班 级: 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