基于51单片机电子指南针设计程序+原理图+PCB+Proteus仿真+设计报告

功能介绍:

系统采用了磁阻(GMR)传感器采集某一方向磁场强度后通过MCU控制器对其进行处理并显示上传,通过对电子指南针硬件电路和软件程序的分析,阐述了电子指南针基本的工作原理及实现。实际测试指南针模块精度达到1°,能够在LCD上显示当前方位并能通过键盘控制上传指南针处理得到的数据到上位机。

整个系统中前端的磁阻传感器负责测量地磁场的大小并将磁场的变化转化为微弱的电流的变化,专用的磁场测量芯片负责把磁阻传感器变化的电流(模拟量)转换成微控制器可以识别的数字量,然后通过芯片内部的SPI总线上传给微控制器。微控制器将表征当前磁场大小的数字量按照方位进行归一化等处理后通过直观的LCD进行方位显示,同时可以通过键盘控制微控制器进行相应的操作,如将转换后的数据通过串口的形式发送到上位机。整个系统中还包含了实时时钟等一些辅助电路,使整个系统功能得到进一步的扩展。

230-基于51单片机电子指南针设计(程序+原理图+PCB+仿真电路+论文)

 

程序部分展示,有中文注释,新手容易看懂

void DisCurDate(unsigned char x, unsigned char y)
{
    unsigned char Date[2];
	unsigned char DisBuf[11];
	ReadPCF8583(0x05, 2, Date);                                         /* 获取PCF8583的日期                                */         
	DisBuf[4] = (Date[0] & 0x0f) + '0';	                                /* 提取日个位                                       */
	DisBuf[3] = ((Date[0] >> 4) & 0x03) + '0';                          /* 提取日十位                                       */
	DisBuf[2] = '/';
	DisBuf[1] = (Date[1] & 0x0f) + '0';	                                /* 提取月个位                                       */
	DisBuf[0] = ((Date[1] >> 4) & 0x01) + '0';                          /* 提取月十位                                       */
	DisBuf[5] = '/';
    DisBuf[6] = '2';
    DisBuf[7] = '0';
    DisBuf[8] = '0';
    DisBuf[9] = '8';
    DisBuf[10]= '\0';                                                   /* 在数组最后单元放入标识符以便判断内容结束         */
    DispStr(y*20+x, DisBuf);
}

/******************************************************************************************************************************
**函数名称:DisClock()                                                                                                       **
**函数功能:绘制钟面                                                                                                         **   
**入口参数:显示位置                                                                                                         **
**出口参数:无                                                                                                               **
**具体资源:无                                                                                                               **
**调用程序:Circle(), Line(), WriteEN(), EasyCH()                                                                            **
**备    注:                                                                                                                 **
******************************************************************************************************************************/
void DrawClock(unsigned char x, unsigned char y, unsigned char r)
{
    Circle(x, y, r);
    Line(x, y-r, x, y-r+5, 0);                                          /* 绘制0点处竖线                                    */
    Line(x, y+r, x, y+r-5, 0);                                          /* 绘制6点处竖线                                    */
    Line(x-r, y, x-r+5, y, 0);                                          /* 绘制9点处竖线                                    */
    Line(x+r, y, x+r-5, y, 0);                                          /* 绘制3点处竖线                                    */
    WriteEN(198,'E');
    WriteEN(273,'S');
    WriteEN(189,'W');
    WriteEN(93,'N');
    EasyCH(3, 1, fang);
    EasyCH(3, 2, wei);
}


/******************************************************************************************************************************
**函数名称:GraphicTest()                                                                                                    **
**函数功能:显示子函数测试程序                                                                                               **   
**入口参数:无                                                                                                               **
**出口参数:无                                                                                                               **
**具体资源:无                                                                                                               **
**调用程序:显示子函数                                                                                                       **
**备    注:                                                                                                                 **
******************************************************************************************************************************/
void GraphicTest(void)
{
  	Circle(80, 63, 60);
	Rectangle(0, 0, 159, 127, 0);
	Triangle(0, 0, 20, 30, 120, 50);
	Line(0, 0, 159, 127, 0);
	Line(0, 127, 159, 0, 1);
}

/******************************************************************************************************************************
**函数名称:DisMain()                                                                                                        **
**函数功能:主显示界面                                                                                                       **   
**入口参数:显示位置                                                                                                         **
**出口参数:无                                                                                                               **
**具体资源:无                                                                                                               **
**调用程序:无                                                                                                               **
**备    注:仅用作测试使用                                                                                                   **
******************************************************************************************************************************/
void DisMain(void)
{
    Rectangle(0, 22, 159, 127, 0);
    DrawClock(113, 70, 45);    
    Line(0, 115, 159, 115, 0);
    Line(64, 22, 64, 115, 0);
}


