MC9S12XS单片机大作业 洗衣机控制器.docx

上传人:b****6 文档编号:4267284 上传时间:2022-11-28 格式:DOCX 页数:24 大小:144.45KB
下载 相关 举报
MC9S12XS单片机大作业 洗衣机控制器.docx_第1页
第1页 / 共24页
MC9S12XS单片机大作业 洗衣机控制器.docx_第2页
第2页 / 共24页
MC9S12XS单片机大作业 洗衣机控制器.docx_第3页
第3页 / 共24页
MC9S12XS单片机大作业 洗衣机控制器.docx_第4页
第4页 / 共24页
MC9S12XS单片机大作业 洗衣机控制器.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

MC9S12XS单片机大作业 洗衣机控制器.docx

《MC9S12XS单片机大作业 洗衣机控制器.docx》由会员分享,可在线阅读,更多相关《MC9S12XS单片机大作业 洗衣机控制器.docx(24页珍藏版)》请在冰豆网上搜索。

MC9S12XS单片机大作业 洗衣机控制器.docx

MC9S12XS单片机大作业洗衣机控制器

上海电力学院

大作业报告

 

课程名称:

嵌入式系统设计与实践

项目名称:

洗衣机控制器

班级:

姓名:

学号:

成绩:

________实验时间:

 

一、设计目的

运用C语言,HCS1216位单片机的知识,根据题目的要求进行软硬件的设计和调试,从而加深对于本课程知识点的理解,掌握了如何使用CodeWarrior来整合各种驱动模块,再通过算法实现硬件上的运行。

二、功能描述

最终运行程序实现的的功能为:

通过对于CodeWarrior软件的操作,编写代码,最终实现freescaleHCS12DG128单片机简单控制洗衣机洗衣功能。

DG128开启,通电后,LCD显示屏上面显示时间,开始计时LED显示灯(绿灯亮起)。

设置固定的洗衣定时时间,开始执行“洗衣”,LED绿灯灭,红灯亮,在LCD显示屏上面显示“洗衣”的倒计时定时。

定时时间到后,红灯灭,LCD上面的倒计时定被记录

三.实验设备及其连接

(一)定时模块

1.PC机一台

2.S12嵌入式开发系统一台

3.串行通信线一根

4.定时器实现溢出中断接线图

(二)LED指示灯模块

1.PC机一台

2.S12嵌入式开发系统一台

3.串行通信线一根

4.万用表一只

(三)LCD显示模块

1.PC机一台

2.S12嵌入式开发系统一台

3.串行通信线一根

3.HD44780兼容LCD一个

表7-1HD44780引脚信号

管脚号

符号

电平

方向

引脚含义说明

1

Vss

电源地

2

Vdd

电源(+5V)

3

V0

液晶驱动电源(0~5V)

4

RS

H/L

输入

寄存器选择;1-数据寄存器0-指令寄存器

5

R/

H/L

输入

读写操作选择:

1-读操作0-写操作

6

E

H/L

H→L

输入

使能信号:

R/

=0,E下降沿有效

R/

=1,E=1有效

7~10

DB0~DB3

三态

8位数据总线的低4位,若与MCU进行4位传送时,此4位不用

11~14

DB4~DB7

三态

8位数据总线的高4位,若与MCU进行4位传送时,只用此4位

15~16

E1~E2

输入

上下两行使能信号,只用于一些特殊型号

图7-2HD44780原理框图

四、设计方案

实验中需要添加的三个模块都是平时上课的时候做过的实验模块,所以要实现预期的功能,只需要在以前的程序的基础上稍加修改,把各个模块在主程序中联系起来,加以调用,就可以实现所要求的功能。

主要驱动模块有:

计数定时驱动模块:

Timer.c

LCD显示驱动模块:

LCD.c

LED指示驱动模块:

LED.c

五、程序设计代码

//头文件

#include"Includes.h"//总头文件

intput1(charc)

{

charc1;

c1=c/10+0x30;

returnc1;

}

intput2(charc)

{

charc1;

c1=c%10+0x30;

returnc1;

}

//主函数

