找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4327|回复: 5
收起左侧

太阳能晚间定时小夜灯的单片机源程序与PCB

[复制链接]
ID:122843 发表于 2017-12-2 21:57 | 显示全部楼层 |阅读模式
好久没来51HEI了。乱折腾 最近做了一套太阳能定时小夜灯  简单  勿喷

pcb板:
QQ截图20171202215116.png

单片机源程序如下:

  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define FOSC    11059200L
  4. //#define FOSC    24000000L
  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. sfr P0M1 = 0x93;
  8. sfr P0M0 = 0x94;
  9. sfr P1M1 = 0x91;
  10. sfr P1M0 = 0x92;
  11. sfr P2M1 = 0x95;
  12. sfr P2M0 = 0x96;
  13. sfr P3M1 = 0xb1;
  14. sfr P3M0 = 0xb2;
  15. sfr P4M1 = 0xb3;
  16. sfr P4M0 = 0xb4;
  17. sfr P5M1 = 0xC9;
  18. sfr P5M0 = 0xCA;
  19. sfr P6M1 = 0xCB;
  20. sfr P6M0 = 0xCC;
  21. sfr P7M1 = 0xE1;
  22. sfr P7M0 = 0xE2;

  23. sfr  AUXR       =   0x8e;                                                       //辅助寄存器   
  24. sfr ADC_CONTR   =   0xBC;                   //ADC控制寄存器
  25. sfr ADC_RES     =   0xBD;                   //ADC高8位结果
  26. sfr ADC_LOW2    =   0xBE;                   //ADC低2位结果
  27. sfr P1ASF       =   0x9D;                   //P1口第2功能控制寄存器
  28.                                             
  29. #define ADC_POWER   0x80                    //ADC电源控制位
  30. #define ADC_FLAG    0x10                    //ADC完成标志
  31. #define ADC_START   0x08                    //ADC起始控制位
  32. #define ADC_SPEEDLL 0x00                    //540个时钟
  33. #define ADC_SPEEDL  0x20                    //360个时钟
  34. #define ADC_SPEEDH  0x40                    //180个时钟
  35. #define ADC_SPEEDHH 0x60                    //90个时钟

  36. WORD second = 0;
  37. WORD minute = 0;
  38. WORD hour = 0;
  39. BYTE Ax;//电池ADC
  40. BYTE Ay;//SUN_BT_CH

  41. sbit Cd = P1^4;//充电
  42. sbit LED0 = P3^0;
  43. sbit LED1 = P3^1;
  44. sbit LED2 = P3^2;
  45. sbit LED3 = P3^3;
  46. sbit LED4 = P3^6;
  47. sbit LED5 = P3^7;
  48. sbit LED6 = P1^0;
  49. sbit LED7 = P1^1;
  50. sbit LED8 = P1^2;

  51. void InIt();
  52. void DelayXms(WORD n);
  53. void InitADC();
  54. BYTE GetADC(BYTE ch);
  55. void DcTest();
  56. void InIt()
  57. {
  58. Cd = 1;
  59. LED0 = 1;
  60. LED1 = 1;        
  61. LED2 = 1;
  62. LED3 = 1;        
  63. LED4 = 1;
  64. LED5 = 1;        
  65. LED6 = 1;
  66. LED7 = 1;
  67. LED8 = 1;
  68. }
  69. /*----------------------------
  70. 软件延时
  71. ----------------------------*/
  72. void DelayXms( WORD n )                //@12.000MHz
  73. {
  74.         BYTE i, j;

  75.         do{
  76.                 i = 12;
  77.                 j = 169;
  78.                 do
  79.                 {
  80.                         while (--j);
  81.                 } while (--i);
  82.         }while(--n);
  83. }
  84. /*---------------------------
  85. ADC初始化
  86. ----------------------------*/
  87. void InitADC(){
  88.     P1ASF = 0x11;                   //设置P1.0,P1.4口为AD口
  89.     ADC_RES = 0;                    //清除结果寄存器
  90.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  91.     DelayXms(2);                       //ADC上电并延时
  92. }
  93. /*----------------------------
  94. ADC检测
  95. ----------------------------*/
  96. BYTE GetADC(BYTE ch)
  97. {
  98.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  99.     _nop_();                        //等待4个NOP
  100.     _nop_();
  101.     _nop_();
  102.     _nop_();
  103.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
  104.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  105.     return ADC_RES;                 //返回ADC结果
  106. }
  107. /*---------------------------
  108. 定时器T0中断初始化
  109. ----------------------------*/
  110. void TimInt(){
  111.         TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时
  112.         TH0=0xd8;
  113.         TL0=0xf0;
  114.         ET0=1;
  115.         TR0=0;
  116. }
  117. /*-----------------------------
  118. 电池充电检测
  119. -----------------------------*/
  120. void DcTest(){
  121.            if((Ax<=115)||(Ax>=235)){//电池故障或充满
  122.                                 Cd = 0;
  123.                  }
  124.      if (115<Ax<235){//充电
  125.                          Cd = 1;
  126.                  }
  127. }
  128. /*-----------------------------
  129. 电池照明
  130. ------------------------------*/
  131. void DcOnLine(){
  132.     TR0=1;
  133.           DelayXms(100);
  134.                 LED0 = 0;
  135.                 LED1 = 0;        
  136.                 LED2 = 0;
  137.                 LED3 = 0;        
  138.                 LED4 = 0;
  139.                 LED5 = 0;        
  140.                 LED6 = 0;
  141.                 LED7 = 0;
  142.                 LED8 = 0;
  143.         if(hour == 3){
  144.                 LED0 = 1;
  145.                 LED1 = 1;        
  146.                 LED2 = 1;
  147.                 LED3 = 1;        
  148.                 LED4 = 1;
  149.                 LED5 = 1;        
  150.                 LED6 = 1;
  151.                 LED7 = 1;
  152.                 LED8 = 1;
  153.         }
  154. }
  155. /*----------------------------
  156. 主函数
  157. ----------------------------*/
  158. void main(){
  159.     P0M0 = 0x00;
  160.     P0M1 = 0x00;
  161.     P1M0 = 0x00;
  162.     P1M1 = 0x00;
  163.     P2M0 = 0x00;
  164.     P2M1 = 0x00;
  165.     P3M0 = 0x00;
  166.     P3M1 = 0x00;
  167.     P4M0 = 0x00;
  168.     P4M1 = 0x00;
  169.     P5M0 = 0x00;
  170.     P5M1 = 0x00;
  171.     P6M0 = 0x00;
  172.     P6M1 = 0x00;
  173.     P7M0 = 0x00;
  174.     P7M1 = 0x00;
  175.         
  176.     InIt();
  177.           InitADC();
  178.           TimInt();
  179.                 while(1){
  180.                   Ax=GetADC(5);
  181.                         Ay=GetADC(3);
  182.                         DcTest();
  183.                         if(Ay<50){
  184.                           DelayXms(5);
  185.                                 if(Ay<50){
  186.                                   DcOnLine();
  187.                                 }
  188.                         }
  189.                 }
  190.         }
  191. /********************************/
  192. /*      定时中断0                */
  193. /********************************/
  194. void tim(void) interrupt 1 using 1{
  195. ……………………

  196. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SUN_TIME_LED.zip (31.59 KB, 下载次数: 60)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 | 显示全部楼层
很好的资料,参考参考..........
回复

使用道具 举报

ID:556770 发表于 2019-9-22 16:34 | 显示全部楼层
不错,学习好资料
回复

使用道具 举报

ID:237797 发表于 2019-9-24 11:41 | 显示全部楼层
把原理图贴出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表