单片机课程设计.docx

上传人:b****8 文档编号:9563584 上传时间:2023-02-05 格式:DOCX 页数:37 大小:312.28KB
下载 相关 举报
单片机课程设计.docx_第1页
第1页 / 共37页
单片机课程设计.docx_第2页
第2页 / 共37页
单片机课程设计.docx_第3页
第3页 / 共37页
单片机课程设计.docx_第4页
第4页 / 共37页
单片机课程设计.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

单片机课程设计.docx

《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(37页珍藏版)》请在冰豆网上搜索。

单片机课程设计.docx

单片机课程设计

 

课程设计报告

 

课程设计名称:

温度测量系统

系别:

三系

学生姓名:

班级:

学号:

成绩:

指导教师:

王志超

开课时间:

2013—2014学年第二学期

 

 

目录

1.引言2

1.1系统背景2

1.2系统功能2

2.系统总体方案2

2.1S08AW微控制器介绍2

2.2系统硬件框图3

3.硬件设计4

3.1单片机(MCU)模块4

3.1.1MC9S08AW60单片机性能概述4

3.1.2内部结构简图4

3.2串行通信模块5

3.2.1MAX232引脚图5

3.2.2液晶显示模块6

3.3温度测量显示系统7

4. 软件流程设计8

4.1MCU(C)程序8

4.1.1主程序(main.c)8

4.1.2中断子程序(Isr.c)11

4.1.3LCD子程序(LCD.c)12

4.1.4定时器(Timer.c)16

4.1.5串行通信子程序(SCI.c)18

4.1.6通用I/O端口(GPIO.c)23

4.1.7模数转换(AD.c)25

5. 系统测试28

5.1运行界面调试28

5.2运行结果图29

6.总结29

参考文献30

1.引言

1.1系统背景

随着科学技术的发展电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。

数字时钟,就是以数字显示取代模拟表盘的钟表,在显示上它用数字反应此时的时间,相比模拟钟能给人一种一目了然的感觉,不仅如此它还能同时显示时,分,秒。

而且能对时,分,秒准确校时,这是普通钟所不及的。

由于单片机集成度高,功能强,可靠性高,体积小,功耗低,使用方面,价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。

单片机的应用领域已从面向工业控制,通讯,交通,智能仪表等迅速发展到家用消费产品,办公自动化,汽车电子,PC机外围以及网络通讯等广大领域。

单片机系统座位一种典型的嵌入式系统,其系统设计包括硬件设计和软件设计编程设计两个方面,其调试过程一般分为软件调试,硬件调试,系统调试。

1.2系统功能

利用定时器设计一个电子钟,并定义一个启动键。

当按下该键时电子时钟从当前设定值开始走时。

按秒刷新,要求在LCD屏上显示时间和温度。

2.系统总体方案 

2.1S08AW微控制器介绍 

S08AW60拥有62KB片上在线可编程FLASH存储器和2KB片上RAM,具有模块保护与安全选项功能,支持2.7~5.5V电源。

片内总线时钟最高可达20MHz,可选择宽范围的时钟频率。

其内部集成了高性能模/数转换器(ADC)和串行通信模块,具有很宽的工作温度范围(-40℃~+125℃),可适应各类恶劣环境。

该芯片还可以通过BDM在计算机与微控制器进行在线编程及后台调试,避免频繁的插拔单片机,编译软件调试功能强大。

本设计选择了飞思卡尔公司生产的增强型8位微控制器MC9S08AW60(44引脚、LQFP封装)。

其拥有足够大的FLASH存储器和ROM,并带有高性能模/数转换器。

另外,体积小,稳定性高,调试方便。

2.2系统硬件框图

表2.1定时器显示控制系统的硬件构件划分

构件中文名称

构件英文名称

构件功能

类型

AW60最小系统

AW60-MnSys

AW60MCU的最小系统,包含BDM电路。

核心构件

电源

Power

将+24V电压转换为+3.3V电压。

中间构件

液晶显示

LCD

采用串行输入模式显示数据。

终端构件

图2.1MC9S08AW60外部工作电路原理图

图中AW60是主要模块,所有的信号都是经过AW60模块进行处理,各个功能模块在AW60模块的连接下才能够协调运行起来。

图中,左边一块是各异晶振和两个电容连接,用来产生标准的时钟脉冲,在AW60上面连接的是LCD液晶显示器,用来动态显示当前所计数的秒数,右边一个模块是接地使用,最下面的是一个开关模块,用来在程序加载后由此开关控制何时开始计数,何时暂停计数,以及一些复位等操作。

