单片机课程设计 洗衣机控制器_第1页
单片机课程设计 洗衣机控制器_第2页
单片机课程设计 洗衣机控制器_第3页
单片机课程设计 洗衣机控制器_第4页
单片机课程设计 洗衣机控制器_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上海电力学院16位单片机大作业实验报告 实验名称: 洗衣机控制器 专 业: 通信工程 姓 名: 班 级: 学 号: 一、设计目的运用C语言,深入了解MC9S12XS128单片机的知识,根据题目的要求进行软硬件的设计和调试,从而加深对于本课程知识点的理解,掌握了如何使用CodeWarrior来整合各种驱动模块,再通过算法实现硬件上的运行。二、功能描述最终运行程序实现的的功能为:通过对于CodeWarrior 软件的操作,编写代码,最终实现freescale MC9S12XS128单片机简单控制洗衣机洗衣功能。按自己的要求将实验箱连线,通电后,LCD显示屏上面上排显示可以设定的时间,下排显示倒计时

2、的时间,通过键盘输入设定的时间,开始计时,LED显示灯(绿灯亮起)。设置好固定的洗衣时间后,开始执行“洗衣”,倒计时完成后,即“洗衣”完成,在LCD显示屏上面显示“洗衣”的时间到,即时间到00:00,LED所有灯亮。三实验设备1PC机 一台2S12嵌入式开发系统 一台3连接导线 若干4小键盘 一个四模块(一)定时模块 定时器实现溢出中断接线图PTA0 PTA1 PTA2 PTA3 PTA4 PTA5 PTA6 PTA7PTA口(KEY1-8)Vcc导线接插点(二)LED指示灯模块0x55:绿灯亮 0xFF:全部灯亮 (三)LCD显示模块表7-1 HD44780引脚信号管脚号符号电平方向引脚含义

3、说明1Vss电源地2Vdd电源(+5V)3V0液晶驱动电源(05V)4RSH/L输入寄存器选择;1-数据寄存器 0-指令寄存器5R/H/L输入读写操作选择:1-读操作 0-写操作6EH/LHL输入使能信号:R/ =0,E下降沿有效 R/=1,E=1有效710DB0DB3三态8位数据总线的低4位,若与MCU进行4位传送时,此4位不用1114DB4DB7三态8位数据总线的高4位,若与MCU进行4位传送时,只用此4位1516E1E2输入上下两行使能信号,只用于一些特殊型号图7-1 MCU与LCD的连接LCD(HD44780)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

4、DB7DB6DB5DB4DB3DB2DB1DB0ER/WRSV0VddVSS+5VPTB7PTB6PTB5PTB4PTB3PTB2PTB1PTB0PTM6PTM3PTM2(四)键盘输入模块键盘接线原理图:实验箱提供一个16键键盘,用于键盘中断信号的输入。键盘插孔如下图所示。本实验中:(1) 键盘采用手动接线,将键盘接入双排插孔下一排插孔。(2) PTP03分别接键盘接线处的14;(3) PTA03分别接5-8;(4) PTB口接8个小灯。列线 n1 n2 n3 n4MCU内部上拉电阻键盘接线原理图12345678行线m1 m2 m3 m45VPTP0(PWM1)PTP1(PWM2)PTP2(G

5、PIO-78)PTP3(GPIO-77)PTA0(KEY1)PTA1(KEY2)PTA2(KEY3)PTA3(KEY4)2PTB0 PTB1 PTB2 PTB3 PTB4 PTB5 PTB6 PTB7PTB(LED1-LD0-7)五设计方案实验中需要添加模块都是平时上课的时候做过的实验模块,所以要实现预期的功能,只需要在以前的程序的基础上稍加修改,把各个模块在主程序中联系起来,加以调用,就可以实现所要求的功能。主要驱动模块有:计数定时模块:Timer.cLCD显示模块:LCD.cLED指示模块:Light.c键盘输入模块:KBI_I.c六程序设计代码main.c/包含头文件#include &