intmain(void)

{

INT8Uremember;

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

constINT8U*g_DispalyInit="pleasewaittime00:

00:

00";

//receive_data中存放从串口接收来的要被显示的32个数据

INT8Ureceive_data[32];

DISABLE_INTERRUPTS;//禁止总中断

//1.芯片初始化

MCUInit();

//2.模块初始化

SCIInit();//

(1)串行口初始化

LCDInit();//

(2)键盘初始化

TimerInit();//

(2)定时器1初始化

//3.内存初始化

//

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

00:

00)

time[0]=0;

time[1]=30;

time[2]=30;

//

(2)临时变量remember初始化

remember=time[2];

//(3)全局变量TimInterCount初始化

TimInterCount=0;

//3.开放总中断

ENABLE_INTERRUPTS;

//4.开放各模块中断

EnableSCIReInt;//

(1)开放SCI0接收中断

EnableT1OVInt;//

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

//4.LCD显示初始化

LCDShow((INT8U*)g_DispalyInit);

//程序总循环入口

DDRA=0xff;

PORTA=0xbf;

LEDInit();

while

(1)

{

if(time[1]==30&time[2]==25)

{

PORTA=0x7f;

}

if(time[1]==30&time[2]==20)

{

PORTA=0xbf;

time[1]=0;

time[2]=0;

}

memcpy(receive_data,"pleasewaittime:

:

",32);

if(time[2]!

=remember)

{//SCISendN(3,time);//发送当前"时分秒"

receive_data[20]=put1(time[0]);

receive_data[21]=put2(time[0]);

receive_data[23]=put1(time[1]);

receive_data[24]=put2(time[1]);

receive_data[26]=put1(time[2]);

receive_data[27]=put2(time[2]);

remember=time[2];

LCDShow((INT8U*)receive_data);

//remember中存放当前秒值

}

}

}[MCUInit.h]

//[MCUInit.h]芯片初始化头文件-----------------------------------------------

//芯片初始化需要用到的头文件

#include//MCU映像寄存器名

#include"isr.h"//中断处理函数头文件

//芯片初始化相关函数声明

voidMCUInit(void);//芯片初始化函数声明

[MCUInit.c]

//[MCUInit.c]DG128芯片初始化函数-------------------------------------------*

//功能:

*

//芯片初始化设置:

通过设置CLKSEL寄存器,确定内部总线的时钟源;通过PLL编*

//程,设置PLLCLK;通过设置INTCR和COPCTL寄存器,分别决定是否允许IRQ中断和*

//看门狗。

*

//

(1)外部晶振=9.8304MhzBusClock=19.6608Mhz*

//

(2)禁止IRQ中断*

//(3)禁止看门狗*

//参数:

无*

//返回:

无*

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

//头文件

#include"MCUInit.h"//芯片初始化头文件

voidMCUInit(void)

{

//

(1)禁止总中断

DISABLE_INTERRUPTS;

//

(2)CLKSEL的第7位置0,选择系统时钟源为OSCCLK

//在PLL程序执行前,内部总线频率=OSCCLK/2

//clksel.7(PLL选择位)决定内部总线时钟来源

//=O,BusClock=OSCCLK/2;=1,BusClock=PLLCLK/2

CLKSEL&=0x7f;//此时:

BusClock=OSCCLK/2

//(3)禁止PLL

PLLCTL&=0xbf;//PLLCTL.6(pllon)设为0;先关闭PLL

//(4)根据需要的时钟频率设置SYNR和REFDV寄存器

//计算公式:

PLLCLK=2*OSCCLK*((SYNR+1)/(REFDV+1))

SYNR=0x01;//对PLLCLK增频的因子

REFDV=0x00;//对PLLCLK分频的因子

//(5)打开PLL

PLLCTL|=(1<<6);//PLLCTL.6(pllon)设为1;开PLL

//(6)通过判断CRGFLG寄存器的LOCK位,确定PLL是否稳定

while((CRGFLG&0x08)==0x00);

//(7)时钟频率稳定后,允许锁相环时钟源作为系统时钟源;

CLKSEL|=(1<<7);//本句执行后:

BusClock=PLLCLK/2

//(8)设置是否允许IRQ中断、是否允许看门狗

INTCR&=0xbf;//IRQCR.6(IRQEN)=0禁止IRQ中断(默认开)

COPCTL=0x00;//COPCTL.2-0(cr2:

cr0)=000禁止看门狗

}

