嵌入式系统设计报告
- 格式:doc
- 大小:96.50 KB
- 文档页数:12
电子时钟的设计专业:电子信息工程( 应用性本科)班级:电信08-2班姓名: 陈剑光学号: 3081818229设计时间: 2010年10月15日一、引言...。
..。
.。
....。
.。
..。
.。
.。
.。
.。
..。
.。
.。
..。
....。
.......。
...3二、设计课题.。
...。
.。
......。
...。
...。
...。
....。
....。
..。
....。
...。
.31、基本原理.。
....。
.。
.........。
.。
....。
..。
..。
.....。
...。
.32、原理框图...。
.。
..。
.。
......。
.....。
..。
....。
.。
...。
.。
....。
.。
.。
33、硬件电路原理图。
..。
.......。
..。
.。
.。
.....。
....。
...。
..。
..44、软件设计.。
.。
.....。
.。
...。
.。
..。
.。
..。
.。
.。
...。
.。
.。
.。
.5(1)、流程图。
..。
.。
........。
...。
.。
.。
..。
....。
.。
.。
....5(2)、代码附录.....。
.。
.。
.....。
..。
..。
.。
....。
..。
.。
.。
.。
.7 5、测试过程.。
...。
..。
..。
.。
..。
..。
.。
.。
.....。
..。
...。
.。
.。
10(1)、测试数据。
.。
.。
.....。
.。
......。
.。
....。
.。
......。
.。
.。
..10(2)、数据分析。
....。
..。
.。
......。
..。
..。
...。
........。
...。
.。
..。
10三、结论..。
....。
.。
.。
...。
.。
..。
..。
..........。
...。
..。
..。
....。
..。
.。
11引言时钟,自从它发明的那天起,就成为了人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。
嵌入式系统实验报告引言嵌入式系统作为一种广泛应用于各行各业的计算机系统,其本身具有一定的难度与挑战。
本实验报告将围绕嵌入式系统的设计、开发以及应用展开讨论,旨在总结并分享在实验中所获得的经验与知识。
一. 实验背景嵌入式系统是指以特定功能为目标的计算机系统,其设计与开发过程相较于传统的计算机系统更为复杂和精细。
本次实验的主要目标是通过设计一个基于嵌入式系统的智能家居控制器,来探索嵌入式系统的应用与实践。
二. 实验内容2.1 硬件设计嵌入式系统的硬件设计是整个实验的基础,其合理性与稳定性直接影响系统的性能和可靠性。
在本次实验中,我们选择了一块主频为xx的处理器作为核心,配备了丰富的外设接口,如GPIO、串口等。
我们还为系统增加了一块液晶显示屏和一组按键,以实现简单的用户交互。
2.2 软件开发在硬件设计完成后,我们开始进行软件开发。
首先,我们需要选择一个合适的操作系统作为嵌入式系统的基础。
针对本次实验,我们选择了xx操作系统,其具备较强的实时性和稳定性,能够满足我们对系统性能的要求。
接着,我们进行了嵌入式系统的驱动程序开发。
通过编写各个外设的驱动程序,我们实现了与液晶显示屏和按键的交互,并将其与处理器进行了适当的接口配置。
另外,我们还开发了嵌入式系统的应用程序。
通过编写智能家居控制器的代码,我们成功实现了对家居设备的远程控制和监测。
用户可以通过液晶显示屏和按键进行交互,实现对家居设备的开关、调节和状态查看等操作。
三. 实验结果与分析经过实验测试,我们发现嵌入式系统在智能家居领域的应用具有较高的可行性与实用性。
通过嵌入式系统的控制,用户可以方便地实现对家居设备的远程操控,提升了家居智能化的程度。
同时,嵌入式系统的实时性和稳定性使得智能家居控制器具备了较高的安全性和可靠性。
然而,在实验过程中我们也遇到了一些挑战。
其中,系统的驱动程序开发是较为复杂的一环,需要仔细理解硬件接口和协议,并进行合理的配置。
此外,系统的稳定性和功耗管理也是需要重点关注的问题。
嵌入式系统设计课设报告福州大学《嵌入式系统设计课设》报告书题目:基于28027的虚拟系统姓名:学号:学院:电气工程与自动化学院专业:电气工程与自动化年级:起讫日期:指导教师:目录1、课程设计目的 (1)2、课程设计题目和实现目标 (1)3、设计方案 (1)4、程序流程图 (1)5、程序代码 (1)6、调试总结 (1)7、设计心得体会 (1)8、参考文献 (1)1、课程设计目的《嵌入式系统设计课设》是与《嵌入式系统设计》课程相配套的实践教学环节。
《嵌入式系统设计》是一门实践性很强的专业基础课,经过课程设计,达到进一步理解嵌入式芯片的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。
培养大胆创造创造的设计理念,为今后就业打下良好的基础。
经过课程设计,掌握以下知识和技能:1.嵌入式应用系统的总体方案的设计;2.嵌入式应用系统的硬件设计;3.嵌入式应用系统的软件程序设计;4.嵌入式开发系统的应用和调试能力2、课程设计题目和实现目标课程设计题目:基于28027的虚拟系统任务要求:A、利用28027的片上温度传感器,检测当前温度;B、经过PWM过零中断作为温度检测A/D的触发,在PWM中断时完成温度采样和下一周期PWM占空比的修正;PWM频率为1K;C、利用按键作为温度给定;温度给定变化从10度到40度。
D、当检测温度超过给定时,PWM占空比增减小(减小幅度自己设定);当检测温度小于给定时,PWM占空比增大(增大幅度自己设定);E、把PWM输出接到捕获口,利用捕获口测量当前PWM的占空比;F、把E测量的PWM占空比经过串口通信发送给上位机;3、设计方案-----介绍系统实现方案和系统原理图①系统实现方案:任务A:利用ADC模块通道A5获取当前环境温度。
任务B:PWM过零触发ADC模块,在PWM中断服务函数中,将当前环境温度和按键设定温度进行比较,并按照任务D的要求修订PWM占空比。
嵌入式报告实验报告1. 引言嵌入式系统作为一种特殊的计算机系统,应用广泛且日益重要。
嵌入式报告实验是对嵌入式系统进行实际操作和测试的过程,旨在验证嵌入式系统的功能和性能,以评估其是否满足设计要求。
本报告将详细介绍嵌入式报告实验的设计与实施,并对实验结果进行分析与总结。
2. 实验设计2.1 实验目的嵌入式报告实验的目的是通过设计和实施一系列测试来评估嵌入式系统的性能和功能。
具体目标包括但不限于:验证系统的实时性、稳定性和可靠性;测试系统的各种输入输出功能;评估系统对异常情况的处理能力。
2.2 实验环境实验使用的嵌入式系统硬件为XX处理器,集成了XX模块和XX接口。
软件方面,使用XX嵌入式操作系统和XX开发工具进行系统开发和测试。
2.3 实验步骤1) 配置硬件环境:将嵌入式系统与外部设备连接,确保硬件环境正常。
2) 编写测试程序:根据实验目标,编写相应的测试程序,包括输入输出测试、性能测试和异常情况测试等。
3) 软件调试:通过软件调试工具对测试程序进行调试,确保程序逻辑正确。
4) 硬件调试:通过硬件调试工具对嵌入式系统进行调试,确保硬件模块正常工作。
5) 实验运行:将测试程序下载到嵌入式系统中,运行测试程序并记录实验数据。
6) 数据分析与总结:对实验数据进行分析和总结,评估嵌入式系统的性能和功能是否满足设计要求。
3. 实验结果与分析3.1 输入输出测试通过设计一系列输入输出测试用例,测试嵌入式系统的输入输出功能。
测试包括但不限于:按键输入、传感器数据采集、外部设备通信等。
实验结果表明,嵌入式系统的输入输出功能正常,能够准确获取和处理各种输入信号,并成功输出相应的结果。
3.2 性能测试通过设计一系列性能测试用例,测试嵌入式系统的处理能力和实时性。
测试包括但不限于:任务切换速度、响应时间、系统负载等。
实验结果表明,嵌入式系统具有较高的处理能力和实时性,能够快速响应各种任务并保持系统的稳定性。
3.3 异常情况测试通过设计一系列异常情况测试用例,测试嵌入式系统对异常情况的处理能力。
《嵌入式系统》课程设计报告设计课题:基于web的嵌入式智能家居控制系统专业班级:09电气(1)班学生姓名:黄礼智指导教师:雷必成设计时间:2012学年第一学期物理与电子工程学院基于web的嵌入式智能家居控制系统采用了三星公司生产的S5PV210AH_A01141芯片,是一款ARM11芯片。
将嵌入式WEB远程控制系统应用在智能家居方面是未来发展的必然趋势。
智能家居、嵌入式系统和WEB服务器三者结合, 通过构建嵌入式WEB服务器, 研究设计通过WEB控制家电设备, 以及在linux系统下搭建WEB服务器,使得用户可以随时随地地通过浏览器实现对家电设备的控制。
本文介绍了在ARM嵌入式系统上搭建boa服务器的方法,分析了各种控制方法,得出了实现基于web的嵌入式智能家居控制系统的最直接可行的方案。
最后利用C语言编译出了CGI程序和服务程序。
关键词WEB ; linux嵌入式; boa服务器; CGI1.智能家居控制系统总体方案设计 (1)1.1系统总体架构设计 (1)2.嵌入式WEB服务器BOA的建立 (1)3.界面设计、CGI程序和驱动程序编写 (3)3.2CGI简介 (4)3.3网页提交数据的两种方式:GET/POST (5)3.4CGI程序的编写 (6)3.5驱动程序的编写 (8)3.5.1传感器信息采集驱动 (8)3.5.2模拟开关控制驱动 (10)4.WEB嵌入式只能家居控制系统测试和应用 (12)4.1软件系统测试 (12)5.总结与展望 (15)参考文献 (16)附件 (17)1.智能家居控制系统总体方案设计1.1 系统总体架构设计本文中整个控制系统那个分为3个模块:中央处理器(ARM11),室内信号监测模块,控制执行模块。
中央处理器所在的模块由于涉及到高频信号,普通制板均达不到要求,因此直接采用ARM 核心板,设计相应的控制板,两者结合使用。
从系统稳定性和搭建服务器难度上考虑,linux 系统成为不二的选择。
嵌入式系统设计实验报告班级:学号:姓名:成绩:指导教师:1. 实验一1.1 实验名称博创UP-3000实验台基本结构及使用方法1.2 实验目的1.学习嵌入式系统开发流程。
2.熟悉UP-net3000实验平台的核心硬件电路和外设。
3.增加对各个外设的了解,为今后各个接口实验打下基础。
1.3 实验环境博创UP-NETARM3000 嵌入式开发平台1.4 实验内容及要求(1)嵌入式系统开发流程概述(2)熟悉UP-net3000实验平台的核心硬件电路和外设(3)ARM JTAG的安装与使用(4)通过操作系统自带的通讯软件超级终端,检验各个外设的工作状态(5)通过本次课程对各个外设的了解,为今后各个接口实验打下基础1.5 实验设计与实验步骤1.硬件安装2.软件安装(1)超级终端:运行Windows 系统下的超级终端(HyperTerminal)应用程序,新建一个通信终端;在接下来的对话框中选择 ARM开发平台实际连接的PC机串口;完成新建超级终端的设置以后,可以选择超级终端文件菜单中的保存,将当前设置保存为一个特定超级终端到桌面上,以备后用。
(2)JTAG 驱动程序的安装:执行armJtag目录下armJtagSetup.exe程序,选择安装目录,安装 JTAG 软件。
1.6 实验过程与分析(1)了解嵌入式系统开发流程(2)对硬件的安装(3)对软件的安装1.7 实验结果总结通过本次实验对嵌入式系统开发流程进行了了解,并且对硬件环境和软件环境进行了安装配置,通过本次实验对以后的接口实验打了基础。
1.8 心得体会通过本次实验对嵌入式实验有了初步的了解,对基本开发流程也有了初步的了解。
2. 实验二2.1 实验名称ADS1.2软件开发环境使用方法2.2 实验目的熟悉ADS1.2开发环境,学会 ARM仿真器的使用。
使用 ADS 编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。
2.3 实验环境(1)ADS1.2开发环境(2)博创UP-NETARM3000 嵌入式开发平台(3)PC(4)串口线2.4 实验内容及要求本次实验使用ADS 集成开发环境,新建一个简单的工程文件,并编译这个工程文件。
《微处理器与嵌入式系统设计》实验报告
微处理器与嵌入式系统设计实验报告
实验目的
本实验旨在通过使用微处理器和嵌入式系统设计,加深对相关
概念和原理的理解,并能够实际运用这些知识进行系统设计与开发。
实验步骤
1. 阅读相关理论材料,了解微处理器和嵌入式系统设计的基本
概念和原理。
2. 确定实验所需的硬件和软件资源,并进行准备工作。
3. 根据实验要求,进行系统设计与开发。
4. 实施系统测试与调试,确保系统正常运行。
5. 撰写实验报告,总结实验过程及结果。
实验结果
本实验按计划完成了实验步骤,并成功设计并开发了一个微处
理器和嵌入式系统。
实验分析
通过本实验,进一步加深了对微处理器和嵌入式系统设计的理解。
通过实践,我们能够更好地掌握其设计原理和应用技术,并能够运用这些知识解决实际问题。
总结
通过本次实验,我们深入研究了微处理器和嵌入式系统设计的基本概念和原理,并通过实践运用这些知识进行系统设计与开发。
通过实验的完成,我们对微处理器和嵌入式系统设计有了更深入的了解,对其应用领域和技术有了更清晰的认识。
参考文献
- [参考文献1]
- [参考文献2]。
一、实验目的1. 熟悉嵌入式系统开发的基本流程和常用工具;2. 掌握嵌入式系统硬件资源的使用方法;3. 熟悉嵌入式系统软件开发的基本方法;4. 提高嵌入式系统设计能力。
二、实验内容1. 硬件平台:基于STM32F103系列单片机的开发板;2. 软件平台:Keil uVision5集成开发环境;3. 实验任务:设计一个简单的嵌入式系统,实现按键输入和LED灯控制功能。
三、实验原理1. 硬件原理:STM32F103系列单片机是一款高性能、低功耗的ARM Cortex-M3内核微控制器,具有丰富的片上外设资源,如GPIO、定时器、ADC等。
在本实验中,主要使用GPIO进行按键输入和LED灯控制。
2. 软件原理:嵌入式系统软件开发主要包括底层驱动程序、中间件和应用层。
底层驱动程序负责硬件资源的管理和配置;中间件提供系统服务,如通信、定时器等;应用层实现用户功能。
在本实验中,主要使用C语言编写程序,实现按键输入和LED灯控制功能。
四、实验步骤1. 硬件连接:将开发板上的按键和LED灯分别连接到单片机的GPIO端口;2. 软件编写:(1)创建项目:在Keil uVision5中创建一个新的项目,选择STM32F103系列单片机作为目标设备;(2)添加源文件:添加一个C语言源文件,用于编写主程序;(3)配置GPIO:在源文件中编写GPIO初始化代码,配置按键和LED灯的GPIO端口为输入和输出模式;(4)编写按键输入程序:编写按键扫描函数,用于检测按键状态,并根据按键状态控制LED灯;(5)编译程序:编译项目,生成目标文件;(6)下载程序:将编译好的程序下载到开发板;3. 实验验证:在开发板上运行程序,观察按键输入和LED灯控制功能是否正常。
五、实验结果与分析1. 实验结果:按键按下时,LED灯点亮;按键松开时,LED灯熄灭;2. 实验分析:通过编写程序,实现了按键输入和LED灯控制功能,验证了嵌入式系统开发的基本流程和常用工具。
北邮嵌入式系统设计实验-实验报告嵌入式试验报告学院:xxx班级:xxx学号:xxx姓名:xxx成员:xxx一、基础学问部分1.多线程试验本章主要讲解线程的概念和线程间的同步方式。
试验一主要介绍线程的概念和线程的创建,试验二、试验三、试验四分离介绍了信号量、互斥锁、条件变量的作用和使用。
1.1 线程的介绍线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是程序中一个单一的挨次控制流程。
进程内一个相对自立的、可调度的执行单元,是系统自立调度和分派CPU 的基本单位指运行中的程序的调度单位。
在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程是允许应用程序并发执行多个任务的一种机制,是程序运行后的任务处理单元,也是SylixOS操作系统任务调度的最小单元。
在多核CPU中,同时可以有多个线程在执行,实现真正意义上的并行处理。
线程入口函数是一个能够完成特定任务的函数,因此线程入口函数的编写上与一般函数没有太多区分。
线程的创建函数如下:●创建线程失败,函数返回非0的错误代码,胜利返回0;●*thread pthread_t类型的缓冲区,保存一个线程的线程ID;●*attr 设置线程属性,设置为NULL标识创建的新线程使用默认属性;●*(*start_routine) 线程入口函数函数名●*arg 向所创建线程传入的参数1.2 信号量的概念信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。
在进入一个关键代码段之前,线程必需猎取一个信号量;一旦该关键代码段完成了,那么该线程必需释放信号量。
其它想进入该关键代码段的线程必需等待直到第一个线程释放信号量。
信号量是一个在进程和线程中都可以使用的同步机制。
信号量类似于一个通知,某个线程发出一个通知,等待此通知的线程收到通知后,会执行预先设置的工作。
嵌入式系统课程设计报告题目:连连看在uCOS II系统ARM平台的简单实现自动化2010级xxxxx xxxxx2012.12.10一.设计思路连连看游戏可以消灭一切成双成对的东东,为大家喜爱,老少皆宜;在实验平台上做连连看的实现,需结合触摸屏识别和LCD显示。
设计的关键分两个部分,硬件的核心在于触摸屏和LCD显示的实现,软件的核心是寻找方法实现识别相同图标并决定是否予以消灭。
最初试图采用穷举的方法逐步寻路试图实现确认相同图标能否相连消灭之,但尽了很大努力仍未实现识别寻路功能,因此一定程度上影响了整体进度和对硬件的熟悉;后来,突然想到连连看可以相消的两个图标之间是通过矩形相联系的。
于是程序的思路忽然明确起来,建立一个矩形寻路的函数,结合穷举的办法,在实现了自行寻路确认相消。
矩形是最终解救这个设计的钥匙。
幸运的是找到了这把钥匙,这点上体会了思维的偶然性。
本来打算按输入矩阵定制连连看解法,但是有了矩形这个钥匙后换输入矩阵程序无需更改函数主题,仅需改变a[6][8]和相应的b[6][8]。
程序写到这里是极大地鼓舞,现场调试希望是又一个鼓舞。
(结果很不乐观)解释一下矩形的思路,连连看游戏中可以消去(连线转弯次数不超过两次)的两图标连接,除了两图标挨着或直线相连的情况,其他情况都可以看做是通过A图标或A图标的在上下左右任一方向无阻碍的情况下延伸出去的中间点与B图标发生矩形相邻两边的联系。
二.设计效果(见最后,实际记录最后一次实验台调试结果)最后的设计效果达成很不乐观,软件上面再认真的思路也不如软硬件结合的联合调试有效,这是实实在在的体会了。
最终只实现连连看图形的显示,其他的种种还只是存在于软件里的代码而已,这让人无比遗憾。
在触摸板没法工作起来的情况下当时可以设置延时程序,给定消去办法显示连连看图标的消去,只是后话。
三.设计收获从学完C++后也没有再编过程序,这次设计编的程序给了复习C++的机会,结合这学期课程微机原理,在嵌入式设计中,深入体会了码农的欢乐与焦虑。
在找不到合适方法实现程序时,体会到深入学习数据结构等知识以及实践运用的必要性,所以决定寒假继续学习编程及嵌入式的知识。
另外,估计设计结果调试成功后的中午,从淘宝上买的arm Cortex-M3上搭的学习板也差不多收到了,据说Cortex-M3上也可以搭Ucos系统,到时候可以继续学习。
弥补嵌入式实验中硬件结合偏少的遗憾(因为最初分配的实验台在第二节实验课末尾开始就不工作了,有两次实验没能找到合适实验台,另外软件设计工作延后也是没法硬件调试的后腿)。
结果调试成功的失败了,学习板打开,Jlink一直连不上stm32,(终于知道这是ST意法半导体公司的Cotex-M3)百度论坛满世界最后找到方法,输入指令usb,识别成功,大半天已经过去,发现被我们无数次抱怨的“神奇”实验台原来要想从无到有的搭建起来必然是个大的工程。
看着学习板上一个个的模块,失望的发现,数电模电加上微机哦加上嵌入式还是被彻底的打败了,正是那句话纸上得来终觉浅,绝知此事要躬行。
经过网上的一番搜索,发现做stm的人很多,挺热的,有大量的QQ群,淘宝店,代码等等,不过在买来的开发板带的资料里面不知道谁说了一句,不同于51,stm尚没有成熟的教材,通过技术手册的自己探究更加有用。
这个冬天伴着屋外的风雪,开始对实验板慢慢熟悉。
大约在冬季,我写完了这个收尾性的设计报告。
四.设计代码/**************** try my best ****************/#include "INCLUDES.H" /*包含与uC/OS-II相关的系统调用的头文件 */ #include "mx1_aitc.h" /* 包含与中断控制器相关的头文件 */ #include "IRQ.h" /* 包含与中断管理相关的头文件 */#include "mx1_gpio.h"#include "misc.h"#include "mx1_lcdc.h"#include "mx1_asp.h" /*包含与触摸屏控制相关的头文件*/#include "mx1_uart.h" /*包含与串口通信的头文件*/#include "string.h"#include "stdio.h"static int a[][8]={{0},{0,0,1,1,1,1},{0,0,1,1,1,1},{0,0,1,1,1,1}, {0,0,1,1,1,1},{0}};//有无图标状态矩阵,0为无图标,1为有图标,2为选中static int b[][8]={{0},{0,0,2,3,2,4},{0,0,1,4,3,3},{0,0,1,2,4,1}, {0,0,4,1,3,2},{0}};//图标形状颜色状态矩阵,0为无。
static int c[6][8]={0};/*函数名称:getin;函数功能:将捕捉到的触摸点在哪个格子进行量化处理。
LCD屏幕显示的矩形{(30,30)(300,210)}横向9等分,纵向6等分,等效为一个9*6二维数组。
根据捕获输入触点落入屏幕所在格子将其转化为9*6的数点,其中新建了一点数点型变量pattern(图案),用作中间传值变量,保存处理结果*/void getin(D_POINT pixelPoint, D_POINT *pattern ){int x=0,y=0;//将捕获到的输入进行标准量化处理if(pixelPoint.x>300)x=0;if(pixelPoint.x>270 && pixelPoint.x<300)x=9;if(pixelPoint.x>240 && pixelPoint.x<270)x=8;if(pixelPoint.x>210 && pixelPoint.x<240)x=7;if(pixelPoint.x>180 && pixelPoint.x<210)x=6;if(pixelPoint.x>150 && pixelPoint.x<180)x=5;if(pixelPoint.x>120 && pixelPoint.x<150)x=4;if(pixelPoint.x>90 && pixelPoint.x<120)x=3;if(pixelPoint.x>60 && pixelPoint.x<90)x=2;if(pixelPoint.x>30 && pixelPoint.x<60)x=1;if(pixelPoint.x<30)x=0;if(pixelPoint.y>210)y=0;if(pixelPoint.y>180)y=6;if(pixelPoint.y>150 && pixelPoint.y<180)y=5;if(pixelPoint.y>120 && pixelPoint.y<150)y=4;if(pixelPoint.y>90 && pixelPoint.y<120)y=3;if(pixelPoint.y>60 && pixelPoint.y<90)y=2;if(pixelPoint.y>30 && pixelPoint.y<60)y=1;if(pixelPoint.y<30)y=0;/*量化完成后将量化处理结果保存至pattern中,当捕获输入点数不在范围内时,统一量化为点(0.0)*/if(x!=0&&y!=0){pattern->x=y;pattern->y=x;}else{pattern->x=0;pattern->y=0;}}/*函数名称:styletest函数功能:判断两点关系类型入口参数:两点坐标(x1,y1)(x2,y2)出口参数:两点关系(0:不同x也不同y.1:同x挨着,2:同y挨着,3:同x不挨着,4:同y不挨着)*/int styletest(int x1,int x2,int y1,int y2){if(x1-x2==0){if(y1-y2==1||y1-y2==-1)return 1;return 3;}if(y1-y2==0){if(x1-x2==1||x1-x2==-1)return 2;return 4;}return 0;}/*函数名称:findRect函数功能:判断两点能否通过两点确定的矩形的两条相邻边连接入口参数:两点坐标(x1,y1)(x2,y2)出口参数:两点关系(0连不上1能通过矩形靠右和靠上的两边相连2能通过矩形靠左和靠下的两边相连3能通过矩形靠左和靠上的两边相连,4能通过矩形靠右和靠下的两边相连)*/int findRect(int x1,int y1,int x2,int y2){if(x1>x2&&y1>y2){int i=x2,j=y2,m=x1,n=y1;for(;j<n;){j++;if(a[i][j]==1)break;}if(j==n){for(;i<m;i++)if(a[i][j]==1)break;}if(j==n&&i==m)return 1;//1能通过矩形靠右和靠上的两边相连i=x2;j=y2;m=x1;n=y1;for(;i<m;){i++;if(a[i][j]==1)break;}if(i==m){for(;j<n;j++)if(a[i][j]==1)break;}if(j==n&&i==m)return 2;// 2能通过矩形靠左和靠下的两边相连return 0; //0:fail in rect连不上}if(x1<x2&&y1<y2){int i=x1,j=y1,m=x2,n=y2;for(;j<n;){j++;if(a[i][j]==1)break;}if(j==n){for(;i<m;i++)if(a[i][j]==1)break;}if(j==n&&i==m)return 1;//1能通过矩形靠右和靠上的两边相连i=x1;j=y1;m=x2;n=y2;for(;i<m;){i++;if(a[i][j]==1)break;}if(i==m){for(;j<n;i++)if(a[i][j]==1)break;}if(j==n&&i==m)return 2;//2能通过矩形靠左和靠下的两边相连return 0; //0:fail in rect连不上}if(x1<x2&&y1>y2){int i=x2,j=y2,m=x1,n=y1;for(;i>m;){i--;if(a[i][j]==1)break;}if(i==m){for(;j<n;j++)if(a[i][j]==1)break;}if(i==m&&j==n)return 3;//3能通过矩形靠左和靠上的两边相连i=x1;j=y1;m=x2;n=y2;for(;j<n;){j++;if(a[i][j]==1)break;}if(j==n){for(;i>m;i--)if(a[i][j]==1)break;}if(i==m&&j==n)return 4;// 4能通过矩形靠右和靠下的两边相连) return 0; //0:fail in rect连不上}if(x1>x2&&y1<y2){int i=x1,j=y1,m=x2,n=y2;for(;i>m;){i--;if(a[i][j]==1)break;}if(i==m){for(;j<n;j++)if(a[i][j]==1)break;}if(i==m&&j==n)return 3;//3能通过矩形靠左和靠上的两边相连i=x1;j=y1;m=x2;n=y2;for(;j<n;j++)if(a[i][j]==1)break;if(j==n){for(;i>m;i--)if(a[i][j]==1)break;}if(i==m&&j==n)return 4;// 4能通过矩形靠右和靠下的两边相连)return 0; //0:fail in rect连不上}}/*函数名称:lianlian函数功能:连线并消灭一对相同的图标;首先显示连线矩阵c,然后显示消去后图标矩阵*/void lianlian(){int i=0,j=0;for(;i<7;i++){for(;j<8;j++){if(c[i][j]==1)MX1_LCDC_DrawLine(30,60,270,60,15,LS_SOLID); MX1_LCDC_DrawLine(30*j+30,30*i+45,30*j+60,30*i+45,27,LS_SOLID);if(c[i][j]==2)MX1_LCDC_DrawLine(30*j+45,30*i+30,30*j+45,30*i+60,27,LS_SOLID);if(c[i][j]==3){MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+60,27,LS_SOLID);MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+60,30*i+45,27,LS_SOLID);} if(c[i][j]==4){MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+60,27,LS_SOLID);MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+30,30*i+45,27,LS_SOLID);}if(b[i][j]==5){MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+30,27,LS_SOLID);MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+30,30*i+45,27,LS_SOLID);}if(b[i][j]==6){MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+30,27,LS_SOLID);MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+60,30*i+45,27,LS_SOLID);}c[i][j]=0;}} //连线完成开始消去MX1_LCDC_DrawRect(0,0,319,239,15,27,LS_SOLID,FS_SOLID); //重画框架MX1_LCDC_DrawRect(10,10,310,230,15,50,LS_SOLID,FS_SOLID);MX1_LCDC_DrawRect(30,30,300,210,15,50,LS_SOLID,FS_SOLID);MX1_LCDC_DrawLine(30,60,300,60,15,LS_SOLID);MX1_LCDC_DrawLine(30,90,300,90,15,LS_SOLID);MX1_LCDC_DrawLine(30,120,300,120,15,LS_SOLID);MX1_LCDC_DrawLine(30,150,300,150,15,LS_SOLID);MX1_LCDC_DrawLine(30,180,300,180,15,LS_SOLID);;MX1_LCDC_DrawLine(60,30,60,210,15,LS_SOLID);MX1_LCDC_DrawLine(90,30,90,210,15,LS_SOLID);MX1_LCDC_DrawLine(120,30,120,210,15,LS_SOLID);MX1_LCDC_DrawLine(150,30,150,210,15,LS_SOLID);MX1_LCDC_DrawLine(180,30,180,210,15,LS_SOLID);MX1_LCDC_DrawLine(210,30,210,210,15,LS_SOLID);MX1_LCDC_DrawLine(240,30,240,210,15,LS_SOLID);MX1_LCDC_DrawLine(270,30,270,210,15,LS_SOLID);for(i=0;i<7;i++) //重显示图标{for(j=0;j<8;j++){if(b[i][j]==0)MX1_LCDC_DrawRect(30*j+32,30*i+32,30*j+58,30*i+58,50,50,LS_SOLID,FS_S OLID);if(b[i][j]==1)MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,8,27,LS_SOLID,FS_SO LID);if(b[i][j]==2)MX1_LCDC_DrawCircle(30*j+45, 30*i+45,13,15,07,LS_SOLID,FS_SOLID);if(b[i][j]==3)MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,30,10,LS_SOLID,FS_S OLID);if(b[i][j]==4)MX1_LCDC_DrawCircle(30*j+45,30*i+45,13,30,47,LS_SOLID,FS_SOLID);}}}/*函数名称:lianzhu函数功能:在验证矩形两边可以连接两点后,把两点通过矩形的两边相连(改变显示连线参数矩阵c),为lianlian函数显示连线做准备;入口参数:两点坐标(x1,y1)(x2,y2);*/void lianzhu(int x1,int y1,int x2,int y2){if(findRect(x1,y1,x2,y2)==1){int tx=x1,tmx=x2,ty=y1,tmy=y2;if(x1>x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}c[tx][tmy]=4;ty++;for(;ty<tmy;ty++)c[tx][ty]=1;tx++;for(;tx<tmx;tx++)c[tx][ty]=2;a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian();}if(findRect(x1,y1,x2,y2)==2){int tx=x1,tmx=x2,ty=y1,tmy=y2;if(x1>x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}c[tmx][ty]=6;tx++;for(;tx<tmx;tx++)c[tx][ty]=2;ty++;for(;ty<tmy;ty++)c[tx][ty]=1;a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian();}if(findRect(x1,y1,x2,y2)==3){int tx=x1,tmx=x2,ty=y1,tmy=y2;if(x1<x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}c[tmx][ty]=3;tx--;for(;tx>tmx;tx--)c[tx][ty]=2;ty++;for(;ty<tmy;ty++)c[tx][ty]=1;a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian();}if(findRect(x1,y1,x2,y2)==4){int tx=x1,tmx=x2,ty=y1,tmy=y2;if(x1<x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}c[tx][tmy]=5;ty++;for(;ty<tmy;ty++)c[tx][ty]=1;tx--;for(;tx>tmx;tx--)c[tx][ty]=2;a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian();}}/* 用于时钟中断 */extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小 */ #define PRIO_TASK 3 /* 任务的优先级 */OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间 *//* 此函数定义了一个任务 */void YourTask( void *pdata ){int i,j,x1,y1,x2,y2,x,y,num=16,k,sh,xi,zu,yo,you;D_POINT pixelPoint,pattern ;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */ OSStartTimeTick();/* 在下面添加任务内容 */while( 1 ){MX1_LCDC_DrawRect(0,0,319,239,15,27,LS_SOLID,FS_SOLID); //画框架MX1_LCDC_DrawRect(10,10,310,230,15,50,LS_SOLID,FS_SOLID);MX1_LCDC_DrawRect(30,30,300,210,15,50,LS_SOLID,FS_SOLID);MX1_LCDC_DrawLine(30,60,300,60,15,LS_SOLID);MX1_LCDC_DrawLine(30,90,300,90,15,LS_SOLID);MX1_LCDC_DrawLine(30,120,300,120,15,LS_SOLID);MX1_LCDC_DrawLine(30,150,300,150,15,LS_SOLID);MX1_LCDC_DrawLine(30,180,300,180,15,LS_SOLID);MX1_LCDC_DrawLine(60,30,60,210,15,LS_SOLID);MX1_LCDC_DrawLine(90,30,90,210,15,LS_SOLID);MX1_LCDC_DrawLine(120,30,120,210,15,LS_SOLID);MX1_LCDC_DrawLine(150,30,150,210,15,LS_SOLID);MX1_LCDC_DrawLine(180,30,180,210,15,LS_SOLID);MX1_LCDC_DrawLine(210,30,210,210,15,LS_SOLID);MX1_LCDC_DrawLine(240,30,240,210,15,LS_SOLID);MX1_LCDC_DrawLine(270,30,270,210,15,LS_SOLID);for(i=0;i<6;i++)for(j=0;j<8;j++){if(b[i][j]==1)MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,8,27,LS_SOLID,FS_SO LID);if(b[i][j]==2)MX1_LCDC_DrawCircle(30*j+45, 30*i+45,13,15,07,LS_SOLID,FS_SOLID);if(b[i][j]==3)MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,30,10,LS_SOLID,FS_S OLID);if(b[i][j]==4)MX1_LCDC_DrawCircle(30*j+45,30*i+45,13,30,47,LS_SOLID,FS_SOLID);}CBA : while(num!=0) //当全部消去后重新开始下一局{while(k<2)//选定两个东东{k=0;TP_GetPixelInput( &pixelPoint, 50000 );while(pattern.x==0||pattern.y==0){getin(pixelPoint,&pattern);}i=pattern.x-1;j=pattern.y-1;if(a[i][j]==2) //判断是已选定该东东{a[i][j]=1; //取消该东东选定,取消蓝色虚线框,恢复白色底面MX1_LCDC_DrawRect(30*j+31,30*i+31,30+59,y1+59,15,50,LS_SOLID,FS_TRANS ); // FS_TRANS指只画矩形框LS_SOLID,指虚线k--;}else if(a[i][j]==1&&b[i][j]==b[x1][y1]){a[i][j]==2; //选定一个东东,用蓝色虚线框标注k++;if(k==1){x1=i;y1=j;}if(k==2){x2=i;y2=j;}x=30*j+31;y=30*i+31;MX1_LCDC_DrawRect( x,y,x+28,y+28, 8, 15, LS_DOTDOT, FS_TRANS );} // LS_DOTDOT,指虚线,蓝色虚线框;else if(b[i][j]!=b[x1][y1]){a[i][j]=1; //取消东东选定,取消蓝色虚线框,恢复白色底面MX1_LCDC_DrawRect( x,y,x+28,y+28, 15,50, LS_SOLID, FS_TRANS );k--;}} //选中两个图标的循环范围a[x1][y1]=2;a[x2][y2]=2; //表示选中两个图标if(styletest(x1,x2,y1,y2)==1||styletest(x1,x2,y1,y2)==2){a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian();num=num-2; goto CBA;} //最简单的两种情况,横向和竖向相连的情况if(styletest(x1,x2,y1,y2)==3){int t=y1,tm=y2;if(y1>y2){t=y2;tm=y1;}for(;t<tm;t++)if(a[x1][t]==1)break;if(t==tm){t=y1+1;if(y1>y2)t=y2+1;for(;t<tm;t++)c[x1][t]=1;a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian(); goto CBA; //在一条线上能通过直线相连}goto ABC; //在一条线上却不能能通过直线相连,试通过矩形相连}if(styletest(x1,x2,y1,y2)==4){int t=x1,tm=x2;if(x1>x2){t=x2;tm=x1;}for(;t<tm;t++)if(a[t][y1]==1)break;if(t==tm){t=x1+1;if(x1>x2)t=x2+1;for(;t<tm;t++)c[t][y1]=2;a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian(); goto CBA; //在一条线上能通过直线相连}goto ABC; //在一条线上却不能能通过直线相连,试通过矩形相连}if(findRect(x1,y1,x2,y2)!=0) //能用矩形两边相连的情况四种{lianzhu(x1,y1,x2,y2); goto CBA;}ABC://最普通的情况,通A图标的上下左右的衍生点加矩形两边连上B图标for(sh=x1;sh>=0;){sh--;if(a[sh][y1]==0)if(findRect(sh,y1,x2,y2)!=0){y ou++;break;}}if(you==1) //通过向上寻找一点搭起矩形两边的连接成功{int t=x1-1;for(;t>sh;t--)c[t][y1]=2;if(findRect(sh,y1,x2,y2)==2||findRect(sh,y1,x2,y2)==3)c[sh][y1]=4;if(findRect(sh,y1,x2,y2)==1||findRect(sh,y1,x2,y2)==4)c[sh][y1]=3; lianzhu(sh,y1,x2,y2);you=0; goto CBA;}for(xi=x1;xi<8;){xi++;if(a[xi][y1]==0)if(findRect(xi,y1,x2,y2)!=0){yo u++;break;}}if(you==1) //通过向下寻找一点搭起矩形两边的连接成功{int t=xi-1;for(;t>x1;t--)c[t][y1]=2;if(findRect(xi,y1,x2,y2)==2||findRect(xi,y1,x2,y2)==3)c[sh][y1]=5;if(findRect(xi,y1,x2,y2)==1||findRect(xi,y1,x2,y2)==4)c[sh][y1]=6; lianzhu(xi,y1,x2,y2); you=0; goto CBA;}for(zu=y1;zu>=0;){zu--;if(a[x1][zu]==0)if(findRect(x1,zu,x2,y2)!=0){y ou++;break;}}if(you==1) //通过向左寻找一点搭起矩形两边的连接成功{int t=y1-1;for(;t>zu;t--)c[x1][t]=1;if(findRect(x1,zu,x2,y2)==2||findRect(x1,zu,x2,y2)==3)c[sh][y1]=4;if(findRect(x1,zu,x2,y2)==1||findRect(x1,zu,x2,y2)==4)c[sh][y1]=3; lianzhu(x1,zu,x2,y2); you=0; goto CBA;}for(yo=y1;yo<9;){yo--;if(a[x1][yo]==0)if(findRect(x1,yo,x2,y2)!=0){yo u++;break;}}if(you==1) //通过向右寻找一点搭起矩形两边的连接成功{int t=yo-1;for(;t>y1;t--)c[x1][t]=1;if(findRect(x1,yo,x2,y2)==2||findRect(x1,yo,x2,y2)==3)c[sh][y1]=4;if(findRect(x1,yo,x2,y2)==1||findRect(x1,yo,x2,y2)==4)c[sh][y1]=3; lianzhu(x1,yo,x2,y2); you=0; goto CBA;}a[x1][y1]=1; a[x2][y2]=1; //取消东东选定,取消蓝色虚线框,恢复白色底面MX1_LCDC_DrawRect( 30*y1+31,30*x1+31,30*y1+59,30*x1+59, 15,50, LS_SOLID, FS_TRANS );MX1_LCDC_DrawRect( 30*y2+31,30*x2+31,30*y2+59,30*x2+59, 15,50, LS_SOLID, FS_TRANS );} //while(num!=0)范围} //while(1)范围} //任务YourTask的范围/* 初始化后,从这里开始执行C代码 */int __main( void ){unsigned int palette[LCDC_CMRAM_SIZE];int i;MX1_AITC_Init(); /* 初始化中断控制器 */IRQ_Init(); /* 初始化中断管理 */OSInit(); /* 初始化uC/OS-II内核数据结构 *///初始化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( 0xf, 0xf, 0xf );}MX1_LCDC_CMRAM_Set( palette );/* 建立一个任务 */OSTaskCreate( YourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK ); OSStart(); /* 开始调度 */return 0;}代码结束,灰机灰过去了。