6、quot;Includes.h" /包含总头文件#include <string.h> /在此添加全局变量定义uint8 receive_data32;uint8 valve,mark,i, period,duty; extern uint8 time3,T6;/主函数void main() /0.1 主程序使用的变量定 uint32 mRuncount=0; /运行计数器 uint8 c; /0.2 关总中断 DisableInterrupt(); /0.3 芯片初始化 MCUInit(FBUS_32M); /0.4 模块初始化 Light_Init(Light_Run

7、_PORT,Light_Run,Light_OFF); /RUN指示灯初始化为暗 /PWMInit(0); /初始化PWM通道1 TimerInit(); /(1)定时器1初始化 LCDInit(); /液晶显示初始化 SCIInit(0,FBUS_32M,9600); /串口0初始化 KBInit(); /键盘初始化 /0.5 开放中断 EnableSCIReInt0; /开放SCI0接收中断 EnableKBint(); /开放键盘中断 EnableInterrupt(); /开放总中断 DDRB=0xff; PORTB=0x55; memcpy(receive_data,"St

8、art:00:00*Stop: : *",32); LCDShow(uint8 *)receive_data); / 主循环 for(;) if(receive_data22='0')&&(receive_data23='0')&&(receive_data25='0')&&(receive_data26='0') DisableTimer; PORTB=0xFF; isr.c/头文件包含,及宏定义区/头文件包含 #include "Includes.h"

9、; /包含总头文件 uint8 j=0,TimInterCount=0; uint8 T6=0; uint8 time3=0; extern uint8 valve; extern uint8 receive_data32; #pragma CODE_SEG _NEAR_SEG NON_BANKED /中断服务程序区 /未定义的中断处理函数,本函数不能删除,默认 _interrupt void isr_default(void) DisableInterrupt(); EnableInterrupt(); /定时器溢出中断处理程序 _interrupt void isrTimOver(void

10、) DisableInterrupt(); /关总中断 TimInterCount+; /中断次数加一,中断4次为一秒 if (TimInterCount >= 4) receive_data22=time1/10+'0' receive_data23=time1%10+'0' receive_data25=time2/10+'0' receive_data26=time2%10+'0' SecAdd1(time); /定时器更新 LCDShow(uint8 *)receive_data); TimInterCount=0;

11、 TFLG2 = 0x80; /清除定时器溢出标志位 EnableInterrupt(); /开总中断 /键盘中断 _interrupt void isrKeyBoard(void) uint16 i; DisableInterrupt(); DisableKBint(); for (i=0 ; i<20000; i+); /延时 valve = KBScanN(10);/扫描键值,存于value中 if(j<4) if(j=0) receive_data6= KBDef(valve); T0= KBDef(valve)-'0' if(j=1) receive_da

12、ta7= KBDef(valve); T1= KBDef(valve)-'0' if(j=2) receive_data9= KBDef(valve); T2= KBDef(valve)-'0' if(j=3) receive_data10= KBDef(valve); T3= KBDef(valve)-'0' j+; time1=T0*10+T1; time2=T2*10+T3; if(valve=0xD7) EnableTimer; PORTA=0xAA; LCDShow(uint8 *)receive_data); KBInit(); /键

13、盘初始化 EnableKBint(); /开放键盘中断 EnableInterrupt(); /开放总中断 Timer.c /头文件包含,及宏定义区 /头文件包含 #include "Timer.h" /定时器构件头文件 void TimerInit(void) /允许主定时器开始计数 TSCR1 = 0x80; /禁止定时器溢出中断,中断一次时间计算:t=n/(fbus/p)1/4秒, /其中n=65535,fbus=32MHZ TSCR2 = 0b00000111; / |_ / |_分频因子为27=128 / |_/ void SecAdd1(uint8 *p) *(

14、p+2) -= 1; /秒减1 if (*(p+2) < 0) /秒溢出 *(p+2) = 60; /清秒 *(p+1) -= 1; /分减1 if (*(p+1) < 0) /分溢出 *(p+1) = 60; /清时 *p -= 1; /时减1 if (*p < 0) /时溢出 *p = 24; /清时 Light.c #include "Light.h" /指示灯驱动程序头文件void Light_Init(uint16 port,uint8 name,uint8 state) GPIO_Init(port,name,1,state); /初始化指示灯

