您好,欢迎来到好土汽车网。
搜索
您的当前位置:首页嵌入式系统课程设计作息时间控制器

嵌入式系统课程设计作息时间控制器

来源:好土汽车网


软 件 学 院

课程设计报告书

课程名称 嵌入式系统课程设计

设计题目 作息时间控制器 专业班级 学 号 姓 名 指导教师

年 月

目录

1 设计时间 ............................................... 1 2 设计目的 ............................................... 1 3 设计任务 ............................................... 1 4 设计内容 ............................................... 1 4.1 总体方案设计 ......................................... 1 4.1.1 需求规定 ........................................... 2 4.1.2核心部件选型 ....................................... 2 4.1.3系统开发环境 ....................................... 3 4.2硬件设计 ............................................. 3 4.2.1硬件开发环境简介 .................................... 3 4.2.2LED数码管模块设计 ................................... 4 4.2.3键盘模块设计 ....................................... 4 4.2.4蜂鸣器模块设计...................................... 5 4.3软件设计 ............................................. 6 4.3.1软件开发环境介绍 .................................... 6 4.3.2主程序设计及流程图 .................................. 6 4.3.3中断程序设计及流程图 ............................... 12 4.3.4软件模块1设计..................................... 13 4.3.5软件模块2设计..................................... 16 5总结 .................................................. 19 6附录 .................................................. 20

