手电因小开发板有指示灯,休眠电流大点,但实际能用,开机20MA.待机10MA.休眠3MA。。其实没有灯或换个低功耗的单片就完美了。。。
制作出来的实物图如下:
单片机程序源码:
#include <reg52.h> //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6 ;
sbit RW = P2^5 ;
sbit EN = P2^7 ;
sbit STA7 = P0^7;
uint num,num1;
sbit led= P1^0 ;//灯
sbit k1= P3^2 ;//开关
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
/**
* 等待繁忙标志
*/
void wait(void)
{
P0 = 0xFF;
do
{
RS = 0;
RW = 1;
EN = 0;
EN = 1;
}while (STA7 == 1);
EN = 0;
}
/**
* 写数据
*/
void w_dat(uint dat)
{
wait();
EN = 0;
P0 = dat;
RS = 1;
RW = 0;
EN = 1;
EN = 0;
}
/**
* 写命令
*/
void w_cmd(uint cmd)
{
wait();
EN = 0;
P0 = cmd;
RS = 0;
RW = 0;
EN = 1;
EN = 0;
}
/**
* 发送字符串到LCD
*/
void write_zfc(uchar *p)//定义一个带指针的函数?(字符串)
{
while(*p!=0)//不能用";"
w_dat(*p++);
}
/**
* 初始化1602
*/
void Init_LCD1602(void)
{
w_cmd(0x38); // 16*2显示,5*7点阵,8位数据接口
w_cmd(0x0C); // 显示器开、光标开、光标允许闪烁
w_cmd(0x06); // 文字不动,光标自动右移
w_cmd(0x01); // 清屏
}
void main()
{
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
EX0=1;
EX1=1;
TR0=1;
delayms(15);
ET0=0;
PCON=0x02; //(或PCON=0x01;)
while(1)
{
delayms(15);
if(k1==0)//进入空闲或休眠模式
{
while(!k1);
{
led=~led;//
delayms(50);
if(led==0)
{
delayms(3);
led=0;
}
else
{
ET0=0;
PCON=0x02; //(或PCON=0x01;)
}
}
}
}
}
void ex_int0() interrupt 0//外部中断P3.2 进行PCON=0;唤醒单片机 CPU
{
PCON=0;
ET0=1;
}
|