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