//[GenneralFun.h]通用函数头文件---------------------------------------------

//通用函数需要用到的头文件

#include"Type.h"//类型别名定义

//通用函数相关函数声明

voidDelay(INT16U);//延时函数声明

//[GenneralFun.c]通用函数--------------------------------------------------*

//本文件包含:

*

//

(1)Delay:

延时函数*

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

//头文件

#include"GeneralFun.h"//通用函数头文件

//Delay:

延时函数-----------------------------------------------------------*

//功能:

用程序的方法延时一段时间*

//参数:

k=延时长度(0-65535)*

//返回:

无*

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

voidDelay(INT16Uk)

{

INT16Ui,j;

for(i=0;i

for(j=0;j<=500;j++);

}

/[Includes.h]总头文件-----------------------------------------------------*

//本文件包含:

*

//主函数(main)文件中用到的头文件,外部函数声明及有关常量命名*

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

//1.包含通用头文件

#include"Type.h"//类型别名定义

#include"isr.h"//中断处理函数头文件

#include"MCUInit.h"//芯片初始化头文件

#include"GeneralFun.h"//通用函数头文件

//2.包含面向硬件对象头文件

#include"LCD.h"//液晶显示头文件

#include"SCI.h"//串行通信头文件

#include"Timer.h"//定时器头文件

#include"LED.h"//LED驱动

//3.定义全局变量

//3.1.LED显示缓冲区

INT8ULEDbuf[4];

//3.2.SCI接收缓冲区

INT8UReBuf[4];

//3.3.正确接收标志位(0:

接收并成功接收;1:

没有接收或接收失败)

INT8UReFlag=1;//初始时还没有开始接收数

//3.全局变量声明

INT8UTimInterCount;//中断次数

INT8Utime[3];//存放时,分,秒

#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"

/[LED.h]LED驱动头文件-----------------------------------------------------*

//说明:

本文件与具体的硬件连线方式和芯片型号有关*

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

//头文件

#include//MCU映像寄存器名

#include"Type.h"//类型别名定义

//LED驱动相关寄存器宏定义

#defineLEDdataPORTB//LED数据口

#defineLEDdata_DDDRB//数据口相应方向寄存器

#defineLEDcsPTH//LED位选口

#defineLEDcs_DDDRH//位选口相应方向寄存器

//小灯控制引脚定义

#defineLight_PPORTA//灯(Light)接在PTA口

#defineLight_DDDRA//相应的方向寄存器

#defineLight_Pin1//灯所在的引脚

//外部函数声明

voidLEDInit(void);//4连排LED初始化

voidLEDShow(INT8U*Buf);//在4连排LED上显示4个十进制数

//内部函数声明

voidLEDShow1(INT8Ui,INT8Uc);//在1个LED上显示数字

//小灯控制相关函数声明

voidLEDInit(void);//定义控制小灯的MCU引脚为输出

voidLED_L_A(INT8Uflag);//驱动小灯"亮"、"暗"

//[LED.c]LED驱动-----------------------------------------------------------*

//本文件包含:

*

//

(1)LEDInit:

4连排LED初始化*

//

(2)LEDShow:

在4连排LED上显示4个十进制数*

//(3)LEDShow1:

在1个LED上显示数字*

//硬件连接:

*

//

(1)PTB7-0分别接LED的数据线hgfedcba*

//

(2)PTH7-4分别接各LED的位选线(自右到左)*

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

#include"LED.h"//该头文件包含LED驱动相关寄存器宏定义

//LEDinit:

4连排LED初始化---------------------------------------------------*

//功能:

定义LED控制引脚的数据口和位选口为输出*

//参数:

无*

//返回:

无*

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

voidLEDInit(void)