3.硬件设计 

3.1单片机(MCU)模块

3.1.1MC9S08AW60单片机性能概述

S80是单芯片8位微控制器解决法案。

MC9S08AW60/AW60/AW48/AW32/AW16是低成本高性能的8位饿、微处理器单元(MCU)S08家族中的成员。

家族中有的MCU使用增强型S08S核,且使用不同的模块,存储空间,存储器类型与封装类型。

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种封装形式只是引脚数量和形式有所区别,其他方面是一致的。

3.1.2内部结构简图

 

 

 

图3.1.2AW60MCU内部结构框图

图3.1.2给出了SW60内部结构框图,它对于我们理解和应用AW60MCU有重要作用,在学习了基本方法后,应再反过来熟悉这个内部结构图,以便好好地理解AW60MCU的基本原理。

从内部结构框图可以看出,AW60主要有以下部件:

S08CPU,存储器,定时器接口模块,定时器模块,看门狗模块,通用I/O模块,串行通信模块(SCI),串行外设接口模块(SPI),I2C(IIC)模块,A/D转换模块,键盘中断模块,时钟发生器模块,复位与中断模块等。

3.2串行通信模块

3.2.1MAX232引脚图

在MCU中,若用RS-232总线进行串行通信,则需外界电路实现电平转换,在发送端需要用驱动电平将TTL电平转换成RS-232电平;在接收端,需要用接收电路将RS-232电平转换为TTL电平。

电平转换器不仅可以由晶振管分立元件构成,也可以直接使用集成电路。

目前使用MAX232芯片比较多,该芯片使用单一+5V电源供电实现电平转换,上图的引脚说明:

(1)VCC(16脚):

正电源端,一般为+5V;

(2)GND(15脚):

接地;图3.2.1MAX232芯片

(3)Vs+(2j脚):

vs+=2vcc-1.5v=8.5v;

(4)Vs-(6脚):

vs-=-2vcc-1.5v=-11.5v;

(5)C2+,C2-(4,5脚):

一般接1uF的电解电容;

(6)C1+,C2-(1,3脚):

一般接1uF的电解电容。

3.2.2液晶显示模块

1.点阵字符型LCD基本特点:

LCD作为电子信息产品的主要显示器件,相对于其他类型的显示器件来说有其自身的特点,

主要包括:

(1)低电压,低功耗;

(2)平板型结构;

(3)使用寿命长;

(4)被动显示;

(5)显示信息量大且易于彩色化;

(6)无电磁辐射。

点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义符号的液晶显示器。

这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的阻容元件等集成一个液晶显示模板。

鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示器模块。

点阵字符型液晶显示器模块的控制器大多数为日立公司生产的HD44780及其兼容的控制电路,如:

SED1278(SEIKOEPSON),KS0066(SAMSUNG),NJU6408(NERJAPANRADIO)等。

2.字符型液晶显示器模块的特点如下:

(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)低功耗,高可靠性。

图3.2.2MCU控制液晶显示接口接线图

3.3温度测量显示系统

温度采集系统的硬件部分是由温度采集模块、MCU控制器模块、温度显示模块组成。

具体框图如下图3.3所示:

图3.3-1系统硬件框图

该模块是根据热敏电阻阻值随温度变化而变化的特性,利用串联分压的特点,将热敏电阻所分的电压送到MC9S08AW60的模拟量输入端。

具体电路原理如图3.3-2所示:

图3.3-2温度采集模块电路原理图

该电路中R4为热敏电阻,其电压传输到MC9S08AW60单片机的模拟量输入端,即B0口。

4. 软件流程设计  

4.1MCU(C)程序

4.1.1主程序(main.c)

#include"Includes.h"

//在此添加全局变量定义

uint8time[3];//记录时间的数组

uint16dpj;//存放模拟量

signedintT;//温度

constsignedintV_T_table[2][17]={

{0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,255},

{0,79,56,43,34,27,21,15,10,5,-1,-6,-11,-18,-26,-40,0}/*存放A/D转换值和温度值的表*/

};

voidmain(void)

