找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2662|回复: 9
打印 上一主题 下一主题
收起左侧

stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB

  [复制链接]
跳转到指定楼层
楼主
ID:680729 发表于 2022-11-23 22:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
历经千辛万苦,我的孵化器温控器终于搞成了。在此感谢51黑网友的大力支持。程序和图纸奉上,欢迎大家指正,并加以完善。
图片详见:http://www.51hei.com/bbs/dpj-224670-1.html

制作出来的孵化器实物图如下:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /******************************************
  2. 名称:aip650的驱动
  3. 时间:2022-11-13
  4. 版本:
  5. 作者:cjz
  6. **************************************************/
  7. //头文件
  8. #include <STC89X52RC.H>
  9. #include <absacc.h>
  10. #include  <intrins.h>
  11. #include <EEPROM.H>
  12. /*************************************************
  13.              常量、变量定义区




  14. ***************************************************/
  15. //常量定义
  16. #define true 1
  17. #define  false 0
  18. #define  uchar unsigned char
  19. #define  uint unsigned int


  20. //数组定义
  21. uchar Display_Code[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x40,0x00};
  22.          //共阴数码管段码 0,   1,  2,  3,  4 , 5,   6,  7,  8,  9,  .,   -,  不亮
  23. //uchar  Display_16Code[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  24. //16进 制段码(用于显示键值)0,   1,   2,  3,  4,  5,   6, 7,  8,   9,  a,   b,   c,   d,   e,   f
  25. uchar Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位码
  26. uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度调节


  27. uchar keyvalue;
  28. uint wendu;//用于存储温度值
  29. uint maxwendu;
  30. uchar maxwenduH;//最高温度高8位
  31. uchar maxwenduL;//最高温度低8位
  32. uint minwendu;
  33. uchar minwenduH;//最低温度高8位
  34. uchar minwenduL;
  35. uchar menu=0, cou;//菜单标志,计数,cou1
  36. uint h;//温度计算使用
  37. uint temp;//温度返回值
  38. //uchar k;


  39. /***************************温度小数部分用查表法*****************/
  40. uchar ditab[16]=
  41. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  42. uchar temp_data[2]={0x00,0x00};//读出温度暂存
  43. uchar display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用


  44. //定义IO口
  45. sbit   SDA=P3^7;
  46. sbit   SCL=P3^6;
  47. //sbit   beep=P1^4;
  48. sbit    DQ=P1^1;      //ds18b20温度输入口
  49. //sbit    DIN=P1^3;     //LED小数点控制


  50. /**********************************函数定义区************************************/
  51. //I2C相关
  52. /*******************************************************************************
  53. 功能:I2CWait
  54. 描述:I2C延时
  55. 参数:
  56. 返回:
  57. *******************************************************************************/
  58. void I2CWait(void)
  59. {_nop_();_nop_();_nop_();_nop_();
  60. }








  61. /*******************************************************************************
  62. 功能:I2CStart
  63. 描述:开启I2C总线
  64. 参数:
  65. 返回:位变量,1=I2C总线可用,0=不可用
  66. *******************************************************************************/
  67. bit I2CStart(void)
  68. {   
  69.         SDA=1;
  70.         SCL=1;
  71.         I2CWait();
  72. if(!SDA)
  73.         return false;//SDA线为低电平则总线忙,退出
  74.                 SDA=0;
  75.         I2CWait();
  76.         while(SDA)
  77.                 return false;//SDA线为高电平则总线出错,退出
  78.         SCL=0;
  79.         I2CWait();
  80.         return true;


  81. }


  82. /*******************************************************************************
  83. 功能:I2CStop(void)
  84. 描述:关闭I2C总线
  85. 参数:
  86. 返回:
  87. *******************************************************************************/
  88. void I2CStop(void)
  89. {
  90.   SDA=0;
  91.         SCL=0;
  92.         I2CWait();
  93.         SCL=1;
  94.         I2CWait();
  95.         SDA=1;


  96. }




  97. /*******************************************************************************
  98. 功能:I2CSendAck
  99. 描述:发送ACK信号
  100. 参数:
  101. 返回:
  102. *******************************************************************************/
  103. void I2CSendAck(void)
  104. {
  105.         SDA=0;
  106.         SCL=0;
  107.         I2CWait();
  108.         SCL=1;
  109.         I2CWait();
  110.         SCL=0;
  111. }




  112. /*******************************************************************************
  113. 功能:I2CSendNoAck
  114. 描述:发送  No Ack
  115. 参数:
  116. 返回:
  117. *******************************************************************************/
  118. /*void I2CSendNoAck(void)
  119. {   
  120.         SDA=1;
  121.         SCL=0;
  122.         I2CWait();
  123.         SCL=1;
  124.         I2CWait();
  125.         SCL=0;        
  126.         
  127. }*/


  128. /*******************************************************************************
  129. 功能:I2CWaitAck
  130. 描述:读取ACK信号
  131. 参数:
  132. 返回:位变量, 1=有ACK,0=无ACK
  133. *******************************************************************************/
  134. bit I2CWaitAck(void)
  135. {
  136.      uchar errtime=255;
  137.         SCL=0;
  138.         SDA=1;
  139.         I2CWait();
  140.         SCL=1;
  141.         I2CWait();
  142.         while(SDA)
  143.         {
  144.                 errtime--;
  145.                 if(!errtime)
  146.                         SCL=0;
  147.                 return false;
  148.         }
  149.         SCL=0;
  150.         return true;
  151.     }


  152. /*******************************************************************************
  153. 功能:I2CSendByte
  154. 描述:向总线发送一个字节
  155. 参数:待发送字节demand,发送顺序指示order
  156.                  order=1,从HI-->LO发送8bit数
  157.                  order=0,从LO-->HI发送8bit数
  158. 返回:
  159. *******************************************************************************/
  160. void I2CSendByte(uchar demand,bit order)
  161.                 {
  162.                         uchar i=8;
  163.                         if(order)
  164.                         {
  165.                                 while(i--)
  166.                                 {
  167.                                         SCL=0;
  168.                                         _nop_();
  169.                                         SDA=(bit)(demand&0x80);
  170.                                         demand<<=1;
  171.                                         I2CWait();
  172.                                         SCL=1;
  173.                                         I2CWait();
  174.                                 }
  175.                                 SCL=0;
  176.                         }
  177.                         else
  178.                         {
  179.                                 while(i--)
  180.                                 {
  181.                                         SCL=0;
  182.                                         _nop_();
  183.                                         SDA=(bit)(demand&0x01);
  184.                                         demand>>=1;
  185.                                         I2CWait();
  186.                                         SCL=1;
  187.                                         I2CWait();
  188.                                 }
  189.                                 SCL=0;
  190.                         }
  191.                 }


  192. /*******************************************************************************
  193. 功能:I2CReceiveByte
  194. 描述:从总线读一个字节
  195. 参数:
  196. 返回:
  197. *******************************************************************************/
  198. uchar I2CReceiveByte(void)
  199. {
  200.         uchar i=8;
  201.         uchar ddata=0;
  202.         SDA=1;
  203.         while(i--)
  204.         {
  205.                 ddata>>=1;//数据从低位开始读取
  206.                 SCL=0;
  207.                 I2CWait();
  208.                 SCL=1;
  209.                 I2CWait();//从低位开始 ddata|=SDA;ddata>>=1
  210.                 if(SDA)
  211.                 {
  212.                                    ddata|=0x80;
  213.                 }
  214.         }
  215.         SCL=0;
  216.              return ddata;
  217. }




  218. /*******************************************************************************
  219. 功能:从650读键值
  220. 描述:
  221. 参数:
  222. 返回:uchar键值
  223. *******************************************************************************/
  224. uchar AipReadKey()
  225. {
  226.                   uchar key;
  227.                      I2CStart();
  228.                      I2CSendByte(0x4f,1);
  229.                  if(I2CWaitAck())
  230.                                          {
  231.                                              key=I2CReceiveByte();
  232.                                                 
  233.                                            I2CSendAck();
  234.                                          }
  235.              I2CStop();
  236.                                          return key;
  237. }


  238. /*******************************************************************************
  239. 功能:向650发送地址,和数据
  240. 描述:
  241. 参数:
  242. 返回:
  243. *******************************************************************************/
  244. void Aip650_Set(uchar add,uchar dat)
  245. {
  246.   //写显存必须从高地址开始写
  247.         I2CStart();
  248.         I2CSendByte(add,1);
  249.         I2CSendAck();
  250.         I2CSendByte(dat,1);
  251.         I2CSendAck();
  252.         I2CStop();


  253. }




  254. /*******************************************************************************
  255. 功能:驱动数码管显示数字
  256. 描述:位码数组中选择对应的位地址,在段码数组中选择对应数字的段码发送给650
  257. 参数:
  258. 返回:
  259. *******************************************************************************/
  260. void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
  261. {
  262.         Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);


  263.          }






  264. /*******************************************************************************
  265. 功能:驱动数码管显示16进制数的代码
  266. 描述:
  267. 参数:
  268. 返回:


  269. void Aip650_DisPlay16(uchar Dig_Bit16,uchar Display_num16)
  270. {   
  271.      Aip650_Set(Dig_Bit_Code[Dig_Bit16-1],Display_16Code[Display_num16]);






  272.            }


  273. *******************************************************************************/






  274. /*******************************************************************************
  275. 功能:650清屏
  276. 描述:
  277. 参数:
  278. 返回:
  279. *******************************************************************************/
  280. void Aip650_CLR()
  281. {
  282.     uchar i;
  283.         for(i=0;i<4;i++)
  284.         {
  285.         Aip650_Set(Dig_Bit_Code[i],0x00);[/i][i]
  286.         }


  287. }


  288. /*******************************************************************************
  289. 功能:设置显示亮度
  290. 描述:
  291. 参数:
  292. 返回:
  293. *******************************************************************************/
  294. void Light_Level_Set(uchar level)
  295. {
  296.         Aip650_Set(0x48,Light_Level_Code[level-1]);
  297. }


  298. //温度用
  299. /*******************************************************************************
  300. 功能:delay 延时程序 11us
  301. 描述:
  302. 参数:
  303. 返回:
  304. *******************************************************************************/
  305. void delay(uint t)
  306. {
  307. for(;t>0;t--);
  308. }


  309. /*******************************************************************************
  310. 功能:Ds18b20 复位函数
  311. 描述:
  312. 参数:
  313. 返回:
  314. *******************************************************************************/
  315. void ow_reset(void)
  316. {
  317. uchar presence=1;
  318.         while(presence)
  319.         {while(presence)
  320.                 {
  321.                         DQ=1;
  322.                         _nop_();_nop_();//从高拉到低
  323.                         DQ=0;
  324.                         delay(50);//550us
  325.                         DQ=1;
  326.                         delay(6);//66us
  327.                         presence=DQ;//presence=0复位成功,继续下一步
  328.                 }
  329.                 delay(45);//延时500us
  330.                 presence=~DQ;
  331.         }
  332.         DQ=1;  //拉高电平
  333. }




  334. /*******************************************************************************
  335. 功能:Ds18b20写命令函数
  336. 描述:向总线上写1个字节
  337. 参数:
  338. 返回:
  339. *******************************************************************************/
  340. void write_byte(uchar val)
  341. {
  342. uchar i;
  343.         for(i=8;i>0;i--)
  344.         {DQ=1;_nop_();_nop_();//从高拉低
  345.         DQ=0; _nop_();_nop_();_nop_();_nop_();//5us
  346.                 DQ=val&0x01;// 最低位移出
  347.         delay(6);//66us
  348.         val=val/2;//右移一位}
  349. }
  350. DQ=1;
  351. delay(1);
  352. }




  353. /*******************************************************************************
  354. 功能:从18b20总线上读1字节
  355. 描述:
  356. 参数:
  357. 返回:value
  358. *******************************************************************************/
  359. uchar read_byte(void)
  360. {
  361. uchar i;
  362.         uchar value=0;
  363.         for(i=8;i>0;i--)
  364.         {
  365.                 DQ=1;_nop_();_nop_();
  366.                 value>>=1;
  367.                 DQ=0;_nop_();_nop_();_nop_();_nop_();//4us
  368.                 DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
  369.                 if(DQ)value|=0x80;
  370.                 delay(6);
  371.         }
  372.         
  373.         DQ=1;
  374.         return(value);
  375. }






  376. /*******************************************************************************
  377. 功能:读出温度
  378. 描述:
  379. 参数:
  380. 返回:
  381. *******************************************************************************/
  382. read_temp()
  383. {
  384. ow_reset();
  385.         delay(200);//总线复位
  386.         write_byte(0xcc);//发命令
  387.         write_byte(0x44);//发转换命令
  388.         ow_reset();
  389.         delay(1);
  390.         write_byte(0xcc);//发命令
  391.         write_byte(0xbe);
  392.         temp_data[0]=read_byte();//读温度的低字节
  393.         temp_data[1]=read_byte();//读温度的高字节
  394.         temp=temp_data[1];
  395.         temp<<=8;
  396.         temp=temp|temp_data[0];// 两字节合成一个整型变量
  397.         return temp;
  398. }










  399. /*******************************************************************************
  400. 功能:温度处理
  401. 描述:二进制数的高字节的低半字节和低字节的高半字节组成一个字,这个字节转换为十进制后,
  402. 就是温度的百、十、个位值,而剩下的低字节的低半字节转化成十进制后,就是温度值的小数部分。
  403. 参数:
  404. 返回:
  405. *******************************************************************************/
  406. void work_temp(uint tem)
  407. {
  408.         uchar n=0;
  409.         if(tem>6348)          //温度正负判断
  410.         {tem=65536-tem;n=1;}   //负温度求补码,标志位置1
  411.         display[4]=tem&0x0f;
  412.         display[0]=ditab[display[4]];//存入小数部分的显示值
  413.         display[4]=tem>>4;
  414.         display[3]=display[4]/100;//取百位数据暂存
  415.         display[1]=display[4]%100;//取后两位数据暂存
  416.         display[2]=display[1]/10;//取十位数据暂存
  417.         display[1]=display[1]%10;
  418.         /***********符号位显示判断*************************/
  419.         if(!display[3])
  420.         {
  421.         display[3]=0x0c;     //最高位为0时不显示
  422.           if(!display[2])
  423.         {
  424.         display[2]=0x0c;     //次高位为0时不显示
  425.         }
  426.         if(n)
  427.         {display[3]=0x0b;}    //负温度时最高位显示“-”
  428. }
  429. }


  430. /*******************************************************************************
  431. 功能:显示温度
  432. 描述:处理温度数值,发送650
  433. 参数:
  434. 返回:
  435. *******************************************************************************/
  436. void xianshiwendu(uint tem1)
  437. {
  438.          work_temp(tem1);
  439.           //Aip650_CLR();
  440.          Light_Level_Set(2);
  441.         // Aip650_DisPlay(2,10);//显示小数点
  442.          Aip650_DisPlay(3,display[2]);//十位
  443.    Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//个位加小数点
  444.         //Aip650_DisPlay(2,display[1]);//个位
  445.           Aip650_DisPlay(1,display[0]);//小数
  446. }




  447. /*******************************************************************************
  448. 功能:显示键值
  449. 描述:将按键的16进制代码送显示
  450. 参数:
  451. 返回:


  452. void xianshijianzhi(uchar key1)
  453. {uchar keyL,keyH;
  454.           keyL=key1&0x0f;
  455.                 Light_Level_Set(4);
  456.         Aip650_DisPlay16(1,keyL);
  457.         keyH=key1>>4;
  458.         
  459.         Aip650_DisPlay16(2,keyH);
  460. }
  461. *******************************************************************************/
  462. /*********************************************************************************************
  463. 函数名:定时/计数器初始化函数
  464. 调  用:T_C_init();
  465. /**********************************************************************************************/
  466. void Timer0_init (void){
  467.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  468.         EA = 1;        //中断总开关
  469.         TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
  470.         TL0 = 0xb0; //16位计数寄存器T0低8位
  471.         ET0 = 1; //T/C1中断开关
  472.         TR0 = 0; //T/C1关闭开关        
  473. }


  474. /*********************************************************************************************
  475. 函数名:定时/计数器1中断处理函数
  476. 调  用:[T/C1溢出后中断处理]
  477. /*****************************/
  478. void Timer0(void) interrupt 1  using 1{ //切换寄存器组到1
  479.     cou++;                      // 软计数器加1   
  480.     if(cou > 99){// 计数值到(5s)
  481.         cou = 0;// 软计数器清零
  482.         eepromEraseSector(0x2000); //擦除整个扇区
  483.         eepromWrite(0x2000,maxwenduH );//将 新的温度上限值高8位写入 EEPROM
  484.         eepromWrite(0x2001, maxwenduL);//将 新的温度上限值低8位写入 EEPROM
  485.         eepromWrite(0x2002,minwenduH );//将 新的温度下限值高8位写入 EEPROM
  486.         eepromWrite(0x2003, minwenduL);//将 新的温度下限值低8位写入 EEPROM         
  487.         TR0 = 0; //T/C1停止计数
  488.         menu=0;//返回 主菜单的温度显示界面                 
  489.     }               
  490.         TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
  491.         TL0 = 0xb0; //16位计数寄存器T0低8位
  492. }


  493. /*******************************************************************************
  494. 功能:
  495. 描述:
  496. 参数:
  497. 返回:
  498. *******************************************************************************/
  499. void Delay1ms (unsigned int a){ // 1ms延时程序
  500.         unsigned int i;
  501.         while( --a != 0){
  502.                 for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629  
  503.         }                                                      
  504. }


  505. /******************************主函数*****************************************
  506. 功能:
  507. 描述:
  508. 参数:
  509. 返回:
  510. *******************************************************************************/
  511. void main()
  512. {  
  513.    P3=0x00;
  514.          P1=0x00;
  515.          Aip650_CLR();
  516.          Timer0_init();//定时器初始化
  517.          
  518.         
  519.          //从eeprom读出开启和停止温度
  520.          maxwenduH=eepromRead(0x2000);
  521.          maxwenduL=eepromRead(0x2001);
  522.          maxwendu=maxwenduH*256+maxwenduL;//读出停止温度
  523.          minwenduH=eepromRead(0x2002);
  524.          minwenduL=eepromRead(0x2003);
  525.          minwendu=minwenduH*256+minwenduL;//读出开启温度*/
  526.         
  527.          
  528.           while(1)
  529.                 {
  530.                          keyvalue=AipReadKey();
  531.         /**********************显示温度界面******************************/
  532.                   if(menu==0){
  533.                           // for(k=15;k>0;k--){
  534.                            wendu=read_temp();
  535.                            
  536.                                 xianshiwendu(wendu);
  537.                         
  538.                                 /* if(keyvalue==0xfa){//k4按下温度上限下限值恢复出厂设置
  539.                                 Delay1ms(10);
  540.                                 if(keyvalue==0xfa){
  541.                                        
  542.                                         maxwendu=382;//温度上限38度
  543.                                         minwendu=370;//温度下限37度
  544.                                         minwenduL=minwendu;
  545.                                         minwenduH=(minwendu>>8);
  546.                                         maxwenduL=maxwendu;
  547.                                         maxwenduH=(maxwendu>>8);
  548.                                         eepromEraseSector(0x2000); //擦除整个扇区
  549.                                         eepromWrite(0x2000,maxwenduH );//将 新的温度上限值高8位写入 EEPROM
  550.                                         eepromWrite(0x2001, maxwenduL);//将 新的温度上限值低8位写入 EEPROM
  551.                                         eepromWrite(0x2002,minwenduH );//将 新的温度下限值高8位写入 EEPROM
  552.                                         eepromWrite(0x2003, minwenduL);//将 新的温度下限值低8位写入 EEPROM         
  553.                                        
  554.                                 }
  555.                         }        */
  556.                    }        
  557.                         /*********************进入调温度上限界面*******************************/
  558.                   if(menu==1){
  559.                          if(minwendu>maxwendu) //如果下限温度高于上限温度,显示00
  560.                          { Aip650_CLR();
  561.                            Light_Level_Set(2);
  562.                            Aip650_DisPlay(1,0);
  563.                            Aip650_DisPlay(2,0);
  564.                          }
  565.                          else
  566.                          {
  567.                                 xianshiwendu(maxwendu);}
  568.                                 
  569.                          if(keyvalue==0xf2){
  570.                                 Delay1ms(10);
  571.                                  if(keyvalue==0xf2){
  572.                                 maxwendu++; //按下K2键则温度上限加零点一度
  573.                                  cou=0;//重新计数
  574.                                  TR0 = 1; //T/C1启动开关
  575.                                    maxwenduL=maxwendu;
  576.                                 maxwenduH=(maxwendu>>8);                                
  577.                                  while(keyvalue!=0xf2);
  578.                                 
  579.                                 }
  580.                           }
  581.                         
  582.                          if(keyvalue==0xe2){
  583.                                 Delay1ms(10);
  584.                                  if(keyvalue==0xe2){
  585.                                 maxwendu--; //按下K1键则温度上限减零点一度
  586.                                  cou=0;//重新计数
  587.                                  TR0 = 1; //T/C1启动开关
  588.                            maxwenduL=maxwendu;
  589.                                 maxwenduH=(maxwendu>>8);                                
  590.                                  while(keyvalue!=0xe2);
  591.                                 
  592.                                 }
  593.                           }
  594.                         
  595.                    }
  596.         /*********************进入调温度下限界面*******************************/
  597.           if(menu==2){
  598.                          if(minwendu>maxwendu) //如果下限温度高于上限温度,显示00
  599.                          { Aip650_CLR();
  600.                            Light_Level_Set(2);
  601.                            Aip650_DisPlay(1,0);
  602.                            Aip650_DisPlay(2,0);
  603.                          }
  604.                          else
  605.                          {
  606.                           xianshiwendu(minwendu);}
  607.                                 if(keyvalue==0xf2){
  608.                                 Delay1ms(10);
  609.                                  if(keyvalue==0xf2){
  610.                                 minwendu++; //按下K2键则温度下限加零点一度
  611.                                  cou=0;//重新计数
  612.                                  TR0 = 1; //T/C1启动开关
  613.                                    minwenduL=minwendu;
  614.                                 minwenduH=(minwendu>>8);                                 
  615.                         
  616.                                  while(keyvalue!=0xf2);
  617.                                 
  618.                                 }
  619.                         }
  620.                           
  621.                         
  622.                          if(keyvalue==0xe2){
  623.                                 Delay1ms(10);
  624.                                  if(keyvalue==0xe2){
  625.                                 minwendu--; //按下K1键则温度下限减零点一度
  626.                                  cou=0;//重新计数
  627.                                  TR0 = 1; //T/C1启动开关
  628.                            minwenduL=minwendu;
  629.                                 minwenduH=(minwendu>>8);
  630.                                  while(keyvalue!=0xe2);
  631.                                 
  632.                                 }
  633.                           }
  634.                         
  635.                   }
  636.                         /*************************按下K3键进入下限菜单设置界面***************************/
  637.                  
  638.                          if(keyvalue==0xea){
  639.                          cou=0;//重新计数
  640.                          TR0 = 1; //T/C1启动开关
  641.                             menu=2; //按下K3键则菜单加一
  642.                            //if(menu>2){menu=0;}
  643.                         
  644.                                  while(keyvalue!=0xea);
  645.                         }
  646.                                    /*************************按下K4键进入上限菜单设置界面***************************/
  647.                         if(keyvalue==0xfa){
  648.                          cou=0;//重新计数
  649.                          TR0 = 1; //T/C1启动开关
  650.                             menu=1; //按下K3键则菜单加一
  651.                           // if(menu>2){menu=0;}
  652.                         
  653.                                  while(keyvalue!=0xfa);
  654.                         }
  655.                                           
  656.                         
  657.         
  658.                         
  659. }
  660.                 }
