登录
|
立即注册
|
使用QQ帐号登录
论坛
>
51单片机
发帖
|
太阳能晚间定时小夜灯的单片机源程序与PCB
看4623
|
回5
|
收藏
楼主
ID:122843
只看他
2017-12-2 21:57
好久没来51HEI了。乱折腾 最近做了一套太阳能定时小夜灯 简单 勿喷
pcb板:
单片机源程序如下:
代码:
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200L
//#define FOSC 24000000L
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR = 0x8e; //辅助寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
WORD second = 0;
WORD minute = 0;
WORD hour = 0;
BYTE Ax;//电池ADC
BYTE Ay;//SUN_BT_CH
sbit Cd = P1^4;//充电
sbit LED0 = P3^0;
sbit LED1 = P3^1;
sbit LED2 = P3^2;
sbit LED3 = P3^3;
sbit LED4 = P3^6;
sbit LED5 = P3^7;
sbit LED6 = P1^0;
sbit LED7 = P1^1;
sbit LED8 = P1^2;
void InIt();
void DelayXms(WORD n);
void InitADC();
BYTE GetADC(BYTE ch);
void DcTest();
void InIt()
{
Cd = 1;
LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
}
/*----------------------------
软件延时
----------------------------*/
void DelayXms( WORD n ) //@12.000MHz
{
BYTE i, j;
do{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}while(--n);
}
/*---------------------------
ADC初始化
----------------------------*/
void InitADC(){
P1ASF = 0x11; //设置P1.0,P1.4口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
DelayXms(2); //ADC上电并延时
}
/*----------------------------
ADC检测
----------------------------*/
BYTE GetADC(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
return ADC_RES; //返回ADC结果
}
/*---------------------------
定时器T0中断初始化
----------------------------*/
void TimInt(){
TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时
TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=0;
}
/*-----------------------------
电池充电检测
-----------------------------*/
void DcTest(){
if((Ax<=115)||(Ax>=235)){//电池故障或充满
Cd = 0;
}
if (115<Ax<235){//充电
Cd = 1;
}
}
/*-----------------------------
电池照明
------------------------------*/
void DcOnLine(){
TR0=1;
DelayXms(100);
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
if(hour == 3){
LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
}
}
/*----------------------------
主函数
----------------------------*/
void main(){
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
InIt();
InitADC();
TimInt();
while(1){
Ax=GetADC(5);
Ay=GetADC(3);
DcTest();
if(Ay<50){
DelayXms(5);
if(Ay<50){
DcOnLine();
}
}
}
}
/********************************/
/* 定时中断0 */
/********************************/
void tim(void) interrupt 1 using 1{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料51hei提供下载:
SUN_TIME_LED.zip
(31.59 KB)
(下载次数: 61, 2017-12-2 21:57 上传)
下载积分: 黑币 -5
沙发
ID:122843
只看他
2017-12-17 15:53
问题解决了 代码存在少量BUG 将ADC检测改为IO 定时3H 折腾
板凳
ID:122843
只看他
2018-1-25 19:44
测试结果满意 光伏板采用小功率的 5V 2W
地板
ID:140183
只看他
2018-1-30 06:37
很好的资料,参考参考..........
5
#
ID:556770
只看他
2019-9-22 16:34
不错,学习好资料
6
#
ID:237797
只看他
2019-9-24 11:41
把原理图贴出来
51黑电子论坛
Powered by
Discuz!
X3.1
首页
|
标准版
|
触屏版
|
电脑版