单片机+MAX1898的智能手机充电器PCB电路Proteus仿真+源程序

发布者:骄阳少年最新更新时间:2020-01-19 来源: 51hei关键字:单片机  MAX1898  手机充电器 手机看文章 扫描二维码
随时随地手机看文章

本设计以单片机89C51为核心,并采用锂电池的智能管理芯片MAX1898对充电过程进行智能控制,并结合6N137光耦芯片对电池进行充满断电的方式进行保护。并且采用ADC0832模数转换芯片结合LCD1602液晶显示屏显示充电电压状态,加入SIM300模块,在充满电时为使用者发送充满信息。本帖包含设计的全部资料,包括对主控模块的效果进行Proteus模拟仿真,Altium设计出总原理图,并由原理图设计PCB图。


此体系的硬件设计包含以单片机89C51和充电芯片MAX1898为主要的控制的模块,SIM300模块是系统中发送短信息的模块。其它硬件部分包括电源转换部分、由ADC0832为核心的电压采集模块、6N137光耦控制模块、LCD1602显示模块等。软件设计包括主程序、读取电压子程序、显示数据子程序、SIM300信息收发信息程序。

Altium Designer画的原理图和PCB图如下:
 

仿真原理图如下
 

单片机源程序如下:

#include    //包含单片机寄存器的头文件

#include  //包含_nop_()函数定义的头文件

//ADC0832端口引脚定义

#define uchar unsigned char

#define uint unsigned int

unsigned int t_count,int0_count;

sbit CS=P2^4;       //将CS位定义为P2.4引脚

sbit CLK=P2^3;      //将CLK位定义为P2.3引脚

sbit DIO=P2^2;       //将DIO位定义为P2.2引脚

//全局变量声明

unsigned char code digit[10]={"0123456789"};   //定义字符数组显示数字

unsigned char code Str1[]={"Volt="};            //说明显示的是电压

unsigned char code Str2[]= {"Designed By Qi"};

//液晶端口定义

sbit RS=P2^7;           //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^6;           //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^5;            //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7;           //忙碌标志位,,将BF位定义为P0.7引脚

sbit BEEP=P1^3;

/* 定时器0中断服务子程序 */

void timer0()interrupt 1 using 1

{

        TR0 = 0;                                // 停止计数


        TH0 = -5000/256;                // 重设计数初值

        TL0 = -5000%256;


        t_count++;        


        if (t_count>600)                // 第一次外部中断0产生后3s

        {

                if (int0_count==1)        // 还没有出现第二次外部中断0,则认为充电完毕

                {

                        BEEP = 0;                        // 打开蜂鸣器报警关闭充电电源

                }

            else                                // 否则即是充电出错

                {        

                        BEEP = 1;                

                }

        

                ET0 = 0;                        // 关闭T0中断

                EX0 = 0;                         // 关闭外部中断0


                int0_count = 0;

                t_count = 0;

        }

        else

                TR0 = 1;                        // 启动T0计数

}

/* 外部中断0服务子程序 */

void int0() interrupt 0 using 1

{

        if (int0_count==0)

        {

                TH0 = -5000/256;        // 5ms定时

                TL0 = -5000%256;        

                TR0 = 1;                        // 启动定时/计数器0计数

                t_count = 0;                // 产生定时器0中断的计数器清零

        }

        int0_count++;

}


/* 初始化 */

void init()

{

        EA = 1;                                // 打开CPU中断


        PT0 = 1;                        // T0中断设为高优先级

        TMOD = 0x01;                // 模式1,T0为16位定时/计数器

        ET0 = 1;                        // 打开T0中断


        IT0 = 1;                        // 外部中断0设为边沿触发

        EX0 = 1;                        // 打开外部中断0        

        BEEP = 1;                                // 关闭蜂鸣器

        int0_count = 0;                // 产生外部中断0的计数器清零

}

/*****************************************************

函数功能:延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/

void delay1ms()

{

   unsigned char i,j; 

  for(i=0;i<10;i++)

   for(j=0;j<33;j++)

    ;  

}

/*****************************************************

函数功能:延时若干毫秒

入口参数:n

***************************************************/

void delaynms(unsigned char n)