15、 void Light_Control(uint16 port,uint8 name,uint8 state) GPIO_Set(port,PRT,name,state); /控制引脚状态 void Light_Change(uint16 port,uint8 name) if(GPIO_Get(port,PRT,name)=Light_ON) /若原来为"亮",则变"暗" GPIO_Set(port,PRT,name,Light_OFF); else /若原来为"暗",则变"亮" GPIO_Set(port,PR

16、T,name,Light_ON);LCD.c #include "LCD.h" /LCD构件头文件/构件函数实现 void LCDInit(void) uint16 i; / 定义数据口为输出 GPIO_Set(LCD_P0,DDR,LCD_B0,1); GPIO_Set(LCD_P1,DDR,LCD_B1,1); GPIO_Set(LCD_P2,DDR,LCD_B2,1); GPIO_Set(LCD_P3,DDR,LCD_B3,1); GPIO_Set(LCD_P4,DDR,LCD_B4,1); GPIO_Set(LCD_P5,DDR,LCD_B5,1); GPIO_Se

17、t(LCD_P6,DDR,LCD_B6,1); GPIO_Set(LCD_P7,DDR,LCD_B7,1); / 定义控制口为输出 GPIO_Set(LCDRS_P,DDR,LCDRS_B,1); GPIO_Set(LCDRW_P,DDR,LCDRW_B,1); GPIO_Set(LCDE_P,DDR,LCDE_B,1); / 设置指令,RS,R/W = 00, 写指令代码 GPIO_Set(LCDRS_P,PRT,LCDRS_B,0); GPIO_Set(LCDRW_P,PRT,LCDRW_B,0); / 功能设置 LCD_Command(0b00111000); /|_ 可设任意值(0/1

18、) /|_ F = 0,5*7点阵模式 /|_ N = 1,2行显示 /|_ DL = 1,8位数据总线 /|_ 固定为001 / 显示开关控制 LCD_Command(0b00001000); /|_ B = 0,不闪烁 /|_ C = 0,关光标显示 /|_ D = 0,关显示 /|_ 固定为00001 / 清屏 / 清DD RAM内容,光标回原位,清AC LCD_Command(0b00000001); / 等待清屏完毕,时间 > 1.6ms for (i=0; i<20000; i+); / 输入方式设置 LCD_Command(0b00000110); /|_ 显示不移动

19、,光标左移(A = 1) /|_ 数据读写操作后,AC自动增1 /|_ 固定为000001 / 光标或画面移位设置 LCD_Command(0b00010100); /|_ 可设任意值(0/1) /|_ 光标右移一个字符位,AC自动加1 /|_ 固定为0001 / 显示开关控制 LCD_Command(0b00001100); /|_ B = 0,不闪烁 /|_ C = 0,关光标显示 /|_ D = 1,开显示 /|_ 固定为00001 void Delay1(uint16 k) uint16 i,j; for (i=0; i<k; i+) for (j=0; j<=500; j

20、+); /LCDShow:在HD44780显示屏上显示数据 void LCDShow(uint8 str) uint8 i; / LCD初始化 LCDInit(); / 显示第1行16个字符 /设置显示首地址 GPIO_Set(LCDRS_P,PRT,LCDRS_B,0); /RS,R/W = 00(写的是指令) GPIO_Set(LCDRW_P,PRT,LCDRW_B,0); LCD_Command(0x80); /后7位为DD RAM地址(0x00) /2.2写16个数据到DD RAM GPIO_Set(LCDRS_P,PRT,LCDRS_B,1); /RS,R/W = 10(写的是数据)

21、 GPIO_Set(LCDRW_P,PRT,LCDRW_B,0); / 将要显示在第1行上的16个数据逐个写入DD RAM中 for (i = 0;i < 16;i+) LCD_Command(stri); / 显示第2行16个字符 /设置显示首地址 GPIO_Set(LCDRS_P,PRT,LCDRS_B,0); /RS,R/W = 00(写的是指令) GPIO_Set(LCDRW_P,PRT,LCDRW_B,0); LCD_Command(0xC0); /后7位为DD RAM地址(0x40) / 再写16个数据到DD RAM GPIO_Set(LCDRS_P,PRT,LCDRS_B,

22、1); /RS,R/W = 10(写的是数据) GPIO_Set(LCDRW_P,PRT,LCDRW_B,0); / 将要显示在第2行上的16个数据逐个写入DD RAM中 for (i = 16;i < 32;i+) LCD_Command(stri); /LCD_Command:执行给定的cmd命令 void LCD_Command(uint8 cmd) uint8 i; / 等待 > 40us Delay1(5); / 数据送到LCD的数据线上 GPIO_Set(LCD_P0,PRT,LCD_B0,(cmd >> 0) & 0x01); GPIO_Set(L

23、CD_P1,PRT,LCD_B1,(cmd >> 1) & 0x01); GPIO_Set(LCD_P2,PRT,LCD_B2,(cmd >> 2) & 0x01); GPIO_Set(LCD_P3,PRT,LCD_B3,(cmd >> 3) & 0x01); GPIO_Set(LCD_P4,PRT,LCD_B4,(cmd >> 4) & 0x01); GPIO_Set(LCD_P5,PRT,LCD_B5,(cmd >> 5) & 0x01); GPIO_Set(LCD_P6,PRT,LCD_B

24、6,(cmd >> 6) & 0x01); GPIO_Set(LCD_P7,PRT,LCD_B7,(cmd >> 7) & 0x01); / 给出E信号的下降沿,使数据写入LCD GPIO_Set(LCDE_P,PRT,LCDE_B,1); for(i=0;i<10;i+) /延时 asm("NOP"); / Lcd结束接收数据 GPIO_Set(LCDE_P,PRT,LCDE_B,0); / 等待 > 40us Delay1(5);KBI_I.c/头文件包含,及宏定义区 /头文件包含 #include "KBI

25、_I.h" /键盘构件头文件/构件函数实现 void KBInit(void) GPPort_Set(KB_P,PTI,1,0x0F); /复位相应寄存器 GPPort_Set(KB_P,DDR,0,0xF0); /定义列线(PTP03)为输入 GPPort_Set(KB_A,PRT,0,0xF0); /复位相应寄存器 GPPort_Set(KB_A,DDR,1,0x0F); /行线(PTA03)为输出 GPPort_Set(KB_P,PER,1,0x0F); /输入引脚(列线)有内部上拉电阻 GPPort_Set(KB_P,PPS,0,0xF0); /下降沿产生中断 Disable

26、KBint(); /禁止键盘中断 GPPort_Set(KB_P,PIF,1,0x0F); /清除键盘中断请求 uint8 KBScan1(void) uint8 i,tmp; for (i = 0; i <= 3; i+) /最多将扫描4根行线 GPPort_Set(KB_A,PRT,1,0x0F); /当前扫描的一行,输出低电平 GPPort_Set(KB_A,PRT,0,(1<<i); asm("NOP"); asm("NOP"); /读取键盘口数据寄存器 tmp=GPPort_Get(KB_P,PTI)&0x0F; /通

27、过观察4根列线中是否出现低电平来判断当前行有无按键 if (tmp != 0x0F) /当前行有键按下 tmp= (tmp<<4)|(GPPort_Get(KB_A,PRT)&0x0F); break; /退出循环不再扫描 if (i = 4) /无按键,以后将返回0xff tmp = 0xFF; return (tmp); /键盘定义表 const uint8 KBTable = 0xEE,'7',0xDE,'8',0xBE,'9',0x7E,'C', 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'D', 0xEB,'1',0xDB,'2',0xBB,'3',0x7B,'E', 0xE7,'0',0xD7,'A',0xB7,'B',0x77,'F', 0x00 ; uint8 KBDef(uint8 valve) uint8 KeyPress; /键定义值 uint8 i; i = 0; KeyPress = 0xff; while (KBTabl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论