天津大学智能装置课程设计电子时钟
- 格式:doc
- 大小:95.01 KB
- 文档页数:36
嵌入式课程(设计文档)题目:数字电子时钟设计学院专业学号年级姓名2011 年 12月 14 日数字电子时钟设计一实现功能1 基本的数字时钟计时功能2 时间设定功能3 闹钟功能二设计思路数字时钟在lcd上显示,分为三个部分:时钟,分钟和秒钟,为照顾整体美观性,时钟和分钟为统一大字体,在lcd上用矩形拼凑而成,秒钟为小字体,在lcd上用线画出。
秒钟满60自动分钟加一,秒钟重计。
分钟满60后时钟自动加一,分钟重计。
时钟满二十四后自动清零。
在初始时候可以从键盘中输入时钟的时和分进行时间的设定,数字时钟在lcd上显示此时间并以此为基础进行计时。
此时钟还有设定闹钟功能,按下开关键sw2由超级终端开始提示输入闹钟时间并亮起led4,由键盘输入设定时间后当时间到达此设定时间则响起闹钟铃声,关闭sw2,则闹钟停止。
三硬件支持实验设计由MX1下的lcd显示屏,led灯,键盘,开关,音频播放器以及RS232串口通信支持。
四源代码分析#include "INCLUDES.H"#include "mx1_aitc.h"#include "IRQ.h"#include "mx1_gpio.h"#include "mx1_uart.h"#include <string.h>#include "misc.h"#include "mx1_lcdc.h"#include "mx1_ssi.h"#include "wave.h"#include "switch.h"#include "led.h"extern void OSStartTimeTick( void );extern void OSTickISR( void );int sec_1=0,sec_2=0, min_1,min_2,hour_1,hour_2,i;/* 定义所需要的变量*//* 下面定义几个函数*/void Showtime_sec_1(int sec_1)/* 用于显示秒钟第一位的函数*/{MX1_LCDC_DrawRect( 240,0, 280,40, 50, 50, LS_SOLID, FS_SOLID );/* 刷新秒钟第一位的屏幕*/switch(sec_1){case(0):MX1_LCDC_DrawLine( 250, 5,270, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 5,250, 35, 31, FS_SOLID );MX1_LCDC_DrawLine( 270, 5,270,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 35,270,35, 31, FS_SOLID );break;case(1):MX1_LCDC_DrawLine( 270, 5,270,35, 31, FS_SOLID );break;case(2):MX1_LCDC_DrawLine( 250, 5,270, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 270, 5,270, 20, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 20,270,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 20,250,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 35,270,35, 31, FS_SOLID );break;case(3):MX1_LCDC_DrawLine( 250, 5,270, 5, 31, LS_SOLID );MX1_LCDC_DrawLine( 270, 5,270, 35, 31, FS_SOLID );MX1_LCDC_DrawLine(250, 20,270,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 35,270,35, 31, FS_SOLID );break;case(4):MX1_LCDC_DrawLine( 250, 5,250, 20, 31, LS_SOLID );MX1_LCDC_DrawLine( 250, 20,270, 20, 31, FS_SOLID );MX1_LCDC_DrawLine( 270, 5,270,35, 31, FS_SOLID );break;case(5):MX1_LCDC_DrawLine( 250, 5,270, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 5,250, 25, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 20,270,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 270, 20,270,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 250, 35,270,35, 31, FS_SOLID );}}void Showtime_sec_2(int sec_2)/* 用于显示秒钟第二位的函数*/{MX1_LCDC_DrawRect( 280,0, 320,40, 50, 50, LS_SOLID, FS_SOLID );/* 刷新秒钟第二位的屏幕*/switch(sec_2){case(0):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 5,290, 35, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );break;case(1):MX1_LCDC_DrawLine( 310, 5,310,35, 31, FS_SOLID );break;case(2):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310, 20, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310,20, 31,FS_SOLID );MX1_LCDC_DrawLine( 290, 20,290,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );break;case(3):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310, 35, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );break;case(4):MX1_LCDC_DrawLine( 290, 5,290, 20, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310, 20, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310,35, 31, FS_SOLID );break;case(5):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 5,290, 25, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 20,310,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );break;case(6):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 5,290, 35, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 20,310,35, 31,FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );break;case(7):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310,35, 31, FS_SOLID );break;case(8):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 5,290, 35, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310,35, 31,FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );break;case(9):MX1_LCDC_DrawLine( 290, 5,310, 5, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 5,290, 20, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 20,310,20, 31, FS_SOLID );MX1_LCDC_DrawLine( 310, 5,310,35, 31, FS_SOLID );MX1_LCDC_DrawLine( 290, 35,310,35, 31, FS_SOLID );}}void Showtime_min_1(int min_1)///* 用于显示分钟第一位的函数*/{MX1_LCDC_DrawRect( 170,40, 240,200, 50, 50, LS_SOLID, FS_SOLID );/* 刷新分钟第一位的屏幕*/switch( min_1){case(0):MX1_LCDC_DrawRect( 170, 40,230, 55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170, 40,185, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 215, 40,230, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 170, 185,230, 200, 31,31, LS_SOLID, FS_SOLID );break;case(1):MX1_LCDC_DrawRect( 215, 40,230, 200, 31,31, LS_SOLID, FS_SOLID );break;case(2):MX1_LCDC_DrawRect( 170, 40,230,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(215, 40,230, 127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 170, 112,185, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 170, 185,230,200, 31,31, LS_SOLID, FS_SOLID );break;case(3):MX1_LCDC_DrawRect( 170, 40,230,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170,112,230,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(215, 40,230,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170, 185,230,200, 31,31, LS_SOLID, FS_SOLID );break;case(4):MX1_LCDC_DrawRect(215, 40,230,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170,112,230,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170, 40,185,127, 31,31, LS_SOLID, FS_SOLID );break;case(5):MX1_LCDC_DrawRect( 170, 40,230,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170,112,230,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(170, 40,185,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 170, 185,230,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(215, 112,230,200, 31,31, LS_SOLID,FS_SOLID );}}void Showtime_min_2(int min_2)/* 用于显示分钟第二位的函数*/{MX1_LCDC_DrawRect( 240, 40, 320, 200, 50, 50, LS_SOLID,FS_SOLID );/* 刷新分钟第二位的屏幕*/switch(min_2){case(0):MX1_LCDC_DrawRect( 250, 40,310, 55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250, 40,265, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 295, 40,310, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250, 185,310, 200, 31,31, LS_SOLID, FS_SOLID );break;case(1):MX1_LCDC_DrawRect( 295, 40,310, 200, 31,31, LS_SOLID, FS_SOLID );break;case(2):MX1_LCDC_DrawRect( 250, 40,310,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(295, 40,310, 127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 112,265, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 185,310,200, 31,31, LS_SOLID,FS_SOLID );break;case(3):MX1_LCDC_DrawRect(250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(295, 40,310,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250, 185,310,200, 31,31, LS_SOLID, FS_SOLID );break;case(4):MX1_LCDC_DrawRect(295, 40,310,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 40,265,127, 31,31, LS_SOLID, FS_SOLID );break;case(5):MX1_LCDC_DrawRect( 250, 40,310,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 40,265,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250, 185,310,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(295, 112,310,200, 31,31, LS_SOLID, FS_SOLID );break;case(6):MX1_LCDC_DrawRect(250,40,310,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 40,265,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 185,310,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(295, 112,310,200, 31,31, LS_SOLID, FS_SOLID );break;case(7):MX1_LCDC_DrawRect( 250, 40,310, 55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 295, 40,310, 200, 31,31, LS_SOLID, FS_SOLID );break;case(8):MX1_LCDC_DrawRect(250,40,310,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 40,265,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 185,310,200, 31,31, LS_SOLID,FS_SOLID );MX1_LCDC_DrawRect(295, 40,310,200, 31,31, LS_SOLID, FS_SOLID );break;case(9):MX1_LCDC_DrawRect(250,40,310,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 40,265,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 250,112,310,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(250, 185,310,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(295, 40,310,200, 31,31, LS_SOLID, FS_SOLID );}}void Showtime_hour_1(int hour_1)/* 用于显示时钟第一位的函数*/{MX1_LCDC_DrawRect( 10, 40, 70, 200, 50, 50, LS_SOLID, FS_SOLID );/* 刷新时钟第一位的屏幕*/switch( hour_1){case(0):MX1_LCDC_DrawRect( 10, 40,70, 55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 55, 40,70, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 10, 185,70, 200, 31,31, LS_SOLID, FS_SOLID );break;case(1):MX1_LCDC_DrawRect( 55, 40,70, 200, 31,31, LS_SOLID, FS_SOLID );break;case(2):MX1_LCDC_DrawRect( 10, 40,70,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(10,112,70,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(55, 40,70, 127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 10, 112,25, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 10, 185,70,200, 31,31, LS_SOLID, FS_SOLID );}}void Showtime_hour_2(int hour_2)/* 用于显示时钟第二位的函数*/{MX1_LCDC_DrawRect( 90, 40, 80, 150, 50, 50, LS_SOLID, FS_SOLID );/* 刷新时钟第一位的屏幕*/switch(hour_2){case(0):MX1_LCDC_DrawRect( 90, 40,150, 55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90, 40,105, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 135, 40,150, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90, 185,150, 200, 31,31, LS_SOLID, FS_SOLID );break;case(1):MX1_LCDC_DrawRect( 135, 40,150, 200, 31,31, LS_SOLID, FS_SOLID );break;case(2):MX1_LCDC_DrawRect( 90, 40,150,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90,112,150,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(135, 40,150, 127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90, 112,105, 200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90, 185,150,200, 31,31, LS_SOLID, FS_SOLID );break;case(3):MX1_LCDC_DrawRect( 90, 40,150,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90,112,150,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(135, 40,150,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90, 185,150,200, 31,31, LS_SOLID, FS_SOLID );break;case(4):MX1_LCDC_DrawRect(135, 40,150,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90,112,150,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90, 40,105,127, 31,31, LS_SOLID, FS_SOLID );break;case(5):MX1_LCDC_DrawRect( 90, 40,150,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90,112,150,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90, 40,105,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90, 185,150,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(135, 112,150,200, 31,31, LS_SOLID, FS_SOLID );break;case(6):MX1_LCDC_DrawRect(90,40,150,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90, 40,105,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90,112,150,127, 31,31, LS_SOLID,FS_SOLID );MX1_LCDC_DrawRect(90, 185,150,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(135, 112,150,200, 31,31, LS_SOLID, FS_SOLID );break;case(7):MX1_LCDC_DrawRect( 90, 40,150, 55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 135, 40,150, 200, 31,31, LS_SOLID, FS_SOLID );break;case(8):MX1_LCDC_DrawRect(90,40,150,55, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(90, 40,105,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90,112,150,127, 31,31, LS_SOLID, FS_SOLID);MX1_LCDC_DrawRect(90, 185,150,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(135, 40,150,200, 31,31, LS_SOLID, FS_SOLID );break;case(9):MX1_LCDC_DrawRect(90,40,150,55, 31,31, LS_SOLID, FS_SOLID);MX1_LCDC_DrawRect(90, 40,105,127, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect( 90,112,150,127, 31,31, LS_SOLID,FS_SOLID );MX1_LCDC_DrawRect(90, 185,150,200, 31,31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawRect(135, 40,150,200, 31,31, LS_SOLID, FS_SOLID );}}void change(char tmp)/* 将从键盘输入的字符转为整数的函数*/{switch(tmp){case('0'):i=0;break;case('1'):i=1;break;case('2'):i=2;break;case('3'):i=3;break;case('4'):i=4;break;case('5'):i=5;break;case('6'):i=6;break;case('7'):i=7;break;case('8'):i=8;break;case('9'):i=9;}}/* 下面定义两个任务*/#define STK_SIZE_TASK1 256 /* 分配给任务的堆栈大小 */#define STK_SIZE_TASK2 256#define PRIO_TASK1 3 /* 任务的优先级 */#define PRIO_TASK2 4OS_STK StkTask1[STK_SIZE_TASK1]; /* 为任务分配堆栈空间 */OS_STK StkTask2[STK_SIZE_TASK2];void YourTask1( void *pdata )/* 任务一用于显示从键盘输入时间和基本的时钟功能*/{char tmp1,tmp2,tmp3,tmp4;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容 */MX1_LCDC_DrawRect(0,0,320,240, 50,50, LS_SOLID, FS_SOLID);MX1_UART_Init( COM1 );MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmp1 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmp1 );change(tmp1);hour_1=i;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmp2 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmp2 );change(tmp2);hour_2=i;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmp3 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmp3 );change(tmp3);min_1=i;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmp4 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmp4 );change(tmp4);min_2=i;Showtime_min_1(min_1);Showtime_min_2(min_2);Showtime_hour_1(hour_1);Showtime_hour_2(hour_2);/* 显示从键盘的输入时间,实现功能一*/MX1_LCDC_DrawCircle(160, 100,5, 31,31, LS_SOLID,FS_SOLID );MX1_LCDC_DrawCircle(160, 160,5, 31,31, LS_SOLID, FS_SOLID );while( 1 ){OSTimeDlyHMSM( 0, 0, 1, 0);/* 延时一秒后秒钟加一*//* 下面为实现时钟的逻辑*/sec_2++;if(sec_2>9){sec_1++;sec_2=0;}if(sec_1>5){min_2++;sec_1=0;}if(min_2>9){min_1++;min_2=0;}if(min_1>5){hour_2++;min_1=0;}if(hour_2>9){hour_1++;hour_2=0;}if(hour_1==2&&hour_2==4){hour_1=0;hour_2=0;}Showtime_sec_1(sec_1);Showtime_sec_2(sec_2);Showtime_min_1(min_1);Showtime_min_2(min_2);Showtime_hour_1(hour_1);Showtime_hour_2(hour_2);/* 实现基本时钟功能即功能二*/}}/* 任务二实现闹钟功能*/void YourTask2(void *pdata){int sethour_1,sethour_2,setmin_1,setmin_2;int j=1;char tmpl1,tmpl2,tmpl3,tmpl4;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断 */OSStartTimeTick();MX1_UART_Init( COM1 );WAVE_Init( WAVE_BASE_DEFAULT );LED_Init( LED3 );SWITCH_Init( SW2 ); /* 初始化开关 */while(1){if( SWITCH_IS_ON( SW2 )&&j==1 )/* 如果开关二按下超级终端提示依次输入闹钟时间*/{ LED_On( LED4 );j++;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmpl1 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmpl1 );change(tmp1);sethour_1=i;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmpl2 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmpl2 );change(tmp2);sethour_2=i;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmpl3 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmpl3 );change(tmp3);setmin_1=i;MX1_UART_PutString( COM1, "enter the time:\n", strlen("Ienter the time:\n") );MX1_UART_GetChar( COM1, &tmpl4 ); /* 显示输入的字符 */MX1_UART_PutChar( COM1, tmpl4 );change(tmp4);setmin_2=i;}elseLED_Off( LED4 );if(hour_1==sethour_1&&hour_2==sethour_2&&min_1==sethour_1&&min_2==sethour_2 )/* 达到闹钟时间后开始放音乐*/{WAVE_Play( );OSTimeDlyHMSM( 0, 0, 0, 500);}}}/* 初始化后,从这里开始执行C代码 */int __main( void ){unsigned int palette[LCDC_CMRAM_SIZE];int i;MX1_AITC_Init(); /* 初始化中断控制器 */IRQ_Init(); /* 初始化中断管理 */OSInit(); /* 初始化uC/OS-II内核数据结构 */MX1_GPIO_Init( MX1_GPIO_PC );MX1_SSI_Init( MX1_SSI1 );//初始化LCDMX1_LCDC_Init(LCDC_PANEL_WIDTH, LCDC_PANEL_HEIGHT,LCDC_INIT_STARTX, LCDC_INIT_STARTY, LCDC_VPW, LCDC_PANEL_CONF, LCDC_BPP );// 初始化调色板for( i=0; i<16; i++ ){palette[i] = RGB( i, 0, 0 );palette[i+16] = RGB( 0, i, 0 );palette[i+32] = RGB( 0, 0, i );palette[i+48] = RGB( i, i, i );}MX1_LCDC_CMRAM_Set( palette );/* 建立一个任务 */OSTaskCreate( YourTask1, 0, &StkTask1[STK_SIZE_TASK1-1], PRIO_TASK1 );OSTaskCreate( YourTask2, 0, &StkTask2[STK_SIZE_TASK2-1], PRIO_TASK2 );OSStart(); /* 开始调度 */return 0;}五实验现象初始化后,超级终端显示提示时间设定,由键盘输入后,开始计时功能,屏幕上显示时,分,秒在计时阶段若打开开关sw2则提示输入设定闹钟值,输入后当时间到达闹钟值时音乐响起,关闭sw2,则闹钟停止。
智能装置课程设计指导书一、设计题目交通灯智能管理二、设计目的1.深入认识 PIC16F877 单片机的工作原理,娴熟掌握汇编语言程序设计方法,娴熟使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件。
2.经过该课程设计使学生初步掌握以单片机为中心的智能装置设计的简单原则、步骤和方法。
3.熟习智能装置设计中有关的硬件设计调试。
4.熟习智能装置设计中有关软件的设计、编程和调试。
三、设计内容1.以 16F877 单片机为中心,联合给出的三色灯原器件和实验板上原有的内容组建一个自动系统,按交通灯的工作方式控制,设计硬件电路, 编写软件程序。
2.利用 4 个按键设置突发事件响应,利用中止程序模拟行人过马路时按下某按键时,相应路段变成绿灯。
3. 用上位机发指令控制组灯响应时间,利用LED 数码管显示某方向的节余灯时<按秒显示)。
4. 利用两个可调电位器对1-5V 电压模拟交通流量,每增添1V 对应方向绿灯时间增添 5 秒<选做)四、设计要求1.依据实验指导书的设计内容及所给出的元件,设计交通灯的硬件原理图。
2.依据设计好的硬件原理图在实验板上用导线搭建硬件电路。
3.用万用表检查硬件电路连结能否正确,检查无误后上电并编制简单的测试程序分步伐试各部分功能。
4.在各部分功能实现后,编制完好的交通灯系统软件,并进行软硬件联调,直抵达到设计要求。
达成后由教师进行查收检查。
五、实验设施1.MPLAB-ICD模块与仿真头2.智能装置实验系统3.安装了 MPLAB-IDE 开发软件的计算机4.数字万用表5.导线若干六、实验项目1.设计交通灯智能管理硬件电路<1)采纳16F877单片机,利用实验板上供给的三色灯模拟交通灯系统。
各用一组三色灯分别表示南北方向和东西方向红绿灯。
三色灯原理见附录。
假设一个十字路口为东西南北走向。
初始为灯全灭。
状态 0:南北绿灯,东西红灯;而后转状态 1:南北黄灯,东西红灯;再转状态 2:南北红灯,东西绿灯;再转状态 3:南北红灯,东西黄灯;最后循环至状态 0。
数字电子技术课程设计一、设计目的数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。
因此,我们此次设计与制作数字钟就是为了了解数字钟的原理,从而学会制作数字钟.而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法.且由于数字钟包括组合逻辑电路和时叙电路.通过它可以进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法.二、方案设计与论证数字钟以成为人们常生活中数字电子钟一般由振荡器,分频器,显示器,定时器等部分组成。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确,性能稳定,携带方便等特点,它还用于计时,自动报时及自动控制等各个领域。
尽管目前市场上以有现成数字钟集成电路芯片,价格便宜这些都是数字电路中最基本的,应用最广的电路。
数字电子钟的基本逻辑功能框图如下:它是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
他的计时装置的周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能。
因此,一个基本数字钟主要由六部分组成。
(1)设计指标1)由晶振电路产生1HZ标准秒信号;2)分、秒为00~59六十进制计数器;3)时为00~23二十四进制计数器;4)具有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;5)整点具有报时功能,当时间到达整点前鸣叫五次低音(500HZ),整点时再鸣叫一次高音(1000HZ)。
(2)设计要求1)画出电路原理图(或仿真电路图);2)元器件及参数选择;3)电路仿真与调试。
4)制作要求自行装配和调试,并能发现问题和解决问题。
5)编写设计报告写出设计与制作的全过程,附上有关资料和图纸,有心得体会。
四、实验器材试验箱1台导线若干74LS00 5片74LS04 1片74LS08 1片74LS20 2片74LS32 1片74LS161 6片万用表镊子各一个。
《电子技术》课程设计报告-数字电子钟设计一、背景介绍数字电子钟是一个实时的计时器,它可以按照设定的时刻精确地表示时间。
它使用微处理器和时钟芯片来处理时间。
因此,它可以被视为一个微处理器系统,系统中含有存储器、计数器、报警功能等。
最新的电子时钟如石英钟使用特制石英晶片来制定时钟。
由于石英可以产生完美的电振动,因此可以更准确地检测时钟改变。
二、数字电子钟的设计原理1、时钟驱动电子时钟的操作需要一定的时间和精度,主要是依靠特殊的驱动器来实现的。
驱动器有石英、硅、力学和光学等多种。
其中石英芯片是电子时钟的核心部件并且最常用。
可以让电子时钟每秒产生32千分之一秒的精度。
2、晶振电路晶体振荡器电路是将电能转换成振荡信号和时钟信号的基础电路。
在电子时钟中,晶振电路可以将3.3V的DC电源转换成正弦波信号。
3、控制电路控制电路是接收电子时钟信号,并将其转换为可读取的数字信号的电路。
它通过检测当前的时钟值与它预设的标准值,来决定是否需要重新设定。
4、显示电路为了使时间显示准确,显示电路需要有一定的能力,它可以将控制电路经过变换后的数字转化为可视的数字或符号信号,比如LED。
我们首先使用PIC16F628A微控制器来控制数字电子钟,PIC16F628A是一款常用的单片机,在实现数字电子钟的最基本功能时天然的具有很多优势,即具有丰富的I/O口及高性能的CPU。
而在驱动这个数字电子时钟时,我们选择了普通的石英晶振,其工作电压为3.3V,频率为32.768kHz。
它的作用是将电源电压转换成正弦波信号,然后此信号可以被PIC单片机读取,从而实现全电子时钟功能。
在处理每秒钟走过的时间时,我们使用计数器根据晶振输入的时钟信号逐渐计数,而当计数器计数到一定值时,PIC单片机就知道一秒的时间已经过去,然后继续进行计算.最后,我们选用一个4位共阳极数码管来将这些数据转化为显示数字的动作,它从数据地址上读取数据,然后一次送到一位,就可以实时显示电子时钟的实时时间。
简单电子时钟课程设计一、课程目标知识目标:1. 学生能够理解电子时钟的基本原理,掌握电子时钟的主要组成部分及其功能。
2. 学生能够掌握电子时钟显示时间的基本方法,包括时、分、秒的表示和转换。
3. 学生能够了解电子时钟的简易电路图,并认识常见电子元件。
技能目标:1. 学生能够运用所学知识,设计并搭建一个简易的电子时钟。
2. 学生能够通过实际操作,调试和优化电子时钟的运行效果。
3. 学生能够运用电子时钟知识解决实际问题,提高创新能力和动手能力。
情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发学习热情,树立科学探究精神。
2. 学生在合作探究中,培养团队协作能力和沟通能力,增强集体荣誉感。
3. 学生通过学习电子时钟的制作,认识到科技对生活的影响,培养环保意识和节能意识。
课程性质:本课程为实践性课程,结合理论知识与实际操作,注重培养学生的动手能力和创新能力。
学生特点:六年级学生具备一定的认知能力和动手能力,对新奇事物充满好奇心,善于合作探究。
教学要求:教师需引导学生掌握电子时钟的基本原理和制作方法,注重培养学生的实践能力和团队协作能力,提高学生的科学素养。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容本章节教学内容依据课程目标,结合课本《信息技术》六年级下册第四章“走进电子世界”内容进行组织。
1. 电子时钟原理:介绍电子时钟的基本工作原理,包括晶振振荡器、分频器、计数器、显示电路等组成部分。
2. 电子元件认知:学习常见电子元件,如电阻、电容、二极管、三极管等,并了解其在电子时钟中的作用。
3. 制作简易电子时钟:详细讲解电子时钟的制作步骤,包括电路图的绘制、元件的选取、焊接和调试。
4. 时间的表示与转换:学习电子时钟中时、分、秒的表示方法,以及它们之间的转换关系。
5. 教学大纲安排:- 第一节课:电子时钟原理及电子元件认知;- 第二节课:绘制简易电子时钟电路图,学习焊接技巧;- 第三节课:组装电子时钟,进行初步调试;- 第四节课:优化电子时钟,学习时间表示与转换。
智能电子时钟课程设计一、课程目标知识目标:1. 让学生了解智能电子时钟的基本结构、工作原理及设计方法;2. 使学生掌握电子时钟的主要组成部分,如时钟芯片、显示屏、按键等;3. 帮助学生理解电子时钟程序设计的基本思路和流程。
技能目标:1. 培养学生运用所学知识设计、制作简易智能电子时钟的能力;2. 提高学生动手操作、调试电子器件的技能;3. 培养学生运用编程软件进行程序设计和调试的能力。
情感态度价值观目标:1. 激发学生对电子科技的兴趣,培养创新精神和动手实践能力;2. 培养学生团队协作、沟通交流的能力,增强合作意识;3. 培养学生关注社会发展,认识到科技对生活的影响,树立正确的价值观。
课程性质:本课程为实践性较强的课程,结合理论知识与实践操作,注重培养学生的动手能力和创新意识。
学生特点:学生具备一定的电子基础知识,对新鲜事物充满好奇,喜欢动手实践。
教学要求:教师应注重理论与实践相结合,引导学生主动参与,关注学生的个体差异,因材施教,确保每个学生都能在课程中收获知识和技能。
同时,注重培养学生的团队合作意识和沟通能力。
通过本课程的学习,使学生能够达到上述课程目标,具备设计、制作简易智能电子时钟的能力。
二、教学内容1. 电子时钟的基本原理:介绍时钟芯片的工作原理,时钟信号的产生、计数和显示;2. 电子时钟的硬件组成:讲解时钟芯片、显示屏、按键、电源等硬件部件的功能和选型;3. 电子时钟程序设计:分析电子时钟的程序设计思路,包括初始化设置、时间计数、按键扫描、显示控制等;4. 程序编写与调试:指导学生运用编程软件,编写电子时钟程序,并进行调试;5. 电子时钟的制作与组装:教授学生如何安装、焊接电子元件,进行电路板的搭建;6. 功能拓展与优化:探讨如何为电子时钟增加闹钟、温度显示等拓展功能,提高电子时钟的实用性。
教学内容安排与进度:第一课时:电子时钟的基本原理及硬件组成介绍;第二课时:电子时钟程序设计思路分析;第三课时:程序编写与调试;第四课时:电子时钟的制作与组装;第五课时:功能拓展与优化。
电子时钟的设计课程设计一、课程目标知识目标:1. 学生能理解电子时钟的基本工作原理,掌握电子时钟的组成部分及功能。
2. 学生能够运用所学的电子元件,如LED数码管、时钟芯片等,设计并搭建一个简单的电子时钟。
3. 学生了解并掌握时间计算、时间显示转换等相关知识。
技能目标:1. 学生能够运用所学知识,进行电路设计、搭建和调试,提高动手实践能力。
2. 学生能够通过团队合作,共同解决问题,提高沟通协作能力。
3. 学生能够运用所学知识,对电子时钟进行创新设计和优化,培养创新思维和创新能力。
情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发学习热情,树立科学研究的自信心。
2. 学生在学习过程中,养成积极思考、勤于动手的好习惯,提高自主学习能力。
3. 学生通过团队协作,培养集体荣誉感和责任感,增强团队精神。
4. 学生能够关注电子时钟在生活中的应用,体会科技改变生活,培养社会责任感。
本课程针对初中年级学生,结合电子技术课程内容,注重实践性与创新性。
在教学过程中,关注学生的个体差异,鼓励学生积极参与,培养他们的实践能力、创新精神和团队合作意识。
通过本课程的学习,使学生在掌握电子时钟相关知识的基础上,能够将所学应用于实际生活,提高解决实际问题的能力。
二、教学内容1. 电子时钟基础知识:- 时钟芯片的原理与功能- LED数码管的结构与显示原理- 电阻、电容等基本电子元件的作用与选型2. 电子时钟设计与制作:- 电路原理图绘制与电路搭建- 时钟芯片的编程与调试- 电路焊接与电子时钟组装3. 电子时钟应用与优化:- 时间计算与显示功能实现- 电子时钟的创新设计与优化方案- 电子时钟在生活中的应用案例教学内容依据课程目标,结合教材第十五章“电子时钟的设计与应用”展开。
教学大纲分为三个阶段:第一阶段:电子时钟基础知识学习,为期2课时。
第二阶段:电子时钟设计与制作,为期4课时。
第三阶段:电子时钟应用与优化,为期2课时。
教学内容注重理论与实践相结合,逐步引导学生掌握电子时钟相关知识,培养实践能力和创新精神。
电子钟课程设计报告一、课程目标知识目标:1. 学生能理解电子钟的基本原理,掌握电子钟的组成、工作方式及相关电子元件的功能。
2. 学生能描述电子钟中数字电路的基本逻辑关系,理解时、分、秒的计算方法。
3. 学生了解电子钟的调试与检修方法,掌握基本的时间调整与故障排查技巧。
技能目标:1. 学生能运用所学知识,动手组装简单的电子钟电路,并能正确进行调试。
2. 学生能通过实际操作,学会使用万用表、电烙铁等基本电子工具,培养实际动手能力。
3. 学生能通过团队合作,解决电子钟组装过程中遇到的问题,提高问题分析和解决能力。
情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发创新意识,提高科学探究的积极性。
2. 学生在团队协作中,学会尊重他人,培养良好的沟通与协作能力。
3. 学生通过学习电子钟的制作过程,认识到时间的宝贵,培养珍惜时间、严谨细致的态度。
课程性质:本课程为实践性较强的电子技术课程,旨在让学生在动手实践中掌握电子钟的基本原理和组装调试技能。
学生特点:五年级学生对电子技术有一定的好奇心,具备基本的动手能力,但需加强对电子元件和电路的理解。
教学要求:注重理论与实践相结合,关注学生的个体差异,引导学生在动手实践中学习,培养其创新思维和团队协作能力。
通过课程目标的具体分解,为后续教学设计和评估提供明确方向。
二、教学内容根据课程目标,本章节教学内容分为以下三个部分:1. 电子钟原理及组成- 介绍电子钟的基本原理,包括时、分、秒的计算方法。
- 电子钟的组成:时钟振荡器、分频器、计数器、显示器等。
- 教材章节:第三章“数字电路基础”及第四章“时钟电路”。
2. 电子元件及其功能- 学习常用电子元件:电阻、电容、二极管、三极管等。
- 电子元件在电子钟中的应用及其功能。
- 教材章节:第二章“常用电子元件”。
3. 电子钟组装与调试- 学习电子钟的组装方法,包括焊接技术、电路连接等。
- 掌握电子钟的调试技巧,如时间调整、故障排查等。
电子钟课程设计一、课程目标知识目标:1. 学生能理解电子钟的基本原理,掌握电子钟的组成结构及其功能。
2. 学生能掌握时、分、秒的概念,学会电子钟时间的设置与调整。
3. 学生了解电子钟的制作过程,掌握相关电子元件的使用方法。
技能目标:1. 学生能运用所学知识,动手制作一个简单的电子钟。
2. 学生通过实践操作,培养解决实际问题的能力,提高动手实践能力。
3. 学生能够运用电子钟的制作过程,学会分析问题、解决问题,提高创新思维。
情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发探索科学技术的热情。
2. 学生通过合作完成电子钟的制作,培养团队协作精神和沟通能力。
3. 学生在电子钟制作过程中,学会珍惜时间,养成良好的时间观念。
4. 学生能够认识到科技对社会发展的作用,增强社会责任感和使命感。
课程性质:本课程为实践性较强的课程,结合理论知识和动手操作,培养学生的实际操作能力。
学生特点:五年级学生具有一定的认知能力、动手能力和创新能力,对新鲜事物充满好奇。
教学要求:结合学生特点,注重理论与实践相结合,强调学生的动手实践能力和创新思维能力的培养。
在教学过程中,关注学生的个体差异,鼓励学生提问、思考、探索,实现课程目标的分解和达成。
二、教学内容1. 电子钟原理及组成:介绍电子钟的基本工作原理,电子钟的各部分组成及其功能,如振荡器、分频器、计数器、显示装置等。
2. 时、分、秒的概念与换算:学习时间的基本单位,掌握时、分、秒之间的换算关系,为电子钟时间设置打下基础。
3. 电子元件认识:学习常用电子元件,如电阻、电容、二极管、三极管等,了解其作用和正确使用方法。
4. 电子钟的制作:结合教材内容,指导学生动手制作一个简单的电子钟,包括电路图的绘制、元件的安装、电路调试等。
5. 时间设置与调整:教授电子钟时间设置的方法,让学生学会如何调整电子钟的时间,确保其准确运行。
6. 故障排查与解决:培养学生分析问题、解决问题的能力,当电子钟出现故障时,能够进行简单的排查与修复。
智能装置课程设计一.课程设计目的:1.深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟练使用MPLAB-ICD仿真器及MPLAB-IDE仿真调试软件。
2.通过该课程设计使学生初步掌握以单片机为核心的智能装置设计的简单原则、步骤和方法。
3.熟悉智能装置设计中有关的硬件设计调试,如人机界面等。
4.熟悉智能装置设计中相关软件的设计、编程和调试。
二.课程设计内容1.以16F877单片机为核心,结合给出的其他原器件和智能装置实验系统原有的内容设计电子时钟硬件电路电路。
2. 利用实验板上的半导体温度传感器和四个独立按键,温度传感器按其原理介绍采集,时钟利用液晶显示器进行显示。
3.时钟按照时分秒、温度以及年月日显示,并可以利用按键逐位进行修改设置。
4.利用PIC16F877自带EEPROM进行掉电保护(选做)。
三.课程设计要求:1.根据实验指导书的设计内容及和智能装智实验系统所给出的元件,设计电子时钟的硬件原理图。
2.按照设计好的硬件原理图在实验系统上用导线搭建硬件电路。
3.用万用表检查硬件电路连接是否正确,检查无误后上电并编制简单的测试程序分步调试各部分功能。
4.在各部分功能实现后,编制完整的电子时钟系统软件,并进行软硬件联调,直到达到设计要求。
5.按照设计内容要求测试仪表误差并做分析,给出仪表精度,完成后由教师进行验收检查。
四.课程设计设备仪器:MPLAB-ICD模块与仿真头智能装置实验系统安装了MPLAB-IDE开发软件的计算机数字万用表导线若干五.课程设计硬件原理图:七.课程设计硬件设计思路:电子时钟的硬件接线比较简单,复杂之处在于程序的设计,需要外部连接的硬件只有LCD液晶显示屏以及按键。
1.LCD屏写数据是串行输入,所以产生时序的问题。
LCD显示输出采用手动时钟完成,这样便于控制时序,且传送字符时的传输效率比较高,当采用其他总线传送方式的时候,由于计算机在传送每个字节前也会加上相应的头部,这样与LCD所要求的时序不符,控制需要三条线,一条时钟线,一条数据线,一条片选线,三条线互相配合保证将数据正确写入LCD的数据缓冲区。
所以使用三条I/O端口线向LCD写数据,选用RD0~RD2控制,其中RD0接CS端,RD1接CLK,RD2接SID。
2.四个按键分别与RC0.RC1.RC2.RC3相连,按键低电平有效,采用扫描方式判断哪一个按键按下。
八.调试步骤以及各步骤调试过程中出现的问题与解决方法:1.LCD输出调试:由于所有实验现象都要在LCD屏显试才能看到,所以这是首先要调试好的一个程序。
最初接线完成之后没有显示,先确定了一遍接线没有问题,进而检查程序。
首先进行调试的是写命令子程序,方法就是将显示状态开/关的控制字设置成显示光标,如果这句控制字能够成功写入,屏幕上将有一个光标,则至少时钟书写命令程序是正确的,经试验写命令程序时正确的,后来在检查写数据程序时发现时首地址设错了,上行是80H到87H,我们给的首地址是89H,改变地址后输出正常。
后来又产生一个问题就是在输出多个字的时候容易产生乱码,我们的解决方式是每写完一条指令后需要加一段短延时,大致在20ms 左右,这样保证屏幕完成指令接收,并保证下一条指令可以正确写入。
2.二进制转BCD模块调试:由于只有将LCD输出模块与二进制转BCD码程序调试成功,才能看到实验现象进而调试其他模块,所以首先要将二进制转BCD码程序调试成功。
此子程序采用了简单的加三移位算法,方法是结果字节首先清零,然后待转换字节向左移动8次,每次移动后都检查第四位LSD加3是否大于7,如果是则加3,否则不加,高四位MSD做同样处理。
如果是要变换双字节的16位二进制,则要将待转换字节左移16次。
在调试过程中整体比较顺利。
3.时分秒计时模块:在调试本模块的过程中,出现了时间已到60秒但是分钟数没有进位的情况,单步执行后发现是判断语句发生了问题。
我们采用了XORLW这个语句,将秒数与60相异或,然后判断零标志位,当秒数到达六十时,异或操作使status寄存器零标志位为1,我们误以为这时候零标志位为零,所以判断语句用反,将BTFSS用成BTFSC,改正后,时分秒计时子程序正常工作。
4.年月日模块:这是程序中最为复杂的程序因为年月日计时子程序不仅仅要解决进位的问题,在每个月都要分清不同的天数,还有平闰年的问题,所以这部分子程序最为复杂。
在日期数加一之前首先要确定本月月数。
为了使程序具有更高的可读性,在编辑程序时舍弃了那些逻辑复杂的简便月份判断方法,如是不是1,3,5,7,8,10,12月,再使日期进时可以加到31天,本模块的设计思路是先判断月份是几月,确定好月份之后再转到相应的日期判断子程序中,这样的代价就是使程序的长度边长,有了12段的简单重复,但好处是使程序简单易读,便于调试。
在调试过程中,出问题的是判断平闰年程序,当从二月变到三月的时候,不论是否是平年还是闰年最后2月都是只记28天。
经过单步执行,发现是我们没有给程序设置一个公共出口,在判断平闰年是,即使判断是闰年,但是由于判断闰年的程序的出口是确定本年是平年的程序,所以不管是不是闰年,程序的最终出口都是将年份数判断为平年,即二月的输出只有28天,解决方案是增加程序的公共出口,判断完平闰年后,程序返回,经调试,程序正常。
5.温度检测模块:温度检测的难点是如何将AD转换后的得到的10位二进制数转化为对应的温度数,PIC单片机中ad模块的输入电压是5伏,温度传感器的输出电压为1伏时对应温度为100度,5V对应的是ad转换后的3FFH,经换算,可得到如下对应关系,1度对应0.05V,3ffh 换算成为十进制为1023,约等于1000,通过近似,可知0.005V对应一个二进制位,在编程时,将ad转换后的二进制数减去1000,余数再进行转换才是以0度为基准的温度值,将余数除以2之后得到的二进制数即为当前温度,将温度的二进制形式作为入口参数调用二进制转BCD程序,之后就可以输出在LCD屏上了。
在ad转换程序中设置的是右对齐,最高的两位直接舍弃不用,因为只有当大于100度时最高两位才有数,但是如果作为测量试问的程序来说室温基本不会到那么高,所以可以将最高两位不带入计算了。
本程序的温度检测模块检测温度精度是0.5度。
6.按键模块:按键模块的设计思路是在一秒中多次将RC口中的状态读进来,在没有按键按下时输入为FFH,一旦有按键输入,相应位置零,输入改变,通过判断是哪一位的输入置零,知道是哪个按键按下,之后再转到相应的案件处理子程序中。
在调试过程中,出现了按键响应不灵敏的问题,同时电子钟一秒定时的时间增加了。
在没有加入按键模块之前,一秒定时准确度比较高,加入按键模块之后一秒定时时间明显加大,我们怀疑是每秒中按键扫描次数过多导致,在减少扫描次数后情况好转,我们在定时程序中调用按键扫描程序,定时程序是120ms乘以5,每次定时器120ms到时调用一次按键扫描程序。
7.EEPROM读写模块:我们直接应用了书上的EEPROM读写模块例程,理论上程序执行不应该出错,但是当实际执行的时候发现数据无法写入也无法读出,经过询问老师,我们了解到在本仿真软件的环境下对EEPROM的操作都要经过手动刷新,这样数据才能写入和读出。
软件设计流程框图软件程序清单:LIST P=16F877#INCLUDE<P16F877.INC>SPTEM EQU 20HBINTEM EQU 21HLED_TEM EQU 22HGENE1 EQU 23HGENE2 EQU 24HLEH EQU 25HLEM EQU 26HLEL EQU 27HCOUNT1 EQU 28HCOUNT2 EQU 29HCOUNT3 EQU 30HCOUNT EQU 31HGENE3 EQU 33HGENE4 EQU 34HGENE5 EQU 35HDECTEMLO EQU 36HDECTEMHI EQU 37HTEMP EQU 38HSEC EQU 39HMIN EQU 40HHOU EQU 41HYEAR EQU 42HMONTH EQU 43HDAY EQU 44HPINGRUN EQU 45HWENDU EQU 46HWENDU4 EQU 47HHOUTEMP EQU 48HTAG EQU 50HHM EQU 51HMODJISHU EQU 52HORG 0050HSTART ;主程序BSF STATUS,RP0BCF STATUS,RP1MOVLW 01H ;RA0输入,其他不用。
MOVWF TRISAMOVLW 0FFH ;RC1234INPUT。
MOVWF TRISCMOVLW 00HMOVWF TRISD ;RD0、RD1、RD2输出。
MOVLW 20HMOVWF OPTION_REGMOVLW 00HMOVWF INTCON ;Timer0作计数器,初始化BCF STATUS,RP0MOVLW 31HMOVWF T1CON ;Timer1作定时器,定时1s,初始化MOVLW 01HMOVWF MODJISHUCLRF HMCLRF SECCLRF MINCLRF HOUCLRF PORTBMOVLW 17HMOVWF HOUMOVLW 3BHMOVWF MINMOVLW 30HMOVWF SECMOVLW 10HMOVWF YEARMOVLW 02HMOVWF MONTHMOVLW 1CHMOVWF DAYLEDOUT ;LCD屏显示部分MOVLW 00HMOVWF PORTD ;准备传输MOVLW 01HMOVWF LED_TEM ;清除显示CALL LEDORDMOVLW 20H ;功能设定MOVWF LED_TEMCALL LEDORDMOVLW 02H ;地址归位MOVWF LED_TEMCALL LEDORDMOVLW 06H ;进入点设定MOVWF LED_TEMCALL LEDORDMOVLW 0CH ;显示状态开,无光标MOVWF LED_TEMCALL LEDORDMOVLW 01H ;清除显示MOVWF LED_TEMCALL LEDORDMOVLW 80H ;DDRAM地址复位至80H MOVWF LED_TEMCALL LEDORDCALL EEPROMRD;CALL EEPROMWR;CALL TEMPERATUREAECALL EEPROMWRCALL INTRBCALL TEMPERATURECALL INTRBCALL OUTPUTCALL INTRBCALL DISPLAYSFMCALL DELAY2;CALL EEPROMRDINCF SEC,1MOVLW 3CHSUBWF SEC,0BTFSS STATUS,ZGOTO AECLRF SECINCF MIN,1MOVLW 3CHSUBWF MIN,02BTFSS STATUS,ZGOTO AECLRF MIN;CALL EEPROMWRINCF HOU,1MOVLW 18HSUBWF HOU,0BTFSS STATUS,ZGOTO AECLRF HOUCALL NIANGOTO AENIAN ;年月日子程序INCF DAY,1IS1 MOVF MONTH,0XORLW 01HBTFSS STATUS,ZGOTO IS2GOTO BE1IS2 MOVF MONTH,0XORLW 02HBTFSS STATUS,ZGOTO IS3GOTO BE2IS3 MOVF MONTH,0XORLW 03HBTFSS STATUS,ZGOTO IS4GOTO BE3IS4 MOVF MONTH,0XORLW 04HBTFSS STATUS,ZGOTO IS5GOTO BE4IS5 MOVF MONTH,0XORLW 05HBTFSS STATUS,ZGOTO IS6GOTO BE5IS6 MOVF MONTH,0XORLW 06HBTFSS STATUS,ZGOTO IS7GOTO BE6IS7 MOVF MONTH,0XORLW 07HBTFSS STATUS,ZGOTO IS8GOTO BE7IS8 MOVF MONTH,0XORLW 08HBTFSS STATUS,ZGOTO IS9GOTO BE8IS9 MOVF MONTH,0XORLW 09HBTFSS STATUS,ZGOTO IS10GOTO BE9IS10 MOVF MONTH,0XORLW 0AHBTFSS STATUS,ZGOTO IS11GOTO BE10IS11 MOVF MONTH,0XORLW 0BHBTFSS STATUS,ZGOTO IS12GOTO BE11IS12GOTO BE12BE1 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE2 CALL JUDGEBTFSC PINGRUN,0GOTO RUNMOVF DAY,0XORLW 1DHBTFSS STATUS,ZGOTO BEMOVWF DAYINCF MONTH,1GOTO BERUN MOVF DAY,0XORLW 1EHBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE3 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE4 MOVF DAY,0XORLW 1FHBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE5 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE6 MOVF DAY,0XORLW 1FHBTFSS STATUS,ZGOTO BEMOVWF DAYINCF MONTH,1GOTO BEBE7 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE8 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE9 MOVF DAY,0XORLW 1FHBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE10 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE11 MOVF DAY,0XORLW 1FHBTFSS STATUS,ZMOVLW 01HMOVWF DAYINCF MONTH,1GOTO BEBE12 MOVF DAY,0XORLW 20HBTFSS STATUS,ZGOTO BEMOVLW 01HMOVWF DAYMOVLW 01HMOVWF MONTHINCF YEAR,1BERETURNJUDGEBTFSC YEAR,0GOTO SHIPINGBTFSC YEAR,1GOTO SHIPINGBSF PINGRUN,0GOTO FANHUISHIPING BCF PINGRUN,0FANHUI RETURNTEMPERATURE ;温度检测子程序BCF STATUS,RP0MOVLW 41HMOVWF ADCON0 ;选择A/D转换在RA0,并打开A/D转换BSF STATUS,RP0MOVLW 0x8eMOVWF ADCON1 ;转换结果左移,且把RA0口设置成模拟量输入MOVLW 0x01MOVWF TRISABCF STATUS,RP0BSF ADCON0,2 ;GO/DONE位置1,开始A/D转换NOPNOPHEREBTFSC ADCON0,2 ;检查是否转换完成GOTO HERENOPBSF STATUS,RP0 ;读取转换结果高8位信息MOVLW 69HSUBWF ADRESL,0BCF STATUS,RP0MOVWF WENDUBCF STATUS,CRRF WENDU,1BTFSC STATUS,CGOTO AAMOVLW 30HMOVWF WENDU4GOTO BBAAMOVLW 35HMOVWF WENDU4BBMOVF WENDU,0MOVWF BINTEMCALL BINTOBCDMOVLW 95H ;DDRAM地址复位至93HMOVWF LED_TEMCALL LEDORDMOVLW 20HMOVWF LED_TEM ;NULL位CALL LEDDATMOVF LEM,0 ;十位MOVWF LED_TEMCALL LEDDAT ;MOVF LEL,0 ;个位MOVWF LED_TEMCALL LEDDATMOVLW 2EHMOVWF LED_TEMCALL LEDDATMOVF WENDU4,0MOVWF LED_TEMCALL LEDDATBCF STATUS,RP0RETURNOUTPUTMOVLW 80H ;DDRAM地址至80H MOVWF LED_TEMCALL LEDORDMOVLW 32HMOVWF LED_TEMCALL LEDDATMOVF YEAR,0MOVWF BINTEMCALL BINTOBCDMOVF LEH,WMOVWF LED_TEMCALL LEDDATMOVF LEM,WMOVWF LED_TEMCALL LEDDATMOVF LEL,0MOVWF LED_TEMCALL LEDDATMOVLW 2FH ;/MOVWF LED_TEMCALL LEDDATMOVF MONTH,0MOVWF BINTEMCALL BINTOBCDMOVF LEM,WMOVWF LED_TEMCALL LEDDATMOVF LEL,0MOVWF LED_TEMCALL LEDDATMOVLW 2FH ;/MOVWF LED_TEMCALL LEDDATMOVF DAY,0MOVWF BINTEMCALL BINTOBCDMOVF LEM,WMOVWF LED_TEMCALL LEDDATMOVF LEL,0MOVWF LED_TEMCALL LEDDATRETURNDISPLAYSFM ;时分秒显示子程序CALL INTRBMOVLW 90H ;DDRAM地址至90H MOVWF LED_TEMCALL LEDORDMOVF HOU,0SUBLW 0BHBTFSC STATUS,CGOTO LESSTHAN12GOTO MORETHAN12MORETHAN12MOVLW 50HMOVWF LED_TEMCALL LEDDATMOVLW 4DHMOVWF LED_TEMCALL LEDDATBTFSS HM,0GOTO SHUCHU12GOTO SHUCHU24SHUCHU12MOVF HOU,0MOVWF HOUTEMPMOVLW 0CHSUBWF HOUTEMP,0MOVWF BINTEMGOTO SHUCSHUCHU24MOVF HOU,0MOVWF BINTEMGOTO SHUCLESSTHAN12MOVLW 41HMOVWF LED_TEMCALL LEDDATMOVLW 4DHMOVWF LED_TEMCALL LEDDATMOVF HOU,0MOVWF BINTEMGOTO SHUCSHUCCALL BINTOBCDMOVF LEM,WMOVWF LED_TEMCALL LEDDATMOVF LEL,0MOVWF LED_TEMCALL LEDDATMOVLW 3AH ;:MOVWF LED_TEMCALL LEDDATMOVF MIN,0MOVWF BINTEMCALL BINTOBCDMOVF LEM,WMOVWF LED_TEMCALL LEDDATMOVF LEL,0MOVWF LED_TEMCALL LEDDATMOVLW 3AH ;:MOVWF LED_TEMCALL LEDDATMOVF SEC,0MOVWF BINTEMCALL BINTOBCDMOVF LEM,WMOVWF LED_TEMCALL LEDDATMOVF LEL,0MOVWF LED_TEMCALL LEDDATMOVLW 87H ;DDRAM地址至87H MOVWF LED_TEMCALL LEDORDMOVF MODJISHU,0ADDLW 30HMOVWF LED_TEMCALL LEDDATRETURN;******************************************************************** **********;子程序名称:LEDORD;入口参数:LED_TEM;出口参数:无;子程序任务:通过手写时钟,按照LCD屏时序图逻辑,将LED_TEM中的内容以写指令方式写入LCD中。