复制代码

下载:
Keil代码.zip (65.69 KB, 下载次数: 72)
孵化器温控器PCB文件.7z (2.64 MB, 下载次数: 52)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:45879 发表于 2022-11-24 10:02 | 只看该作者
有没有成品图  欣赏一下
回复

使用道具 举报

板凳
ID:261025 发表于 2022-11-24 14:52 | 只看该作者
用这个单片机太浪费了   换成16脚的也应该够用
我现在不喜欢用数码管了 用液晶屏挺好 走线简单 显示的内容也多   
下面是我做的温控器 准备用来控制电暖风    手里没有合适的实体按键就用了触摸按键  屏在老王家买的

51hei截图20221124144436.jpg (29.97 KB, 下载次数: 64)

51hei截图20221124144436.jpg

51hei截图20221124144451.jpg (44.35 KB, 下载次数: 64)

51hei截图20221124144451.jpg

51hei截图20221124144503.jpg (29.66 KB, 下载次数: 68)

51hei截图20221124144503.jpg

51hei截图20221124144523.jpg (53.47 KB, 下载次数: 61)

51hei截图20221124144523.jpg

51hei截图20221124144534.jpg (27.75 KB, 下载次数: 65)

51hei截图20221124144534.jpg
回复

使用道具 举报

地板
ID:65707 发表于 2022-11-26 18:51 | 只看该作者
能把想法变现实不错哟,像楼主学习.我也想搞个自动喂鱼的,一直都在酝酿中
回复