{

   unsigned char i;

for(i=0;i    delay1ms();

}

/*****************************************************

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

bit BusyTest(void)

  {

    bit result;

RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态

    RW=1;

    E=1;        //E=1,才允许读写

    _nop_();   //空操作

    _nop_();

    _nop_();

    _nop_();   //空操作四个机器周期,给硬件反应时间 

    result=BF;  //将忙碌标志电平赋给result

   E=0;         //将E恢复低电平

   return result;

  }

/*****************************************************

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

***************************************************/

void WriteInstruction (unsigned char dictate)

{  

    while(BusyTest()==1);   //如果忙就等待

  RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令

  RW=0;  

  E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,

                           // 就是让E从0到1发生正跳变,所以应先置"0"

  _nop_();

  _nop_();               //空操作两个机器周期,给硬件反应时间

  P0=dictate;            //将数据送入P0口,即写入指令或地址

  _nop_();

  _nop_();

  _nop_();

  _nop_();               //空操作四个机器周期,给硬件反应时间

  E=1;                   //E置高电平

  _nop_();

  _nop_();

  _nop_();

  _nop_();               //空操作四个机器周期,给硬件反应时间

   E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:指定字符显示的实际地址

入口参数:x

***************************************************/

void WriteAddress(unsigned char x)

{

     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

/*****************************************************

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

***************************************************/

void WriteData(unsigned char y)

{

    while(BusyTest()==1); 

   RS=1;           //RS为高电平,RW为低电平时,可以写入数据

   RW=0;

   E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,

                     // 就是让E从0到1发生正跳变,所以应先置"0"

   P0=y;           //将数据送入P0口,即将数据写入液晶模块

   _nop_();

   _nop_();

    _nop_();

     _nop_();       //空操作四个机器周期,给硬件反应时间

   E=1;           //E置高电平

   _nop_();

   _nop_();

   _nop_();

  _nop_();        //空操作四个机器周期,给硬件反应时间

  E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:对LCD的显示模式进行初始化设置

***************************************************/

void LcdInitiate(void)

{

    delaynms(15);               //延时15ms,首次写指令时应给LCD一段较长的反应时间

    WriteInstruction(0x38);     //显示模式设置:16×2显示,5×7点阵,8位数据接口

delaynms(5);                //延时5ms ,给硬件一点反应时间

    WriteInstruction(0x38);

delaynms(5);               //延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);     //连续三次,确保初始化成功

delaynms(5);               //延时5ms ,给硬件一点反应时间

WriteInstruction(0x0c);     //显示模式设置:显示开,无光标,光标不闪烁

delaynms(5);               //延时5ms ,给硬件一点反应时间

WriteInstruction(0x06);     //显示模式设置:光标右移,字符不移

delaynms(5);                //延时5ms ,给硬件一点反应时间

[1] [2]
关键字:单片机  MAX1898  手机充电器 引用地址:单片机+MAX1898的智能手机充电器PCB电路Proteus仿真+源程序

上一篇:对180度360度sg90舵机的使用经验+单片机程序
下一篇:单片机声控音乐彩灯Proteus仿真程序

推荐阅读最新更新时间:2024-11-12 16:19

MCP2510 CAN通信程序(pic单片机)
// ========CAN通信程序======= #include PIC.h #include PIC16f87x.h #include mcp2510.h // MCP2510寄存器定义 // =========常数和变量定义========= #define READ 0x03 // 读MCP2510指令代码 #define WRITE 0x02 // 写MCP2510指令代码 #define RESET 0xC0 // 复位MCP2510指令代码 #define RTS 0x80 // MCP2510请求发送指令代码
[单片机]
测试手机充电器变压器电路图
  测试手机充电器的方法非常简单,就是把充电器上的变压器拆掉,然后把待侧变压器接上去,测量充电器的输出电压是否合格,一般是4.5,4.6或者5.0,5.1测试的方法有俩大问题,一是经常烧坏充电器的其他元件,二是正次品区别不大,有的相差就0.1负。最容易坏的就是4148,小3极管,还有稳压管。如果本身是可以直接接交流电的变压器,那就直接把变压器接到交流电上,然后测变压器次级的交流电压就好了。为了安全,可以使用1:1的隔离变压器来隔离市电。这个做法的特点是,直接测量变压器,不会因为变压器不合格而损坏充电器的其他元件。    电路原理: 该充电器电路主要由振荡电路,充电电路,稳压保护电路等组成,其输入电压AC220V,50/60Hz,
[电源管理]
测试<font color='red'>手机</font><font color='red'>充电器</font>变压器电路图
PIC16F628单片机构成PVS控制系统
  本文以利用PIC16F628单片机构成PVS控制系统为例,从硬件系统设计和软件系统设计入手,给出了印制电路板图、电路原理图。   硬件系统设计   该PVS控制系统以PIC16F628单片机为核心,由PIC16F628单片机及其外围元器件、电源模块、继电器模块组成,印制电路板和电路原理图如图1、图2所示。 图1 印制电路板 图2 原理图   PIC16F628单片机及其外围元器件   PIC16F628单片机是由Microchip公司生产的PIC系列8位CMOS闪存单片机之一,该系列单片机采用RISC(Reduced Instruction Set Computer)嵌入式结构,具有执行速度高、功耗低、
[单片机]
PIC16F628<font color='red'>单片机</font>构成PVS控制系统
STM8S105系列单片机的PWM输出配置
STM8S105xx的定时器资源: (1)2个16位通用定时器(TIM2、TIM3),带有2+3个CAPCOM通道(IC、OC或PWM); (2)高级控制定时器(TIM1):16位,4个CAPCOM通道(捕获/比较通道),3个互补输出,死区插入和灵活的同步; (3)带有8位预分频器的8位基本定时器(TIM4); (4)自动唤醒定时器; (5)2个看门狗定时器:窗口看门狗和独立看门狗。 使用高级控制定时器和普通通用定时器的PWM输出功能在初始化配置上有差异,下面做简单分析: TIM1——16位高级控制定时器 带有16位预分频的16位递增、递减和双向自动重装载计数器 TIM2、TIM3——16位通
[单片机]
STM8S105系列<font color='red'>单片机</font>的PWM输出配置
德州仪器宣布其SimpleLink™ MCU平台集成全新的Amazon FreeRTOS
德州仪器(TI)近日宣布,SimpleLink™微控制器(MCU)平台集成全新的亚马逊FreeRTOS,帮助开发商快速而安全地将物联网(IoT)终端连接到云端。亚马逊网络服务(AWS)与德州仪器合作开发了集成的硬件和软件解决方案,使开发人员能够快速建立与AWS物联网服务的连接,立即开始系统开发。如需了解更多信息,敬请访问 www.ti.com/AWSIoT-pr-cn 。 亚马逊近日在拉斯维加斯的AWS re:Invent 2017大会上推出了FreeRTOS,可提供快速方便地部署基于微控制器的连接器件和开发物联网应用所需的工具,使用户无需再为涉及数百万器件的扩展而困扰。连接后,物联网器件应用程序可以利用云服务提供的各项功能
[物联网]
德州仪器宣布其SimpleLink™ <font color='red'>MCU</font>平台集成全新的Amazon FreeRTOS
51单片机使用定时器中断模拟PWM控制端口电压
最近应实验室需求写一篇51单片机产生PWM的文章供参考. 单片机芯片STC89C52,晶振12MHz,编译环境Keil5. 分析:若使单片机端口为高电平, 则单片机输出电压为恒值5V. 反之低电平输出电压为0V. 但是我们如果在周期为T的时间内使单片机高电平出现t1秒, 低电平出现t2秒, 那么在周期内, 高电平出现的时间为 , 低电平时间为 . 由于周期T的时间极短, 那么在连续的时间t内, 相应端口输出电压为 . 实验使用定时器0, 定时器0由两个寄存器进行控制,分别为定时器/计数器工作方式寄存器TMOD, 定时器/计数器控制寄存器TCON. TMOD是一个八位寄存器,如下: TMOD寄存器高4位控
[单片机]
51<font color='red'>单片机</font>使用定时器中断模拟PWM控制端口电压
单片机寄存器按bit处理方法
前言 现在主流单片机STM32或者EFM32等性能较为强大的单片机官方都提供了库文件和函数,具有较高的封装程序,配置寄存器的时候直接只用库文件中的宏即可,但是对于一些C8051内核的单片机,没有教好的封装库,仍然需要使用最原始的寄存器配置方式,此时常常遇到这样的问题: 1、一个寄存器有的bit位代表功能需要配置,有的位则不用配置(甚至大多数时候,剩余位可能我都还不清楚它的功能,我们就是不想去操作,让它保持原有状态),我们如何操作? 2、修改功能的时候,我们能快速的修改指定位,而不是重新把寄存器整个功能看一遍 一、方法 比较好实现上述的方法就是寄存器配置的时候能够按bit配置并且不影响其他bit位原有值。 二、具体实例 我先
[单片机]
基于51单片机的智能灯光控制系统
一.硬件方案 智能灯光控制系统由单片机最小系统、人体感应模块、关照强度模块、灯光控制模块、电源模块和灯泡组成。本文以STC89C52单片机为核心,通过利用光照度和红外人体感应相结合主动与被动的探测方法,现了室内无人或者关照充足时灯光自动光灯,有人到来且光照不足时自动开启灯光。当人们进入家门或走出公寓,楼道灯延时一分钟后会自动熄灭。在白天,即使有人走过时,灯也不会亮,可以达到节能的目的。 主要由51单片机最小系统+红外热释电模块+光强度检测模块+继电器灯光控制模块+电源模块组成;如图: 二.设计功能 (1)通过红外热释电传感器检测人体信号。 (2)光敏电阻检测环境光的光线强度,然后通过比较器电路做比较,输出信号给单片机。 (
[单片机]
基于51<font color='red'>单片机</font>的智能灯光控制系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved