找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC89C52RC借用51黑程序点亮4按键TM1650

[复制链接]
跳转到指定楼层
楼主
借用51黑 单片机论坛
单片机DIY制作  http://www.51hei.com/bbs/dpj-225200-1.html【新提醒】stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB -
的程序进行简单修改而成。
实验板使用普中 HC6800-ES V2.0 单片使用 STC89C52RC
/*******************************************************************
借用51黑 单片机论坛
【新提醒】stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB -
  单片机DIY制作  http://www.51hei.com/bbs/dpj-225200-1.html               
  的程序进行简单修改而成。

  实验板使用普中 HC6800-ES V2.0 单片使用 STC89C52RC

  K1 数值增加;K2 数值减少; K3 数值复位; K4 数值清零;

***********************************************************************/

  1. /******************************************
  2. 名称:aip650的驱动
  3. 时间:2022-11-13
  4. 版本:
  5. 作者:cjz
  6. **************************************************/
  7. //头文件
  8. #include <STC89C5xRC.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 Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位码
  24. uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度调节


  25. uchar keyvalue;
  26. uint wendu;//用于存储温度值
  27. uchar  a,cou;//菜单标志,计数,cou1         menu=0,

  28. /***************************温度小数部分用查表法*****************/
  29. uchar ditab[16]=
  30. {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  31. uchar display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用


  32. //定义IO口
  33. sbit   SDA=P1^0;
  34. sbit   SCL=P1^1;
  35. //sbit    DQ=P3^7;      //ds18b20温度输入口
  36. //sbit    DIN=P1^3;     //LED小数点控制
  37. sbit   out1=P2^0;  //测试TM1650按键用
  38. sbit   out2=P2^1;  //测试TM1650按键用
  39. sbit   out3=P2^2;  //测试TM1650按键用
  40. sbit   out4=P2^3;  //测试TM1650按键用
  41. sbit   out5=P2^4;
  42. sbit   in1=P3^1;  //测试实验板按键用
  43. sbit   in2=P3^2;  //测试实验板按键用
  44. sbit   in3=P3^3;  //测试实验板按键用


  45. /**********************************函数定义区************************************/
  46. //I2C相关
  47. /*******************************************************************************
  48. 功能:I2CWait
  49. 描述:I2C延时
  50. 参数:
  51. 返回:
  52. *******************************************************************************/
  53. void I2CWait(void)
  54. {_nop_();_nop_();_nop_();_nop_();
  55. }

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

  76. }


  77. /*******************************************************************************
  78. 功能:I2CStop(void)
  79. 描述:关闭I2C总线
  80. 参数:
  81. 返回:
  82. *******************************************************************************/
  83. void I2CStop(void)
  84. {
  85.   SDA=0;
  86.         SCL=0;
  87.         I2CWait();
  88.         SCL=1;
  89.         I2CWait();
  90.         SDA=1;
  91. }

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

  107. /*******************************************************************************
  108. 功能:I2CWaitAck
  109. 描述:读取ACK信号
  110. 参数:
  111. 返回:位变量, 1=有ACK,0=无ACK
  112. *******************************************************************************/
  113. bit I2CWaitAck(void)
  114. {
  115.      uchar errtime=255;
  116.         SCL=0;
  117.         SDA=1;
  118.         I2CWait();
  119.         SCL=1;
  120.         I2CWait();
  121.         while(SDA)
  122.         {
  123.                 errtime--;
  124.                 if(!errtime)
  125.                         SCL=0;
  126.                 return false;
  127.         }
  128.         SCL=0;
  129.         return true;
  130.     }

  131. /*******************************************************************************
  132. 功能:I2CSendByte
  133. 描述:向总线发送一个字节
  134. 参数:待发送字节demand,发送顺序指示order
  135.                  order=1,从HI-->LO发送8bit数
  136.                  order=0,从LO-->HI发送8bit数
  137. 返回:
  138. *******************************************************************************/
  139. void I2CSendByte(uchar demand,bit order)
  140.                 {
  141.                         uchar i=8;
  142.                         if(order)
  143.                         {
  144.                                 while(i--)
  145.                                 {
  146.                                         SCL=0;
  147.                                         _nop_();
  148.                                         SDA=(bit)(demand&0x80);
  149.                                         demand<<=1;
  150.                                         I2CWait();
  151.                                         SCL=1;
  152.                                         I2CWait();
  153.                                 }
  154.                                 SCL=0;
  155.                         }
  156.                         else
  157.                         {
  158.                                 while(i--)
  159.                                 {
  160.                                         SCL=0;
  161.                                         _nop_();
  162.                                         SDA=(bit)(demand&0x01);
  163.                                         demand>>=1;
  164.                                         I2CWait();
  165.                                         SCL=1;
  166.                                         I2CWait();
  167.                                 }
  168.                                 SCL=0;
  169.                         }
  170.                 }


  171. /*******************************************************************************
  172. 功能:I2CReceiveByte
  173. 描述:从总线读一个字节
  174. 参数:
  175. 返回:
  176. *******************************************************************************/
  177. uchar I2CReceiveByte(void)
  178. {
  179.         uchar i=8;
  180.         uchar ddata=0;
  181.         SDA=1;
  182.         while(i--)
  183.         {
  184.                 ddata>>=1;//数据从低位开始读取
  185.                 SCL=0;
  186.                 I2CWait();
  187.                 SCL=1;
  188.                 I2CWait();//从低位开始 ddata|=SDA;ddata>>=1
  189.                 if(SDA)
  190.                 {
  191.                                    ddata|=0x80;
  192.                 }
  193.         }
  194.         SCL=0;
  195.              return ddata;
  196. }


  197. /*******************************************************************************
  198. 功能:从650读键值
  199. 描述:
  200. 参数:
  201. 返回:uchar键值
  202. *******************************************************************************/
  203. uchar AipReadKey()
  204. {
  205.                   uchar key;
  206.                      I2CStart();
  207.                      I2CSendByte(0x4f,1);
  208.                  if(I2CWaitAck())
  209.                                          {
  210.                                              key=I2CReceiveByte();

  211.                                            I2CSendAck();
  212.                                          }
  213.              I2CStop();
  214.                                          return key;
  215. }

  216. /*******************************************************************************
  217. 功能:向650发送地址,和数据
  218. 描述:
  219. 参数:
  220. 返回:
  221. *******************************************************************************/
  222. void Aip650_Set(uchar add,uchar dat)
  223. {
  224.   //写显存必须从高地址开始写
  225.         I2CStart();
  226.         I2CSendByte(add,1);
  227.         I2CSendAck();
  228.         I2CSendByte(dat,1);
  229.         I2CSendAck();
  230.         I2CStop();

  231. }


  232. /*******************************************************************************
  233. 功能:驱动数码管显示数字
  234. 描述:位码数组中选择对应的位地址,在段码数组中选择对应数字的段码发送给650
  235. 参数:
  236. 返回:
  237. *******************************************************************************/
  238. void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
  239. {
  240.         Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);


  241.          }

  242. /*******************************************************************************
  243. 功能:650清屏
  244. 描述:
  245. 参数:
  246. 返回:
  247. *******************************************************************************/
  248. void Aip650_CLR()
  249. {
  250.     uchar i;
  251.         for(i=0;i<4;i++)
  252.         {
  253.         Aip650_Set(Dig_Bit_Code[i],0x00);//[/i][i]
  254.         }

  255. }

  256. /*******************************************************************************
  257. 功能:设置显示亮度
  258. 描述:
  259. 参数:
  260. 返回:
  261. *******************************************************************************/
  262. void Light_Level_Set(uchar level)
  263. {
  264.         Aip650_Set(0x48,Light_Level_Code[level-1]);
  265. }


  266. //温度用
  267. /*******************************************************************************
  268. 功能:delay 延时程序 11us
  269. 描述:
  270. 参数:
  271. 返回:
  272. *******************************************************************************/
  273. void delay(uint t)
  274. {
  275. for(;t>0;t--);
  276. }
  277. /*******************************************************************************
  278. 功能:温度处理
  279. 描述:二进制数的高字节的低半字节和低字节的高半字节组成一个字,这个字节转换为十进制后,
  280. 就是温度的百、十、个位值,而剩下的低字节的低半字节转化成十进制后,就是温度值的小数部分。
  281. 参数:
  282. 返回:
  283. *******************************************************************************/
  284. void work_temp(uint tem)
  285. {
  286.         uchar n=0;
  287.                 display[4]=tem&0x0f;
  288.         display[0]=ditab[display[4]];//存入小数部分的显示值
  289.         display[4]=tem>>4;
  290.         display[3]=display[4]/100;//取百位数据暂存
  291.         display[1]=display[4]%100;//取后两位数据暂存
  292.         display[2]=display[1]/10;//取十位数据暂存
  293.         display[1]=display[1]%10;

  294.         /***********符号位显示判断*************************/
  295.         if(!display[3])
  296.         {
  297.         display[3]=0x0c;     //最高位为0时不显示
  298.           if(!display[2])
  299.         {
  300.         display[2]=0x0c;     //次高位为0时不显示
  301.         }
  302.         if(n)
  303.         {display[3]=0x0b;}    //负温度时最高位显示“-”
  304. }
  305. }


  306. /*******************************************************************************
  307. 功能:显示温度
  308. 描述:处理温度数值,发送650
  309. 参数:
  310. 返回:
  311. 显示的位置
  312. *******************************************************************************/
  313. void xianshiwendu(uint tem1)
  314. {
  315. /****************************修改***************************************************/
  316.            work_temp(tem1);
  317.           Aip650_CLR();
  318.          Light_Level_Set(2);
  319. //         Aip650_DisPlay(3,10);//显示小数点
  320.          Aip650_DisPlay(2,display[2]);//十位
  321. //  Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//个位加小数点
  322.         Aip650_DisPlay(3,display[1]);//个位
  323.           Aip650_DisPlay(4,display[0]);//小数

  324. }


  325. /*********************************************************************************************
  326. 函数名:定时/计数器初始化函数
  327. 调  用:T_C_init();
  328. /**********************************************************************************************/
  329. void Timer0_init (void){
  330.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  331.         EA = 1;        //中断总开关
  332.         TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
  333.         TL0 = 0xb0; //16位计数寄存器T0低8位
  334.         ET0 = 1; //T/C1中断开关
  335.         TR0 = 0; //T/C1关闭开关        
  336. }

  337. /*********************************************************************************************
  338. 函数名:定时/计数器1中断处理函数
  339. 调  用:[T/C1溢出后中断处理]
  340. /*****************************/
  341. void Timer0(void) interrupt 1  using 1{ //切换寄存器组到1
  342.     cou++;                      // 软计数器加1   
  343.     if(cou > 99){// 计数值到(5s)
  344.         cou = 0;// 软计数器清零
  345.         TR0 = 0; //T/C1停止计数
  346. //        menu=0;//返回 主菜单的温度显示界面                 
  347.     }               
  348.         TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
  349.         TL0 = 0xb0; //16位计数寄存器T0低8位
  350. }

  351. /*******************************************************************************
  352. 功能:
  353. 描述:
  354. 参数:
  355. 返回:
  356. *******************************************************************************/
  357. void Delay1ms (unsigned int a){ // 1ms延时程序
  358.         unsigned int i;
  359.         while( --a != 0){
  360.                 for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629  
  361.         }                                                      
  362. }

  363. /******************************主函数*****************************************
  364. 功能:
  365. 描述:
  366. 参数:
  367. 返回:
  368. *******************************************************************************/
  369. void main()
  370. {  
  371.          Aip650_CLR();
  372.          Timer0_init();//定时器初始化
  373.                  wendu=532;        //16进制         二进制的333
  374.           while(1)
  375.                 {

  376.                                 if(in1==0){out1=0;out2=1;out3=0;out4=1;}
  377.                                 if(in2==0){out1=1;out2=0;out3=1;out4=0;}
  378.                                 if(in3==0){out1=1;out2=1;out3=1;out4=1;}
  379.                                 if(wendu>532){out5=0;}else out5=1;

  380.                          keyvalue=AipReadKey();

  381.         /**********************显示界面******************************/

  382.                                 xianshiwendu(wendu);

  383.                         /*********************数值调整*******************************/

  384.                          if(keyvalue==0xf2){ out2=0;
  385.                                 Delay1ms(10);
  386.                                  if(keyvalue==0xf2){
  387.                                 wendu++; //按下K2键则温度上限加零点一度
  388.                                  cou=0;//重新计数
  389.                                  TR0 = 1; //T/C1启动开关
  390.                                  while(keyvalue!=0xf2);

  391.                                 }
  392.                           }        else out2=1;

  393.                          if(keyvalue==0xe2){ out1=0;
  394.                                 Delay1ms(10);
  395.                                  if(keyvalue==0xe2){
  396.                                 wendu--; //按下K1键则温度上限减零点一度
  397.                                  cou=0;//重新计数
  398.                                  TR0 = 1; //T/C1启动开关
  399.                                  while(keyvalue!=0xe2);

  400.                                 }
  401.                           }         else out1=1;


  402.                         /*************************按下K3键数值清零***************************/

  403.                          if(keyvalue==0xea){   out3=0;
  404.                          cou=0;//重新计数
  405.                          TR0 = 1; //T/C1启动开关
  406.                              wendu=0; //按下K3键则菜单加一
  407.                                  while(keyvalue!=0xea);
  408.                         } else out3=1;
  409.                                    /*************************按下K4键数值复位***************************/
  410.                         if(keyvalue==0xfa){         out4=0;
  411.                          cou=0;//重新计数
  412.                          TR0 = 1; //T/C1启动开关
  413.                              wendu=532; //按下K4键则菜单加一                        
  414.                                  while(keyvalue!=0xfa);
  415.                         }        else out4=1;


  416. }
  417.                 }

  418. // 【新提醒】stc89c52rc+ds18b20+tm1650孵化器温控器程序终于搞成了 附原理图PCB -
  419. //单片机DIY制作 http://www.51hei.com/bbs/dpj-225200-1.html

  420. /******************************************
  421. 名称:aip650的驱动
  422. 时间:2022-11-13
  423. 版本:
  424. 作者:cjz
  425. **************************************************/
  426. //头文件
  427. #include <STC89C5xRC.H>
  428. #include <absacc.h>
  429. #include  <intrins.h>
  430. //#include <EEPROM.H>
  431. /*************************************************
  432.              常量、变量定义区

  433. ***************************************************/
  434. //常量定义
  435. #define true 1
  436. #define  false 0
  437. #define  uchar unsigned char
  438. #define  uint unsigned int


  439. //数组定义
  440. uchar Display_Code[13]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,0x40,0x00};
  441.          //共阴数码管段码 0,   1,  2,  3,  4 , 5,   6,  7,  8,  9,  .,   -,  不亮
  442. uchar Dig_Bit_Code[4]={0x68,0x6a,0x6c,0x6e};//650位码
  443. uchar Light_Level_Code[8]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x01};//亮度调节


  444. uchar keyvalue;
  445. uint wendu;//用于存储温度值
  446. uint maxwendu;
  447. uint minwendu;
  448. uchar menu=0, cou;//菜单标志,计数,cou1
  449. uint h;//温度计算使用
  450. uint temp;//温度返回值
  451. uchar a,b,c,shuchu;


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


  457. //定义IO口
  458. sbit   SDA=P1^0;
  459. sbit   SCL=P1^1;
  460. sbit    DQ=P3^7;      //ds18b20温度输入口
  461. //sbit    DIN=P1^3;     //LED小数点控制
  462. sbit   out1=P2^0;
  463. sbit   out2=P2^1;
  464. sbit   out3=P2^2;
  465. sbit   out4=P2^3;
  466. sbit   out5=P2^4;
  467. sbit   in1=P3^1;  //测试实验板按键用
  468. sbit   in2=P3^2;  //测试实验板按键用
  469. sbit   in3=P3^3;  //测试实验板按键用


  470. /**********************************函数定义区************************************/
  471. //I2C相关
  472. /*******************************************************************************
  473. 功能:I2CWait
  474. 描述:I2C延时
  475. 参数:
  476. 返回:
  477. *******************************************************************************/
  478. void I2CWait(void)
  479. {_nop_();_nop_();_nop_();_nop_();
  480. }

  481. /*******************************************************************************
  482. 功能:I2CStart
  483. 描述:开启I2C总线
  484. 参数:
  485. 返回:位变量,1=I2C总线可用,0=不可用
  486. *******************************************************************************/
  487. bit I2CStart(void)
  488. {   
  489.         SDA=1;
  490.         SCL=1;
  491.         I2CWait();
  492. if(!SDA)
  493.         return false;//SDA线为低电平则总线忙,退出
  494.                 SDA=0;
  495.         I2CWait();
  496.         while(SDA)
  497.                 return false;//SDA线为高电平则总线出错,退出
  498.         SCL=0;
  499.         I2CWait();
  500.         return true;

  501. }


  502. /*******************************************************************************
  503. 功能:I2CStop(void)
  504. 描述:关闭I2C总线
  505. 参数:
  506. 返回:
  507. *******************************************************************************/
  508. void I2CStop(void)
  509. {
  510.   SDA=0;
  511.         SCL=0;
  512.         I2CWait();
  513.         SCL=1;
  514.         I2CWait();
  515.         SDA=1;
  516. }

  517. /*******************************************************************************
  518. 功能:I2CSendAck
  519. 描述:发送ACK信号
  520. 参数:
  521. 返回:
  522. *******************************************************************************/
  523. void I2CSendAck(void)
  524. {
  525.         SDA=0;
  526.         SCL=0;
  527.         I2CWait();
  528.         SCL=1;
  529.         I2CWait();
  530.         SCL=0;
  531. }

  532. /*******************************************************************************
  533. 功能:I2CWaitAck
  534. 描述:读取ACK信号
  535. 参数:
  536. 返回:位变量, 1=有ACK,0=无ACK
  537. *******************************************************************************/
  538. bit I2CWaitAck(void)
  539. {
  540.      uchar errtime=255;
  541.         SCL=0;
  542.         SDA=1;
  543.         I2CWait();
  544.         SCL=1;
  545.         I2CWait();
  546.         while(SDA)
  547.         {
  548.                 errtime--;
  549.                 if(!errtime)
  550.                         SCL=0;
  551.                 return false;
  552.         }
  553.         SCL=0;
  554.         return true;
  555.     }

  556. /*******************************************************************************
  557. 功能:I2CSendByte
  558. 描述:向总线发送一个字节
  559. 参数:待发送字节demand,发送顺序指示order
  560.                  order=1,从HI-->LO发送8bit数
  561.                  order=0,从LO-->HI发送8bit数
  562. 返回:
  563. *******************************************************************************/
  564. void I2CSendByte(uchar demand,bit order)
  565.                 {
  566.                         uchar i=8;
  567.                         if(order)
  568.                         {
  569.                                 while(i--)
  570.                                 {
  571.                                         SCL=0;
  572.                                         _nop_();
  573.                                         SDA=(bit)(demand&0x80);
  574.                                         demand<<=1;
  575.                                         I2CWait();
  576.                                         SCL=1;
  577.                                         I2CWait();
  578.                                 }
  579.                                 SCL=0;
  580.                         }
  581.                         else
  582.                         {
  583.                                 while(i--)
  584.                                 {
  585.                                         SCL=0;
  586.                                         _nop_();
  587.                                         SDA=(bit)(demand&0x01);
  588.                                         demand>>=1;
  589.                                         I2CWait();
  590.                                         SCL=1;
  591.                                         I2CWait();
  592.                                 }
  593.                                 SCL=0;
  594.                         }
  595.                 }


  596. /*******************************************************************************
  597. 功能:I2CReceiveByte
  598. 描述:从总线读一个字节
  599. 参数:
  600. 返回:
  601. *******************************************************************************/
  602. uchar I2CReceiveByte(void)
  603. {
  604.         uchar i=8;
  605.         uchar ddata=0;
  606.         SDA=1;
  607.         while(i--)
  608.         {
  609.                 ddata>>=1;//数据从低位开始读取
  610.                 SCL=0;
  611.                 I2CWait();
  612.                 SCL=1;
  613.                 I2CWait();//从低位开始 ddata|=SDA;ddata>>=1
  614.                 if(SDA)
  615.                 {
  616.                                    ddata|=0x80;
  617.                 }
  618.         }
  619.         SCL=0;
  620.              return ddata;
  621. }


  622. /*******************************************************************************
  623. 功能:从650读键值
  624. 描述:
  625. 参数:
  626. 返回:uchar键值
  627. *******************************************************************************/
  628. uchar AipReadKey()
  629. {
  630.                   uchar key;
  631.                      I2CStart();
  632.                      I2CSendByte(0x4f,1);
  633.                  if(I2CWaitAck())
  634.                                          {
  635.                                              key=I2CReceiveByte();

  636.                                            I2CSendAck();
  637.                                          }
  638.              I2CStop();
  639.                                          return key;
  640. }

  641. /*******************************************************************************
  642. 功能:向650发送地址,和数据
  643. 描述:
  644. 参数:
  645. 返回:
  646. *******************************************************************************/
  647. void Aip650_Set(uchar add,uchar dat)
  648. {
  649.   //写显存必须从高地址开始写
  650.         I2CStart();
  651.         I2CSendByte(add,1);
  652.         I2CSendAck();
  653.         I2CSendByte(dat,1);
  654.         I2CSendAck();
  655.         I2CStop();

  656. }


  657. /*******************************************************************************
  658. 功能:驱动数码管显示数字
  659. 描述:位码数组中选择对应的位地址,在段码数组中选择对应数字的段码发送给650
  660. 参数:
  661. 返回:
  662. *******************************************************************************/
  663. void Aip650_DisPlay(uchar Dig_Bit,uchar Display_num)
  664. {
  665.         Aip650_Set(Dig_Bit_Code[Dig_Bit-1],Display_Code[Display_num]);


  666.          }

  667. /*******************************************************************************
  668. 功能:650清屏
  669. 描述:
  670. 参数:
  671. 返回:
  672. *******************************************************************************/
  673. void Aip650_CLR()
  674. {
  675.     uchar i;
  676.         for(i=0;i<4;i++)
  677.         {
  678.         Aip650_Set(Dig_Bit_Code[i],0x00);//[/i][i]
  679.         }

  680. }

  681. /*******************************************************************************
  682. 功能:设置显示亮度
  683. 描述:
  684. 参数:
  685. 返回:
  686. *******************************************************************************/
  687. void Light_Level_Set(uchar level)
  688. {
  689.         Aip650_Set(0x48,Light_Level_Code[level-1]);
  690. }


  691. //温度用
  692. /*******************************************************************************
  693. 功能:delay 延时程序 11us
  694. 描述:
  695. 参数:
  696. 返回:
  697. *******************************************************************************/
  698. void delay(uint t)
  699. {
  700. for(;t>0;t--);
  701. }

  702. /*******************************************************************************
  703. 功能:Ds18b20 复位函数
  704. 描述:
  705. 参数:
  706. 返回:
  707. *******************************************************************************/
  708. void ow_reset(void)
  709. {
  710. uchar presence=1;
  711.         while(presence)
  712.         {while(presence)
  713.                 {
  714.                         DQ=1;
  715.                         _nop_();_nop_();//从高拉到低
  716.                         DQ=0;
  717.                         delay(50);//550us
  718.                         DQ=1;
  719.                         delay(6);//66us
  720.                         presence=DQ;//presence=0复位成功,继续下一步
  721.                 }
  722.                 delay(45);//延时500us
  723.                 presence=~DQ;
  724.         }
  725.         DQ=1;  //拉高电平
  726. }

  727. /*******************************************************************************
  728. 功能:Ds18b20写命令函数
  729. 描述:向总线上写1个字节
  730. 参数:
  731. 返回:
  732. *******************************************************************************/
  733. void write_byte(uchar val)
  734. {
  735. uchar i;
  736.         for(i=8;i>0;i--)
  737.         {DQ=1;_nop_();_nop_();//从高拉低
  738.         DQ=0; _nop_();_nop_();_nop_();_nop_();//5us
  739.                 DQ=val&0x01;// 最低位移出
  740.         delay(6);//66us
  741.         val=val/2;//右移一位}
  742. }
  743. DQ=1;
  744. delay(1);
  745. }

  746. /*******************************************************************************
  747. 功能:从18b20总线上读1字节
  748. 描述:
  749. 参数:
  750. 返回:value
  751. *******************************************************************************/
  752. uchar read_byte(void)
  753. {
  754. uchar i;
  755.         uchar value=0;
  756.         for(i=8;i>0;i--)
  757.         {
  758.                 DQ=1;_nop_();_nop_();
  759.                 value>>=1;
  760.                 DQ=0;_nop_();_nop_();_nop_();_nop_();//4us
  761.                 DQ=1;_nop_();_nop_();_nop_();_nop_();//4us
  762.                 if(DQ)value|=0x80;
  763.                 delay(6);
  764.         }

  765.         DQ=1;
  766.         return(value);
  767. }


  768. /*******************************************************************************
  769. 功能:读出温度
  770. 描述:
  771. 参数:
  772. 返回:
  773. *******************************************************************************/
  774. read_temp()
  775. {
  776. ow_reset();
  777.         delay(200);//总线复位
  778.         write_byte(0xcc);//发命令
  779.         write_byte(0x44);//发转换命令
  780.         ow_reset();
  781.         delay(1);
  782.         write_byte(0xcc);//发命令
  783.         write_byte(0xbe);
  784.         temp_data[0]=read_byte();//读温度的低字节
  785.         temp_data[1]=read_byte();//读温度的高字节
  786.         temp=temp_data[1];
  787.         temp<<=8;
  788.         temp=temp|temp_data[0];// 两字节合成一个整型变量
  789.         return temp;
  790. }


  791. /*******************************************************************************
  792. 功能:温度处理
  793. 描述:二进制数的高字节的低半字节和低字节的高半字节组成一个字,这个字节转换为十进制后,
  794. 就是温度的百、十、个位值,而剩下的低字节的低半字节转化成十进制后,就是温度值的小数部分。
  795. 参数:
  796. 返回:
  797. *******************************************************************************/
  798. void work_temp(uint tem)
  799. {
  800.         uchar n=0;
  801.         if(tem>6348)          //温度正负判断
  802.         {tem=65536-tem;n=1;}   //负温度求补码,标志位置1
  803.                 display[4]=tem&0x0f;
  804.         display[0]=ditab[display[4]];//存入小数部分的显示值
  805.         display[4]=tem>>4;
  806.         display[3]=display[4]/100;//取百位数据暂存
  807.         display[1]=display[4]%100;//取后两位数据暂存
  808.         display[2]=display[1]/10;//取十位数据暂存
  809.         display[1]=display[1]%10;

  810.         /***********符号位显示判断*************************/
  811.         if(!display[3])
  812.         {
  813.         display[3]=0x0c;     //最高位为0时不显示
  814.           if(!display[2])
  815.         {
  816.         display[2]=0x0c;     //次高位为0时不显示
  817.         }
  818.         if(n)
  819.         {display[3]=0x0b;}    //负温度时最高位显示“-”
  820. }
  821. }


  822. /*******************************************************************************
  823. 功能:显示温度
  824. 描述:处理温度数值,发送650
  825. 参数:
  826. 返回:
  827. 显示的位置
  828. *******************************************************************************/
  829. void xianshiwendu(uint tem1)
  830. {
  831. /****************************修改***************************************************/
  832.            work_temp(tem1);
  833.           Aip650_CLR();
  834.          Light_Level_Set(2);
  835.          Aip650_DisPlay(3,10);//显示小数点
  836.          Aip650_DisPlay(2,display[2]);//十位
  837. //  Aip650_Set(Dig_Bit_Code[1],Display_Code[display[1]]|0x80);//个位加小数点
  838.         Aip650_DisPlay(3,display[1]);//个位
  839.           Aip650_DisPlay(4,display[0]);//小数

  840. }


  841. /*********************************************************************************************
  842. 函数名:定时/计数器初始化函数
  843. 调  用:T_C_init();
  844. /**********************************************************************************************/
  845. void Timer0_init (void){
  846.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  847.         EA = 1;        //中断总开关
  848.         TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
  849.         TL0 = 0xb0; //16位计数寄存器T0低8位
  850.         ET0 = 1; //T/C1中断开关
  851.         TR0 = 0; //T/C1关闭开关        
  852. }

  853. /*********************************************************************************************
  854. 函数名:定时/计数器1中断处理函数
  855. 调  用:[T/C1溢出后中断处理]
  856. /*****************************/
  857. void Timer0(void) interrupt 1  using 1{ //切换寄存器组到1
  858.     cou++;                      // 软计数器加1   
  859.     if(cou > 99){// 计数值到(5s)
  860.         cou = 0;// 软计数器清零
  861.         TR0 = 0; //T/C1停止计数
  862.         menu=0;//返回 主菜单的温度显示界面                 
  863.     }               
  864.         TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
  865.         TL0 = 0xb0; //16位计数寄存器T0低8位
  866. }

  867. /*******************************************************************************
  868. 功能:
  869. 描述:
  870. 参数:
  871. 返回:
  872. *******************************************************************************/
  873. void Delay1ms (unsigned int a){ // 1ms延时程序
  874.         unsigned int i;
  875.         while( --a != 0){
  876.                 for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629  
  877.         }                                                      
  878. }

  879. /******************************主函数*****************************************
  880. 功能:
  881. 描述:
  882. 参数:
  883. 返回:
  884. *******************************************************************************/
  885. void main()
  886. {  
  887.          Aip650_CLR();
  888.          Timer0_init();//定时器初始化

  889.                         maxwendu=512; //      
  890.                         minwendu=432;         
  891.           while(1)
  892.                 {

  893.                                 if(in1==0){out1=0;out2=1;out3=0;out4=1;}
  894.                                 if(in2==0){out1=1;out2=0;out3=1;out4=0;}
  895.                                 if(in3==0){out1=1;out2=1;out3=1;out4=1;}
  896.                                 if(a==1){out5=0;}else out5=1;

  897.                          keyvalue=AipReadKey();

  898.         /**********************显示温度界面******************************/
  899.                   if(menu==0){
  900.                           // for(k=15;k>0;k--){
  901.                            wendu=read_temp();

  902.                                 xianshiwendu(wendu);

  903.                    }        
  904.                         /*********************进入调温度上限界面*******************************/
  905.                   if(menu==1){
  906.                          if(minwendu>maxwendu) //如果下限温度高于上限温度,显示00
  907.                          { Aip650_CLR();
  908.                            Light_Level_Set(2);
  909.                            Aip650_DisPlay(1,0);
  910.                            Aip650_DisPlay(2,0);
  911.                          }
  912.                          else
  913.                          {
  914.                                 xianshiwendu(maxwendu);}

  915.                          if(keyvalue==0xf2){ out2=0;
  916.                                 Delay1ms(10);
  917.                                  if(keyvalue==0xf2){
  918.                                 maxwendu++; //按下K2键则温度上限加零点一度
  919.                                  cou=0;//重新计数
  920.                                  TR0 = 1; //T/C1启动开关
  921.                                  while(keyvalue!=0xf2);

  922.                                 }
  923.                           }        else out2=1;

  924.                          if(keyvalue==0xe2){ out1=0;
  925.                                 Delay1ms(10);
  926.                                  if(keyvalue==0xe2){
  927.                                 maxwendu--; //按下K1键则温度上限减零点一度
  928.                                  cou=0;//重新计数
  929.                                  TR0 = 1; //T/C1启动开关
  930.                                  while(keyvalue!=0xe2);

  931.                                 }
  932.                           }         else out1=1;

  933.                    }
  934.         /*********************进入调温度下限界面*******************************/
  935.           if(menu==2){
  936.                          if(minwendu>maxwendu) //如果下限温度高于上限温度,显示00
  937.                          { Aip650_CLR();
  938.                            Light_Level_Set(2);
  939.                            Aip650_DisPlay(1,0);
  940.                            Aip650_DisPlay(2,0);
  941.                          }
  942.                          else
  943.                          {
  944.                           xianshiwendu(minwendu);}
  945.                                 if(keyvalue==0xf2){ out1=0;
  946.                                 Delay1ms(10);
  947.                                  if(keyvalue==0xf2){
  948.                                 minwendu++; //按下K2键则温度下限加零点一度
  949.                                  cou=0;//重新计数
  950.                                  TR0 = 1; //T/C1启动开关
  951.                                  while(keyvalue!=0xf2);

  952.                                 }
  953.                         } else out1=1;


  954.                          if(keyvalue==0xe2){
  955.                                 Delay1ms(10);
  956.                                  if(keyvalue==0xe2){  out2=0;
  957.                                 minwendu--; //按下K1键则温度下限减零点一度
  958.                                  cou=0;//重新计数
  959.                                  TR0 = 1; //T/C1启动开关
  960.                                  while(keyvalue!=0xe2);

  961.                                 }
  962.                           }        else out2=1;

  963.                   }
  964.                         /*************************按下K3键进入下限菜单设置界面***************************/

  965.                          if(keyvalue==0xea){   out3=0;
  966.                          cou=0;//重新计数
  967.                          TR0 = 1; //T/C1启动开关
  968.                             menu=2; //按下K3键则菜单加一
  969.                                  while(keyvalue!=0xea);
  970.                         } else out3=1;
  971.                                    /*************************按下K4键进入上限菜单设置界面***************************/
  972.                         if(keyvalue==0xfa){         out4=0;
  973.                          cou=0;//重新计数
  974.                          TR0 = 1; //T/C1启动开关
  975.                             menu=1; //按下K4键则菜单加一                        
  976.                                  while(keyvalue!=0xfa);
  977.                         }        else out4=1;

  978.         /*********************控制温度界面*******************************/
  979.                   if(wendu<minwendu)           {a=1;}
  980.            //检测温度低于下限温度  P2.4点亮  
  981.                                                
  982.                      if(wendu>maxwendu)        {a=0;}  
  983.            //检测温度高于上限温度  P2.4熄灭         

  984. }
  985.                 }

复制代码

51hei图片_20260418215354_35_1.jpg (124.2 KB, 下载次数: 0)

51hei图片_20260418215354_35_1.jpg

51hei图片_20260418215355_36_1.jpg (198.45 KB, 下载次数: 0)

51hei图片_20260418215355_36_1.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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