登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看4623|回5|收藏
楼主 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)
(下载次数: 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

首页|标准版|触屏版|电脑版