/******************************************************************************************************************************
**函数名称:DisCurDirc()                                                                                                     **
**函数功能:显示当前方位指针                                                                                                 **   
**入口参数:显示角度                                                                                                         **
**出口参数:无                                                                                                               **
**具体资源:无                                                                                                               **
**调用程序:WriteEN(), Line()                                                                                                **
**备    注:                                                                                                                 **
******************************************************************************************************************************/
void DisCurDirc(unsigned int Dir)
{
    unsigned char tempx, tempy;
    unsigned char Dir1, Dir2, Dir3;
    
    Dir1 = Dir/100 +'0';                                                /* 提取其各位                                       */
    Dir2 = (Dir%100)/10 + '0';
    Dir3 = (Dir%100)%10 + '0';
    WriteEN(122, Dir1);
    WriteEN(123, Dir2);
    WriteEN(124, Dir3);
    
    Dir = Dir/3;                                                        /* 不满3的倍数的按3的倍数算                         */
    tempx = DirTbl[(Dir<<1)];
    tempy = DirTbl[((Dir<<1)+1)];
    LineClr(113, 70, oldtempx, oldtempy);
    Line(113, 70, tempx, tempy, 0); 
    oldtempx = tempx;
    oldtempy = tempy;
}

百度云盘资料分享链接 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于51单片机电子时钟项目需要通过Keil编写程序,并使用Proteus进行仿真电路搭建。该项目主要包括以下几个步骤: 1. 硬件搭建:按照电子时钟的设计需求,连接51单片机和相关的电子元件,如晶体振荡器、数码管、按键等。通过Proteus软件,可以将这些元件连接起来,搭建出完整的电路。 2. Keil程序编写:使用Keil软件,编写51单片机的C语言程序。该程序需要实现时钟的功能,包括时、分、秒的显示和计时、调整时间、闹钟功能等。通过编程,可以控制数码管的显示,以及对按键进行响应。 3. Proteus仿真:将编写好的程序通过Proteus软件连接至搭建好的电路。进行仿真测试时,可以通过模拟时钟的不同状态,调试和验证编写的程序的正确性和稳定性。仿真过程中,可以检查数码管的显示情况,以及程序对按键输入的响应。 4. 优化和调试:根据仿真过程中的结果,对程序进行优化和调试。可能需要根据具体的需求,修改程序中的一些逻辑或代码,确保电子时钟的功能正常运行,并符合设计要求。 总的来说,基于51单片机电子时钟项目需要通过Keil编写程序,并结合Proteus进行仿真电路搭建和测试。通过这样的开发流程,可以实现一个功能完善、稳定可靠的电子时钟。 ### 回答2: 基于51单片机电子时钟keil程序和protues仿真电路组成了一个完整的设计方案。 首先,keil程序是用于开发51单片机的集成开发环境,它提供了编译、调试和仿真等功能,能够帮助程序员快速开发出51单片机的应用程序。在电子时钟的设计中,我们可以使用keil来编写单片机的程序代码,实现时钟的各种功能。 其次,protues是一款电子设计自动化软件,它提供了电子电路仿真PCB布局设计等功能,能够帮助我们快速验证电路的正确性。在电子时钟的设计中,我们可以使用protues来建立电子时钟的仿真电路,验证单片机代码的正确性和稳定性。 基于51单片机电子时钟设计,我们可以使用keil来编写单片机的程序代码,实现时钟的各种功能,包括时间显示、报时功能、闹钟功能等。通过keil的编译、调试和仿真功能,我们可以验证代码的正确性和稳定性。 在电路设计方面,我们可以使用protues来建立电子时钟的仿真电路,通过仿真可以验证电路的正确性和稳定性,包括时钟电路、数码管驱动电路、按钮输入电路等。通过protues的电路仿真功能,我们可以检查电路设计的错误和漏洞,提前解决电路问题。 基于51单片机电子时钟keil程序和protues仿真电路的组合,我们可以全面验证电子时钟的功能和性能,确保设计的准确性和可靠性,为最终实现一个完整的电子时钟设计提供了有力的支持。 ### 回答3: 基于51单片机电子时钟keil程序和protues仿真电路可以实现以下功能: 1. 显示当前时间:我们可以使用数码管或LCD显示模块来显示当前的时、分和秒。通过编写相应的程序,我们可以从单片机的时钟源获取当前时间,并将其转换为可以在数码管或LCD上显示的格式。 2. 时间调整功能:可以通过按钮或旋钮等输入设备来调整电子时钟的时间。当用户按下或旋转输入设备时,我们可以响应用户的操作,并对时钟的时间进行相应的调整。 3. 闹钟功能:我们可以设置闹钟功能,让电子时钟在特定的时间点发出警报声。通过在程序中设置闹钟时间和警报声的播放方式,我们可以实现这一功能。 4. 温湿度监测:如果我们希望电子时钟能够同时监测室内的温度和湿度,我们可以连接温湿度传感器,并在程序中读取传感器的数据。然后,我们可以将这些数据显示在数码管或LCD上。 程序开发过程中,我们可以使用keil来编写51单片机程序,通过keil提供的调试工具来测试和调试程序的正确性。同时,我们可以在protues中设计仿真电子时钟的电路,包括单片机、显示模块、输入设备和传感器等所有的硬件组件。这样,我们可以在protues中验证电路的功能和效果,并进行性能优化和调试。当电路和程序都满足我们的要求后,我们就可以将程序烧录到实际的硬件上,并使用它作为一台完整的电子时钟了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值