使用道具 举报

5#
ID:229641 发表于 2023-1-1 16:30 来自手机 | 只看该作者
418854190 发表于 2022-11-24 14:52
用这个单片机太浪费了   换成16脚的也应该够用
我现在不喜欢用数码管了 用液晶屏挺好 走线简单 显示的内容 ...

有代码跟原理图吗?
回复

使用道具 举报

6#
ID:1044744 发表于 2023-3-27 10:50 | 只看该作者
418854190 发表于 2022-11-24 14:52
用这个单片机太浪费了   换成16脚的也应该够用
我现在不喜欢用数码管了 用液晶屏挺好 走线简单 显示的内容 ...

请问这个有仿真源码吗
回复

使用道具 举报

7#
ID:1075398 发表于 2023-5-24 08:22 | 只看该作者
boss654321 发表于 2022-11-26 18:51
能把想法变现实不错哟,像楼主学习.我也想搞个自动喂鱼的,一直都在酝酿中

自动喂鱼的  有人搞好了,你在论坛里翻翻,
回复

使用道具 举报

8#
ID:929517 发表于 2023-6-28 11:40 来自手机 | 只看该作者
418854190 发表于 2022-11-24 14:52
用这个单片机太浪费了   换成16脚的也应该够用
我现在不喜欢用数码管了 用液晶屏挺好 走线简单 显示的内容 ...

老王家是谁家?
回复

使用道具 举报

9#
ID:968288 发表于 2023-7-18 14:14 | 只看该作者
reking8 发表于 2023-6-28 11:40
老王家是谁家?

老王电子数码DIY
回复

使用道具 举报

10#
ID:968288 发表于 2023-7-18 14:18 | 只看该作者
418854190 发表于 2022-11-24 14:52
用这个单片机太浪费了   换成16脚的也应该够用
我现在不喜欢用数码管了 用液晶屏挺好 走线简单 显示的内容 ...

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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