MC9S12XS单片机大作业 洗衣机控制器Word文档下载推荐.docx
《MC9S12XS单片机大作业 洗衣机控制器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MC9S12XS单片机大作业 洗衣机控制器Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
3
V0
液晶驱动电源(0~5V)
4
RS
H/L
输入
寄存器选择;
1-数据寄存器0-指令寄存器
5
R/
读写操作选择:
1-读操作0-写操作
6
E
H→L
使能信号:
=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)
{
c1=c%10+0x30;
}
//主函数
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)
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)
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]);
LCDShow((INT8U*)receive_data);
//remember中存放当前秒值
}[MCUInit.h]
//[MCUInit.h]芯片初始化头文件-----------------------------------------------
//芯片初始化需要用到的头文件
#include<
mc9s12dg128.h>
//MCU映像寄存器名
isr.h"
//中断处理函数头文件
//芯片初始化相关函数声明
voidMCUInit(void);
//芯片初始化函数声明
[MCUInit.c]
//[MCUInit.c]DG128芯片初始化函数-------------------------------------------*
//功能:
*
//芯片初始化设置:
通过设置CLKSEL寄存器,确定内部总线的时钟源;
通过PLL编*
//程,设置PLLCLK;
通过设置INTCR和COPCTL寄存器,分别决定是否允许IRQ中断和*
//看门狗。
//
(1)外部晶振=9.8304MhzBusClock=19.6608Mhz*
//
(2)禁止IRQ中断*
//(3)禁止看门狗*
//参数:
无*
//返回:
//-------------------------------------------------------------------------*
MCUInit.h"
//芯片初始化头文件
voidMCUInit(void)
//
(1)禁止总中断
//
(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&
//IRQCR.6(IRQEN)=0禁止IRQ中断(默认开)
COPCTL=0x00;
//COPCTL.2-0(cr2:
cr0)=000禁止看门狗
}
//[GenneralFun.h]通用函数头文件---------------------------------------------
//通用函数需要用到的头文件
Type.h"
//类型别名定义
//通用函数相关函数声明
voidDelay(INT16U);
//延时函数声明
//[GenneralFun.c]通用函数--------------------------------------------------*
//本文件包含:
//
(1)Delay:
延时函数*
GeneralFun.h"
//通用函数头文件
//Delay:
延时函数-----------------------------------------------------------*
用程序的方法延时一段时间*
k=延时长度(0-65535)*
voidDelay(INT16Uk)
INT16Ui,j;
for(i=0;
i<
k;
i++)
for(j=0;
j<
=500;
j++);
/[Includes.h]总头文件-----------------------------------------------------*
//主函数(main)文件中用到的头文件,外部函数声明及有关常量命名*
//1.包含通用头文件
//2.包含面向硬件对象头文件
LCD.h"
//液晶显示头文件
SCI.h"
//串行通信头文件
Timer.h"
//定时器头文件
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驱动头文件-----------------------------------------------------*
//说明:
本文件与具体的硬件连线方式和芯片型号有关*
//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上显示数字
//小灯控制相关函数声明
//定义控制小灯的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的位选线(自右到左)*
//该头文件包含LED驱动相关寄存器宏定义
//LEDinit:
4连排LED初始化---------------------------------------------------*
//功能:
定义LED控制引脚的数据口和位选口为输出*
//参数:
//返回:
voidLEDInit(void)
LEDdata_D=0xFF;
//数据口为输出
LEDcs_D|=0xF0;
//位选口为输出
Light_D|=1<
Light_Pin;
//令小灯引脚为输出
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'
)
//小灯"
elseif(flag=='
L'
Light_P&
=~(1<
Light_Pin);
//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]串行通信头文件-----------------------------------------------------
//串行通信需要用到的头文件
//类型别名定义
//串行通信寄存器及标志位定义
#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方的串行口相连*
//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个字节-------------------------------------------------*
o=要发送的数据*
voidSCISend1(