MC9S12XS单片机大作业 洗衣机控制器.docx
- 文档编号:4267284
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:24
- 大小:144.45KB
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
#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 #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 #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(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MC9S12XS单片机大作业 洗衣机控制器 MC9S12XS 单片机 作业 洗衣机 控制器