{

//定义初始显示缓存并赋初值

uint8i=0;

uint8LCDbuff[]="Producer:

dpjDate:

2014-06-19...";//32个空格,显示屏初始字符

uint8remember;//记录当前秒数的变量

//1关总中断

DisableInterrupt();//禁止总中断

//2芯片初始化

MCUInit();

LCDinit();//LCD初始化

GPIO_Init(LCD_Run_PORT,0,0,0);

//3模块初始化

TPMinit

(1);//

(1)定时器1初始化

ADCInit();

//4串行口初始化

SCIInit(1,SYSTEM_CLOCK,9600);//用SCI1,系统时钟为时钟源,波特率为9600

//4内存初始化

time[0]=15;//

(1)"时分秒"缓存初始化(00:

00:

00)

time[1]=0;

time[2]=0;

remember=time[2];//

(2)临时变量remember初始化

LCDshow(LCDbuff);//显示初始字符"Producer:

dpjDate:

2014-06-19..."

//5开放中断

EnableSCIReInt();//

(1)开放串口接受中断

EnableTimer

(1);//

(2)开放定时器1溢出中断

EnableInterrupt();//(3)开放总中断

//6主循环

while

(1)

{

if(GPIO_Get(LCD_Run_PORT,0)==LCD_Run)//获取F端口0口引脚状态LCD_Run为0

{

if(time[2]!

=remember)n

{

SCISendN(1,3,time);

LCDbuff[0]=time[0]/10+'0';

LCDbuff[1]=time[0]%10+'0';

LCDbuff[2]=':

';

LCDbuff[3]=time[1]/10+'0';

LCDbuff[4]=time[1]%10+'0';

LCDbuff[5]=':

';

LCDbuff[6]=time[2]/10+'0';

LCDbuff[7]=time[2]%10+'0';

LCDbuff[8]='';

LCDshow(LCDbuff);

remember=time[2];

}

}

dpj=ADCAve(AD_CH_0,200);

if(dpj<=V_T_table[0][1])

{

T=V_T_table[1][1];/*当A/D转换值在0~16时,按79摄氏度赋值*/

}

elseif(dpj>=V_T_table[0][15])

{

T=V_T_table[1][15];/*当A/D转换值在240~255时,按-40摄氏度赋值*/

}

else

{

for(i=1;i<=14;i++)

{

if(dpj==V_T_table[0][i])/*表中是否有值*/

{

T=V_T_table[1][i];/*有值,赋值给T*/

break;

}

elseif((dpj>V_T_table[0][i])&&(dpj

{T=((V_T_table[1][i+1]-V_T_table[1][i])*100)/16;

T=T*(dpj-V_T_table[0][i]);/*没有,找到区间并插值*/

T=V_T_table[1][i]+T/100;

T=T+20;

break;}

}

LCDbuff[10]='T';

LCDbuff[11]='=';

LCDbuff[12]=T/10+'0';

LCDbuff[13]=T%10+'0';

LCDbuff[14]='C';

}

}

}

4.1.2中断子程序(Isr.c)

interruptvoidisrSCIre(void)

{uint8temp;

DisableInterrupt();//禁止总中断

temp=SCIReN(1,3,time);//接收3个字节,放入time数组

EnableInterrupt();//开放总中断

}

//未定义的中断处理函数,本函数不能删除

interruptvoidisrDummy(void)

{}

//中断处理子程序类型定义

typedefvoid(*ISR_func_t)(void);

//中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目

constISR_func_tISR_vectors[]@0xFFCC=

{isrDummy,//时基中断

isrDummy,//IIC中断

isrDummy,//ADC转换中断

isrDummy,//键盘中断

isrDummy,//SCI2发送中断

isrDummy,//SCI2接收中断

isrDummy,//SCI2错误中断

isrDummy,//SCI1发送中断

isrSCIre,//SCI1接收中断

isrDummy,//SCI1错误中断

isrDummy,//SPI中断

isrDummy,//TPM2溢出中断

isrDummy,//TPM2通道1输入捕捉/输出比较中断

isrDummy,//TPM2通道0输入捕捉/输出比较中断

isrT1Out,//TPM1溢出中断

isrDummy,//TPM1通道5输入捕捉/输出比较中断

isrDummy,//TPM1通道4输入捕捉/输出比较中断

isrDummy,//TPM1通道3输入捕捉/输出比较中断

isrDummy,//TPM1通道2输入捕捉/输出比较中断

isrDummy,//TPM1通道1输入捕捉/输出比较中断

isrDummy,//TPM1通道0输入捕捉/输出比较中断

isrDummy,//ICG的PLL锁相状态变化中断

isrDummy,//低电压检测中断

isrDummy,//IRQ引脚中断

isrDummy,//SWI指令中断

//RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o文件中)

};

4.1.3LCD子程序(LCD.c)

#include"LCD.h"//该头文件包含寄存器及相关位定义

voidLCDshow(uint8str[])

{uint8i,cmd2;

//1LCD初始化

LCDinit();

//2显示第1行16个字符

//2.1设置显示首地址

AW60_LCDctrl1=(AW60_LCDctrl1

&~AW60_LCDctrl1_RS

&~AW60_LCDctrl1_RW);

cmd2=(0|AW60_LCDdata_PTAD7);

LCDcommand(cmd2);

//2.2写16个数据到DDRAM

AW60_LCDctrl1=(AW60_LCDctrl1

|AW60_LCDctrl1_RS

&~AW60_LCDctrl1_RW);

for(i=0;i<16;i++)//将要显示在第1行上的16个数据逐个写入DDRAM中

{LCDcommand(str[i]);}

//3显示第2行16个字符

//3.1设置显示首地址

AW60_LCDctrl1=(AW60_LCDctrl1

&~AW60_LCDctrl1_RS

&~AW60_LCDctrl1_RW);

cmd2=(0|AW60_LCDdata_PTAD7

|AW60_LCDdata_PTAD6);

LCDcommand(cmd2);

//3.2再写16个数据到DDRAM

AW60_LCDctrl1=(AW60_LCDctrl1

|AW60_LCDctrl1_RS

&~AW60_LCDctrl1_RW);

for(i=16;i<32;i++)//将要显示在第2行上的16个数据逐个写入DDRAM中

{LCDcommand(str[i]);}

}

//-------------------------------------------------------------------------*

//函数名:

LCDinit*

//功能:

初始化LCD(HD44780),设置显示方式,输入方式,并清屏*

//参数:

无*

//返回:

无*

//说明:

调用了LCDcommand函数*

//-------------------------------------------------------------------------*

voidLCDinit(void)

{uint16i;

uint8cmd1;

//定义数据口(PTD0-7)为输出

AW60_LCDdataD=(0

|AW60_LCDdataD_PTADD7

|AW60_LCDdataD_PTADD6

|AW60_LCDdataD_PTADD5

|AW60_LCDdataD_PTADD4

|AW60_LCDdataD_PTADD3

|AW60_LCDdataD_PTADD2

|AW60_LCDdataD_PTADD1

|AW60_LCDdataD_PTADD0);

//定义控制口(PTC4,PTC6)为输出

AW60_LCDctrlD1=(AW60_LCDctrlD1

//|AW60_LCDctrl_E

|AW60_LCDctrl1_RW

|AW60_LCDctrl1_RS);

AW60_LCDctrl1=(AW60_LCDctrl1

&~AW60_LCDctrl1_RS

&~AW60_LCDctrl1_RW);

//定义控制口(PTF6)为输出

AW60_LCDctrlD2=(AW60_LCDctrlD2

|AW60_LCDctrl2_E);

//|AW60_LCDctrl1_RW//|AW60_LCDctrl1_RS

AW60_LCDctrl2=(AW60_LCDctrl2

&~AW60_LCDctrl2_E);

//1功能设置

cmd1=(0

|AW60_LCDdata_PTAD5

|AW60_LCDdata_PTAD4

|AW60_LCDdata_PTAD3);

LCDcommand(cmd1);//5*7点阵模式,2行显示,8位数据总线

//2显示开关控制

cmd1=(0

|AW60_LCDdata_PTAD3);

LCDcommand(cmd1);//不闪烁,关光标显示,关显示

//3清屏

//3.1清DDRAM内容,光标回原位,清AC

cmd1=(0

|AW60_LCDdata_PTAD0);

LCDcommand(cmd1);

//3.2等待清屏完毕,时间>1.6ms

for(i=0;i<40000;i++)

asm("NOP");

//4输入方式设置

cmd1=(0

|AW60_LCDdata_PTAD2

|AW60_LCDdata_PTAD1);

LCDcommand(cmd1);//显示不移动,光标左移(A=1),数据读写操作后,AC自动增1

//5光标或画面移位设置

cmd1=(0

|AW60_LCDdata_PTAD2

|AW60_LCDdata_PTAD4);

LCDcommand(cmd1);//光标右移一个字符位,AC自动加1

//6显示开关控制

cmd1=(0

|AW60_LCDdata_PTAD2

|AW60_LCDdata_PTAD3);

LCDcommand(cmd1);//不闪烁,关光标显示,开显示

}

//-------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1