1 设计时间 2015.06.15—2015.06.19 2 设计目的 《嵌入式系统课程设计》是软件工程专业(嵌入式软件方向)学生的专业实践课程,是学习《嵌入式系统》课程后必要的实践教学环节。课程设计是检验学生是否掌握相关专业课程知识的重要手段,以学生为主体,充分调动学生的积极性和创造性,重视学生实际动手能力的培养。 通过本课程设计使学生加深理解、巩固课堂教学和平时实验内容,使学生初步具备基于C和ARM汇编应用开发的系统分析、系统设计、系统实现与测试的实际能力,强化学生的知识实践意识、提高动手能力,发挥学生的想象力和创新能力,从而培养工程应用型人才。 3 设计任务 (1)以我校作息时间为蓝本,控制步进机模拟上下课打铃; (2)作息时间可以程序调整,每到时间点蜂鸣器发声。 4 设计内容 本系统采用STC90C516RD+单片机为核心,制作一个作息时间控制器,设计内容为通过软件编程的方法实现数码管显示时间,蜂鸣器到达提前定好的时间进行响动报时同时用8位7段LED数码管、键盘控制时间和蜂鸣器完成该系统,LED数码管可以显示小时、分钟和秒,键盘设有8个按键可以改变小时、分钟和秒,有走时准确、显示直观、运行稳定等优点。 4.1 总体方案设计 本系统完成后,接通电源时,时间会自动在数码管校准并显示,可通过8个按键对相应的数码管显示的时间进行更改,8个按键分别为两行四列矩阵键盘,键盘第一列可改变小时、第二列改变分钟、第三列改变秒钟,蜂鸣器可进行报时,具体为当蜂鸣器到达系统指定时间时,蜂鸣器响动报警,当按下指定按键时蜂鸣器也可响动报警。 1 4.1.1 需求规定 数码管可显示可调整的24小时时钟。当时钟正常运行时,可调整时钟。在时钟运行时,以8位数码管的高2位显示小时,4、5位显示分钟,低两位显示秒钟,3、6显示横线用以隔断数字。 可设定作息时间。由于此作息时间控制系统主要应用与学校,考虑到冬、夏季作息时间的变更,可通过按键来调整作息时间。在设定作息时间时并不影响时钟的正常运行,八位数码显示已设定好的作息时间,再通过小时、分钟和秒钟调整按键设定作息时间。 具有到时提示功能。当设定的作息时间与实时时钟的时间相同时,蜂鸣器会发出几秒的提示音。 LED数码管:通过对LED的使用来实现显示时间的显示。 按键:通过对按键的使用来完成对实时时间的调整和对作息时间的调整。 蜂鸣器:通过数码管显示的时间来控制蜂鸣器的响动。 具体硬件关系图如下图4-1所示。 图4-1 硬件结构图 按键模块 单片机 蜂鸣器报警模块 数码管显示模块 4.1.2核心部件选型 本系统采用STC90C516RD+单片机,该单片机是宏晶科技生产的单时钟/机器周期1T的单片机,是高速/低功耗/超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8-12倍。12时钟/机器周期和6时钟/机器周期可任意选择,内部集成MAX810专用复位电路,时钟频率在12MHz以下时,复位脚可直接接地。 蜂鸣器:要求设定的时间到,蜂鸣器会响。 按键:随时对当前时间进行调整。要实现这一功能,可以接入键盘输入电路。 LED数码管:本系统采用LCD128数码管,led数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接 2 完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。 4.1.3系统开发环境 单片机按键输入电路、单片机时钟电路、复位电路、LED显示器段码驱动电路、LED显示器位码驱动电路、8位LED显示电路、蜂鸣器电路。 作息时间控制器其硬件电路方框图如图4-2所示。 机 片 复位 电路 单 时钟 电路 LED显示电路 蜂鸣器电路 按键输入电路 图4-2作息时间控制器其硬件电路方框图 4.2硬件设计 基于单片机的作息时间控制器,硬件电路有8个部分组成,即单片机按键输入电路、单片机时钟电路、复位电路、LED显示器段码驱动电路、LED显示器位码驱动电路、8位LED显示电路、蜂鸣器电路。 4.2.1硬件开发环境简介 STC90C516AD单片机是指令代码完全兼容传统的8051单片机,12时钟/周期和6时钟/周期可以任意选择。芯片内置了KB的FLASH,4352字节的RAM。工作频率范围0~40MHz,共有输入输出引脚32个,有EEPROM功能,看门狗功能。芯片内部集成MAX810专用复位电路,共有3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用;外部中断4路,8路10位A/D转换。该单片机引脚图如图4-3所示。 3 图4-3 STC90C51单片机引脚图 4.2.2LED数码管模块设计 led数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。8位共阳极数码管引脚图如图4-4所示。 图4-4 8位共阳极数码管引脚图 4.2.3键盘模块设计 键盘:两行四列矩阵键盘构成一个式键盘系统。键盘带时钟的引脚图如图4-5所示。 4 图4-5 键盘的引脚图 4.2.4蜂鸣器模块设计 蜂鸣器:设计要求定时时间到,要有到时提示。可以选择一只蜂鸣器(HA)作为三极管VT1的集电极负载,当VT1导通时,蜂鸣器发出呜叫声;VT1截止时,蜂鸣器不发声。R5是限流电阻。 该蜂鸣器驱动电路如图4-6所示。 图4-6 蜂鸣器引脚图 5 4.3软件设计 软件的设计即程序的编写。程序主要包括一下几个部分:主程序、LED时钟显示子程序、键盘判断与中断子程序。 在主程序中首先要对实时时钟和定时器进行初始化,利用函数为系统初始化一个初始时间。再初始化开中断,然后进入一个主循环中,主循环中有两个判断部分,一个是不断的扫描按键,当有那个按键被按下后就会响应对应的操作,另一个部分是判断是在可以读取实时时钟的时间时,调用读取时间的函数读取芯片的时间,把读取的时间放到一个数组中,然后判断当前的时间是否和自己设定的作息时间是否一致,一致时便会执行响铃操作。 LED时钟显示子程序中,先初始化复位一个高电平,在执行写时间和读时间程序。 键盘判断中,先初始化变量,当按下按键时,延时,程序会判断是否按下按键,若只是抖动则回到等待区域,若判断为按下按键,则返回按下的数值。 中断子程序,先重置高八位和低八位的数值并给定初值,再循环设置标志位,到并设定循环数值。 4.3.1软件开发环境介绍 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 本次设计中,使用DS1302提供的RAM区保存5个闹铃数据,达到掉电不丢失功能。 4.3.2主程序设计及流程图 (1)主程序: 6 void main (void) { unsigned char num; Init_Timer0(); Ds1302_Init(); Ds1302_Write_Time(); while (1) //主循环 { num=KeyScan(); //按键扫描 switch(num) { case 7:while(i--){DelayMs(1);SPEAKER=!SPEAKER;}i=500;break; case 8:while(i--){DelayMs(1);SPEAKER=!SPEAKER;}i=500;break; default:break; } if(ReadTimeFlag==1) { ReadTimeFlag=0; Ds1302_Read_Time(); TempData[0]=dofly_DuanMa[time_buf1[4]/10]; TempData[1]=dofly_DuanMa[time_buf1[4]%10]; TempData[3]=dofly_DuanMa[time_buf1[5]/10]; TempData[4]=dofly_DuanMa[time_buf1[5]%10]; TempData[6]=dofly_DuanMa[time_buf1[6]/10]; TempData[7]=dofly_DuanMa[time_buf1[6]%10]; TempData[2]=0x80; TempData[5]=0x80; if((TempData[0]==0x3f)&&(TempData[1]==0x07)&&(TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) 7 {//07-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x3f)&&(TempData[1]==0x7f))&&(((TempData[3]==0x3f)&&(TempData[4]==0x3f))||((TempData[3]==0x66)&&(TempData[4]==0x6d))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)))&&((TempData[6]==0x3f)&&(TempData[7]==0x3f))) {//08-00-00响铃08-45-00响铃08-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x3f)&&(TempData[1]==0x6f))&&(((TempData[3]==0x4f)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//09-35-00响铃09-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; 8 } if(((TempData[0]==0x06)&&(TempData[1]==0x3f))&&(((TempData[3]==0x66)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x66)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//10-40-00响铃10-45-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x06)&&(TempData[3]==0x4f)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//11-30-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x4f)&&(TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//13-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; 9 } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x66)&&(TempData[3]==0x3f)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//14-00-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x06)&&(TempData[1]==0x66))&&(((TempData[3]==0x66)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//14-45-00响铃14-50-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x06)&&(TempData[1]==0x6d))&&(((TempData[3]==0x4f)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) 10 {//15-35-00响铃15-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x06)&&(TempData[1]==0x7d))&&(((TempData[3]==0x66)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x66)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//16-40-00响铃16-45-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x07)&&(TempData[3]==0x4f)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//17-30-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } } 11 } } (2)主程序流程图如图4-7所示。 图4-7 主程序流程图 是 蜂鸣器响动 作息时间到否? 调用作息时间调整子程序 否 调用时间调整子程序 执行小时、分钟、秒钟处理子程序 定时器初始化、开中断、并启动TR0、TR1 定义变量、设置显示时间初值 主程序 4.3.3中断程序设计及流程图 (1)程序: void Timer0_isr(void) interrupt 1 { static unsigned int num; TH0=(65536-2000)/256; //重新赋值 2ms //高八位 TL0=(65536-2000)%256; //低八位 12 Display(0,8); // 调用数码管扫描 num++; if(num==50) //大致100ms { num=0; ReadTimeFlag=1; //读标志位置1 } (2)中断程序流程图如图4-8所示 结束 num= =50? 是 num= =0 ReadTimeFlag=1 num++ 否 重置TH0、TC0定时初值 中断服务子程序 开始 } 图4-8 中断程序流程图 4.3.4软件模块1设计 实时时钟模块的设计需要对实时时钟写入时间和读取时间进行详细设计。对实时时钟的操作需要对地址操作,在没有写保护的情况下,当产生一个高电平时可以给地址初始化,向地址写入数据,每写一个数据后地址会增加,当写完后则停止,否则一直写入数据。在读数据的时候也是一样的,当产生一个高电平时, 13 写入芯片的地址,将这个地址的数据读出放到一个数组中,地址自动增加,当数据读完时则结束,否则一直读取数据。 (1)时间写入模块 把时间写入到开发板的数码管中,相应代码如下: void Ds1302_Write_Time(void) { unsigned char i,tmp; } (2)时间读取模块 通过对八段数码管进行代码烧写,读取数码管显示时间,显示的时间系统设定时间,相应代码如下: void Ds1302_Read_Time(void) { 14 for(i=0;i<8;i++) { tmp=time_buf1[i]/10; time_buf[i]=time_buf1[i]%10; time_buf[i]=time_buf[i]+tmp*16; } Ds1302_Write_Byte(ds1302_control_add,0x00); Ds1302_Write_Byte(ds1302_sec_add,0x80); //关闭写保护 //暂停 //年 Ds1302_Write_Byte(ds1302_year_add,time_buf[1]); Ds1302_Write_Byte(ds1302_month_add,time_buf[2]); //月 Ds1302_Write_Byte(ds1302_date_add,time_buf[3]); Ds1302_Write_Byte(ds1302_day_add,time_buf[7]); Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]); Ds1302_Write_Byte(ds1302_min_add,time_buf[5]); Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]); Ds1302_Write_Byte(ds1302_day_add,time_buf[7]); Ds1302_Write_Byte(ds1302_control_add,0x80); //日 //周 //时 //分 //秒 //周 //打开写保护 unsigned char i,tmp; } 15 time_buf[1]=Ds1302_Read_Byte(ds1302_year_add); //年 //月 //日 time_buf[2]=Ds1302_Read_Byte(ds1302_month_add); time_buf[3]=Ds1302_Read_Byte(ds1302_date_add); time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add); time_buf[5]=Ds1302_Read_Byte(ds1302_min_add); //时 //分 time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒 time_buf[7]=Ds1302_Read_Byte(ds1302_day_add); for(i=0;i<8;i++) { tmp=time_buf[i]/16; time_buf1[i]=time_buf[i]%16; time_buf1[i]=time_buf1[i]+tmp*10; //周 } 实时时钟模块相应的程序流程图如图4-9所示。 图4-9 实时时钟模块程序流程图 结束 否 读取完毕 否 地址增加 地址增加 延时 写定时302地址 写地址 否 是否写入时间 变量初始化 复位一个高电平 是 开始 延时 读该地址数据 写入数据 写完数据 是 是 4.3.5软件模块2设计 键盘控制模块 键盘控制相应的数码管时间显示,按键扫描模块的设计需要对了解8个按键的原理,当有按键被按下时会产生低电平信号,信号会通过杜邦线传递给单片机,从而判断哪个按键被按下,然后返回一个数值。 相应代码如下: 16 unsigned char KeyScan(void) { unsigned char keyvalue; if(KeyPort!=0xff) { DelayMs(10); if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff); } switch(keyvalue) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; } } return 0; } 17 键盘控制模块相应的程序流程图如图4-10所示。 图4-10 键盘控制模块程序流程图 结束 否 是否按下按键 是 返回数值 延时 是否按下按键 是 变量初始化 开始 否 18 5总结 为期一个星期的课程设计结束了,我们小组从中获益匪浅。这次课程设计我们做的是作息时间控制器,通过嵌入式系统开发技术和应用和传感器原理及应用这两门课程,我们做了这个时间控制器,让我们体会到学以致用的重要,并且通过本次试验动手能都有所提高。首先我们对这次试验做了系统分析并用学校的单片机烧写代码,但因为学校的单片机没有蜂鸣器这一模块,也对数码管显示时间相应的代码有很多地方不明白,所以写的代码并没有运行出来,后来我们用了LY-51S单片机并用了DS1302实时时钟芯片,这让我们的代码烧写变得更加方便容易在对所用单片机的内部结构进行系统的了解之后,我们进行题目分析材料查找等多个步骤并在过程中遇到很多问题,但我们将每次遇到的问题记录下来,并分析清楚,再通过查资料和请教老师和其他同学等方式一一解决。 本次试验还是有一些不足之处,例如时间的修改方面,在键盘修改时间时,时间还在走,并没有停止时间在修改时间这一部分,也没有时间修改后启动时间这一部分,这一方面还需要改进。 通过本次课程设计,对一些已学过的知识,是一个很好的回顾,巩固了自己所学的知识,又从实践中验证了理论知识,实践与理论相结合,让我获得更多的知识。 19 6附录 #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include \"ds1302.h\" #define KeyPort P3 //定义按键端口 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 sbit SPEAKER=P2^1;//蜂鸣器 bit ReadTimeFlag;//定义读时间标志 Unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 unsigned int j=255,i=500; void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 void Init_Timer0(void);//定时器初始化 void main (void) { unsigned char num; Init_Timer0(); Ds1302_Init(); Ds1302_Write_Time(); 20 while (1) //主循环 { num=KeyScan(); //按键扫描 switch(num) { case 7:while(i--){DelayMs(1);SPEAKER=!SPEAKER;}i=500;break; case 8:while(i--){DelayMs(1);SPEAKER=!SPEAKER;}i=500;break; default:break; } if(ReadTimeFlag==1) { ReadTimeFlag=0; Ds1302_Read_Time(); TempData[0]=dofly_DuanMa[time_buf1[4]/10]; TempData[1]=dofly_DuanMa[time_buf1[4]%10]; TempData[3]=dofly_DuanMa[time_buf1[5]/10]; TempData[4]=dofly_DuanMa[time_buf1[5]%10]; TempData[6]=dofly_DuanMa[time_buf1[6]/10]; TempData[7]=dofly_DuanMa[time_buf1[6]%10]; TempData[2]=0x80; TempData[5]=0x80; if((TempData[0]==0x3f)&&(TempData[1]==0x07)&&(TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//07-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; 21 } if(((TempData[0]==0x3f)&&(TempData[1]==0x7f))&&(((TempData[3]==0x3f)&&(TempData[4]==0x3f))||((TempData[3]==0x66)&&(TempData[4]==0x6d))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)))&&((TempData[6]==0x3f)&&(TempData[7]==0x3f))) {//08-00-00响铃08-45-00响铃08-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x3f)&&(TempData[1]==0x6f))&&(((TempData[3]==0x4f)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//09-35-00响铃09-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x06)&&(TempData[1]==0x3f))&&(((TempData[3]==0x66)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x66)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) 22 {//10-40-00响铃10-45-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x06)&&(TempData[3]==0x4f)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//11-30-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x4f)&&(TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//13-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x66)&&(TempData[3]==0x3f)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) 23 {//14-00-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x06)&&(TempData[1]==0x66))&&(((TempData[3]==0x66)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//14-45-00响铃14-50-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if(((TempData[0]==0x06)&&(TempData[1]==0x6d))&&(((TempData[3]==0x4f)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x6d)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//15-35-00响铃15-55-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } 24 if(((TempData[0]==0x06)&&(TempData[1]==0x7d))&&(((TempData[3]==0x66)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f))||((TempData[3]==0x66)&&(TempData[4]==0x6d)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)))) {//16-40-00响铃16-45-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } if((TempData[0]==0x06)&&(TempData[1]==0x07)&&(TempData[3]==0x4f)&&(TempData[4]==0x3f)&&(TempData[6]==0x3f)&&(TempData[7]==0x3f)) {//17-30-00响铃 while(i--) { DelayMs(1); SPEAKER=!SPEAKER; } i=500; } } } } void DelayUs2x(unsigned char t) { while(--t); } void DelayMs(unsigned char t) 25 { while(t--) { //大致延时1mS DelayUs2x(245); } } void Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort=0; //清空数据,防止有交替重影 DelayUs2x(245); LATCH1=1; //段锁存 LATCH1=0; DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; i++; if(i==Num) } void Init_Timer0(void) 26 i=0; { TMOD |= 0x01; 个定时器时不受影响 //使用模式1,16位定时器,使用\"|\"符号可以在使用多 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } void Timer0_isr(void) interrupt 1 { static unsigned int num; TH0=(65536-2000)/256; //重新赋值 2ms //高八位 TL0=(65536-2000)%256; //低八位 Display(0,8); // 调用数码管扫描 num++; if(num==50) //大致100ms { num=0; ReadTimeFlag=1; //读标志位置1 } unsigned char KeyScan(void) { unsigned char keyvalue; if(KeyPort!=0xff) { DelayMs(10); 27 } if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff); } switch(keyvalue) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; } } return 0; } 28 参考文献 [1] 路莹,彭健钧,石武信.嵌入式系统开发技术与应用.第1版, 北京:清华大学出版社,2011 [2] 文全刚,张平.汇编语言程序设计.基于ARM体系结构第1版,北京航空航天大学出版社,2010 成绩评定 成绩 教师签字 29

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- howto234.com 版权所有 湘ICP备2022005869号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务