{

LEDdata_D=0xFF;//数据口为输出

LEDcs_D|=0xF0;//位选口为输出

Light_D|=1<

Light_P|=1<

}

//LEDShow:

在4连排LED上显示4个十进制数-------------------------------------*

//功能:

在4连排LED上显示以Buf为首地址的4个数据*

//参数:

Buf=待显示数据的首地址*

//返回:

无*

//内部调用:

LEDshow1*

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

voidLEDShow(INT8U*Buf)

{

INT8Ui,c;

INT16Uj;

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

{

c=Buf[i]-'0';

LEDShow1(3-i,c);

//延时

for(j=0;j<=100;j++);

}

}

voidLED_L_A(INT8Uflag)

{

if(flag=='A')

Light_P|=1<

elseif(flag=='L')

Light_P&=~(1<

}

//LEDShow1:

在1个LED上显示数字----------------------------------------------*

//功能:

在第i个LED上显示数字c(要查表转码)*

//参数:

*

//

(1)i:

要显示的LED位号(从右到左0-3)*

//

(2)c:

要显示的数字(0-9)*

//返回:

无*

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

//显示码表

constINT8UDtable[10]=

//0123456789

{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//片选表

constINT8UCStable[4]=

//0123

{0x7F,0xBF,0xDF,0xEF};

voidLEDShow1(INT8Ui,INT8Uc)

{

LEDcs=CStable[i];

LEDdata=Dtable[c];

}

//[SCI.h]串行通信头文件-----------------------------------------------------

//串行通信需要用到的头文件

#include//MCU映像寄存器名

#include"Type.h"//类型别名定义

//串行通信寄存器及标志位定义

#defineReSendStatusRSCI0SR1//SCI状态寄存器

#defineReTestBit5//接收缓冲区满标志位

#defineSendTestBit7//发送缓冲区空标志位

#defineReSendDataRSCI0DRL//数据寄存器

//串行通信相关函数声明

voidSCIInit(void);//串行口初始化函数声明

voidSCISend1(INT8Uo);//串行发送1个字节

voidSCISendN(INT8Un,INT8Uch[]);//串行发送n个字节

INT8USCIRe1(INT8U*p);//串行接收1个字节

INT8USCIReN(INT8Un,INT8Uch[]);//串行接收n个字节

//[SCI.c]串行通信----------------------------------------------------------*

//本文件包含:

*

//

(1)SCIInit:

串行口初始化*

//

(2)SCISend1:

串行发送1个字节*

//(3)SCISendN:

串行发送n字节*

//(4)SCIRe1:

串行接收1字节*

//(5)SCIReN:

串行接收n字节*

//硬件连接:

*

//MCU的SCI0模块接口与PC方的串行口相连*

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

//头文件

#include"SCI.h"//串行通信头文件

//SCIInit:

DG128串行口0初始化函数-------------------------------------------*

//功能:

*

//开SCI0关SCI1,关串口中断,对串行口进行初始化,默认为允许SCI,正常码输出*

//,8位数据,无校验等,允许发送器允许接收器.查询方式收发,波特率为9600*

//(设fBUS=19.6608Mhz)*

//参数:

无*

//返回:

无*

//说明:

*

//

(1)若初始化SCI1,只需SCI0->SCI1*

//

(2)该初始化函数与芯片有关*

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

voidSCIInit(void)

{

INT8Ut;

//定义波特率Bt=9600,SCI0BD=fBUS/(16*Bt)

SCI0BDL=0x80;//须先给低8位赋值

SCI0BDH=0x00;//再给高8位赋值

SCI0CR1=0x00;//设置允许SCI,正常码输出,8位数据,无校验

t=SCI0DRL;//读数据寄存器(清0)

t=SCI0SR1;//读状态寄存器(清0)

SCI0CR2=0x0C;//允许SCI0接收和发送查询方式

}

//SCISend1:

串行发送1个字节-------------------------------------------------*

//功能:

串行发送1个字节*

//参数:

o=要发送的数据*

//返回:

无*

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

voidSCISend1(

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

当前位置:首页 > 高等教育 > 医学

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

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