MC9S12XS单片机大作业 洗衣机控制器Word文档下载推荐.docx

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

MC9S12XS单片机大作业 洗衣机控制器Word文档下载推荐.docx

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

MC9S12XS单片机大作业 洗衣机控制器Word文档下载推荐.docx

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(

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

当前位置:首页 > 农林牧渔 > 农学

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

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