找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2534|回复: 7
收起左侧

单片机智能水杯源程序与Proteus仿真

[复制链接]
ID:386857 发表于 2021-1-31 17:52 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

主函数代码.jpg
单片机源程序如下:
  1. /**
  2.   ************************************* Copyright ******************************
  3.   * FileName   : Main1.c
  4.   * Version    : v1.0
  5.   * Author     : superman
  6.   * Date       : 2021-01-22
  7.   * Description:
  8.   电阻温度换算公式:R2=R1*(T+t2)/(T+t1).
  9.    t1-----绕组温度常温20°C
  10.    T------电阻温度常数(铜线取235,铝线取225)
  11.    t2-----换算温度(75°C或15°C)
  12.    R1----测量电阻值
  13.    R2----换算电阻值
  14.   ******************************************************************************
  15. */
  16. #include <reg51.h>
  17. #include <LCD1602.h>
  18. #include <stdio.h>
  19. #include <ADC.h>
  20. #include <DS1302.h>
  21. #include <DS18B20.h>
  22. #define T_constant 235
  23. /**
  24.   ************************************* Copyright ******************************
  25. 引脚定义
  26.   ******************************************************************************
  27. */
  28. sbit top_pin=P1^2;
  29. sbit buzzer_pin=P2^6;
  30. sbit hour_pin=P3^0;
  31. sbit minute_pin=P3^1;

  32. char strTemp[10]= {'0','1','2','3','4','5','6','7','8','9'};//lcd显示数组
  33. /**
  34.   ************************************* Copyright ******************************
  35. 变量初始化
  36.   ******************************************************************************
  37. */
  38. unsigned int  myData[4];
  39. int drink_compensate[2],my_compensate_last,my_compensate;
  40. unsigned char AD_CHANNEL;
  41. unsigned int  myTime[3];
  42. unsigned int volume_now,volume_last;
  43. unsigned int  show_flag=0,time_flag=0,buzzer_flag=0;

  44. /* -------------------------------- begin  -------------------------------- */
  45. /**
  46.   * @Name    display
  47.   * @brief
  48.   * @param   : [输入/出]
  49.   * @retval
  50.   * @author
  51.   * @Data    2021-01-22
  52. ①LCD1602A 可以显示两行字符,一行显示16个;
  53. ②只能显示数字和字母(5X7的点阵)不能显示汉字;
  54. ③每个字符之间有间隔;
  55. ④引脚图
  56. **/
  57. /* -------------------------------- end -------------------------------- */
  58. void display()//显示程序
  59. {
  60.     int T_ge,T_shi,T_bai;

  61.     LCD_set_position(0);//定位到第一行

  62.     LCD_prints("T:");
  63.     LCD_printc(strTemp[DateTime[2]/10]);
  64.     LCD_printc(strTemp[DateTime[2]%10]);
  65.     LCD_printc(':');
  66.     LCD_printc(strTemp[DateTime[1]/10]);
  67.     LCD_printc(strTemp[DateTime[1]%10]);
  68.     LCD_printc(':');
  69.     LCD_printc(strTemp[DateTime[0]/10]);
  70.     LCD_printc(strTemp[DateTime[0]%10]);
  71.     LCD_printc(' ');
  72.     T_bai=tvalue/100;
  73.     T_bai=T_bai%10;
  74.     LCD_printc(strTemp[T_bai]);
  75.     T_shi=tvalue/10;
  76.     T_shi=T_shi%10;
  77.     LCD_printc(strTemp[T_shi]);
  78.     LCD_printc('.');
  79.     T_ge=tvalue%10;
  80.     LCD_printc(strTemp[T_ge]);
  81.     LCD_printc('C');

  82.     LCD_set_position(0x40);//第二行显示AD采样值
  83.     LCD_prints("A:");
  84.     LCD_printc(strTemp[myTime[2]/10]);
  85.     LCD_printc(strTemp[myTime[2]%10]);
  86.     LCD_printc(':');
  87.     LCD_printc(strTemp[myTime[1]/10]);
  88.     LCD_printc(strTemp[myTime[1]%10]);
  89.     LCD_printc(' ');
  90.     LCD_printc(' ');
  91.     if(show_flag==0)
  92.     {
  93.         LCD_prints("N:");
  94.         LCD_printc(strTemp[my_compensate/100]);
  95.         LCD_printc(strTemp[my_compensate/10%10]);
  96.         LCD_printc(strTemp[my_compensate%10]);
  97.     }
  98.     else
  99.     {
  100.         LCD_prints("D:");
  101.         LCD_printc(strTemp[drink_compensate[1]/100]);
  102.         LCD_printc(strTemp[drink_compensate[1]/10%10]);
  103.         LCD_printc(strTemp[drink_compensate[1]%10]);
  104.     }
  105.     LCD_printc('m');
  106.     LCD_printc('l');
  107. }
  108. /**
  109.   ************************************* Copyright ******************************
  110. 延时函数
  111.   ******************************************************************************
  112. */
  113. void delay1ms(void)   //误差 0.000000000000us
  114. {
  115.     unsigned char a,b;
  116.     for(b=25; b>0; b--)
  117.         for(a=57; a>0; a--);
  118. }
  119. int now_time=0,last_time=0;//定义两个标志位
  120. /* -------------------------------- begin  -------------------------------- */
  121. /**
  122.   * @Name    time_10s
  123.   * @brief
  124.   * @param   : [输入/出]
  125.   * @retval
  126.   * @author
  127.   * @Data    2021-01-22

  128.   10秒计时函数,用于lcd显示切换
  129. **/
  130. /* -------------------------------- end -------------------------------- */
  131. int time_10s()
  132. {
  133.     static int time_count=0;
  134.     if(last_time!=now_time)
  135.     {
  136.         time_count++;
  137.         last_time=now_time;
  138.     }
  139.     if(time_count>=10)
  140.     {
  141.         time_count=0;
  142.         return 1;
  143.     }
  144.     return 0;
  145. }
  146. /* -------------------------------- begin  -------------------------------- */
  147. /**
  148.   * @Name    change_alarm_Time
  149.   * @brief
  150.   * @param   : [输入/出]
  151.   * @retval
  152.   * @author
  153.   * @Data    2021-01-22
  154.     修改定时时间
  155. **/
  156. /* -------------------------------- end -------------------------------- */
  157. void change_alarm_Time()
  158. {
  159.     if(hour_pin==0)//小时按键按下
  160.     {   delay1ms();
  161.         if(hour_pin==0)
  162.             myTime[2]++;
  163.         if(myTime[2]>=24)
  164.             myTime[2]=0;
  165.     }
  166.     if(minute_pin==0)//分钟按键按下
  167.     {   delay1ms();
  168.         if(minute_pin==0)
  169.             myTime[1]++;
  170.         if(myTime[1]>=60)
  171.             myTime[1]=0;
  172.     }

  173. }
  174. /* -------------------------------- begin  -------------------------------- */
  175. /**
  176.   * @Name    measure_water
  177.   * @brief
  178.   * @param   : [输入/出]
  179.   * @retval
  180.   * @author
  181.   * @Data    2021-01-22
  182.     水位测量函数
  183. **/
  184. /* -------------------------------- end -------------------------------- */

  185. void measure_water()
  186. {
  187.     if(top_pin==0)//水杯盖子没打开
  188.     {
  189.         drink_compensate[0]=my_compensate_last-my_compensate;
  190.         my_compensate_last=my_compensate;
  191.     }
  192.     else
  193.     {

  194.     }
  195.     if(drink_compensate[0]>30)
  196.     {
  197.         show_flag=1;
  198.         drink_compensate[1]=drink_compensate[0];
  199.     }
  200.     if(show_flag==1)
  201.     {
  202.         if(time_10s()==1)
  203.             show_flag=0;
  204.     }
  205. }

  206. /* -------------------------------- begin  -------------------------------- */
  207. /**
  208.   * @Name    alarm_buzzer
  209.   * @brief
  210.   * @param   : [输入/出]
  211.   * @retval
  212.   * @author
  213.   * @Data    2021-01-22
  214.   定时蜂鸣器报警
  215. **/
  216. /* -------------------------------- end -------------------------------- */

  217. void alarm_buzzer()
  218. {
  219.     static alarm_count=0;
  220.     if(myTime[2]==DateTime[2]&&myTime[1]==DateTime[1]&&myTime[0]==DateTime[0]&&buzzer_flag==0)
  221.     {
  222.         buzzer_flag=1;
  223.     }
  224.     if(buzzer_flag==1)
  225.     {
  226.         if(last_time!=now_time)
  227.         {
  228.             if(now_time%2==0)
  229.             {
  230.                 alarm_count++;
  231.                 buzzer_pin=0;
  232.             }
  233.             else
  234.                 buzzer_pin=1;
  235.             if(alarm_count>=10)
  236.             {
  237.                 alarm_count=0;
  238.                 buzzer_flag=0;
  239.                 buzzer_pin=1;
  240.             }
  241.             last_time=now_time;
  242.         }

  243.     }

  244. }

  245. /* -------------------------------- begin  -------------------------------- */
  246. /**
  247.   * @Name    change_my_temperature
  248.   * @brief
  249.   * @param   in_Resistance: [输入/出]
  250. **                         in_Temperature: [输入/出]
  251.   * @retval
  252.   * @author
  253.   * @Data    2021-01-22
  254.    温度补偿函数
  255. **/
  256. /* -------------------------------- end -------------------------------- */

  257. int change_my_temperature(int in_Resistance,int in_Temperature)//电阻温度补偿换算公式:R2=R1*(T+t2)/(T+t1)
  258. {
  259.     int out_temperature=0;
  260.     float middle1=0,middle2=0,middle3=0;
  261.     middle1=T_constant+in_Temperature;
  262.     middle2=T_constant+20;
  263.     middle3=middle1/middle2;
  264.     out_temperature= in_Resistance*middle3;
  265.     return out_temperature;
  266. }

  267. /* -------------------------------- begin  -------------------------------- */
  268. /**
  269.   * @Name    control
  270.   * @brief
  271.   * @param   : [输入/出]
  272.   * @retval
  273.   * @author
  274.   * @Data    2021-01-22
  275. 控制函数
  276. **/
  277. /* -------------------------------- end -------------------------------- */

  278. void control()//控制函数
  279. {
  280.     measure_water();
  281.     change_alarm_Time();
  282.     alarm_buzzer();
  283. }

  284. /* -------------------------------- begin  -------------------------------- */
  285. /**
  286.   * @Name    Ad_receive
  287.   * @brief
  288.   * @param   None
  289.   * @retval
  290.   * @author
  291.   * @Data    2021-01-22
  292. AD读取函数
  293. **/
  294. /* -------------------------------- end -------------------------------- */

  295. void Ad_receive(void)//ad读取函数
  296. {
  297.     switch(AD_CHANNEL)
  298.     {
  299.     case 0:
  300.         ISendByte(PCF8591,0x41);
  301.         myData[0]=IRcvByte(PCF8591);  //ADC0 模数转换1
  302.         break;

  303.     case 1:
  304.         ISendByte(PCF8591,0x42);
  305.         myData[1]=IRcvByte(PCF8591);  //ADC1  模数转换2
  306.         break;
  307.     case 2:
  308.         ISendByte(PCF8591,0x43);
  309.         myData[2]=IRcvByte(PCF8591);  //ADC2        模数转换3
  310.         break;
  311.     case 3:
  312.         ISendByte(PCF8591,0x40);
  313.         myData[3]=IRcvByte(PCF8591);  //ADC3   模数转换4
  314.         break;
  315.     }
  316.     if(++AD_CHANNEL>4) AD_CHANNEL=0;
  317. }

  318. /* -------------------------------- begin  -------------------------------- */
  319. /**
  320.   * @Name    init_Time
  321.   * @brief
  322.   * @param   : [输入/出]
  323.   * @retval
  324.   * @author
  325.   * @Data    2021-01-22
  326. 时间初始化函数
  327. **/
  328. /* -------------------------------- end -------------------------------- */

  329. void init_Time()
  330. {
  331.     GetTime();
  332.     now_time=DateTime[0];
  333.     last_time=now_time;
  334.     myTime[2]=DateTime[2];
  335.     myTime[1]=DateTime[1];
  336.     myTime[0]=0;
  337. }

  338. /* -------------------------------- begin  -------------------------------- */
  339. /**
  340.   * @Name    InitTimer0
  341.   * @brief
  342.   * @param   None
  343.   * @retval
  344.   * @author
  345.   * @Data    2021-01-22
  346. 定时器0初始化函数
  347. **/
  348. /* -------------------------------- end -------------------------------- */

  349. void InitTimer0(void)
  350. {
  351.     TMOD = 0x01;
  352.     TH0 = 0x0D8;
  353.     TL0 = 0x0F0;
  354.     EA = 1;
  355.     ET0 = 1;
  356.     TR0 = 1;
  357. }

  358. /* -------------------------------- begin  -------------------------------- */
  359. /**
  360.   * @Name    init_all
  361.   * @brief
  362.   * @param   : [输入/出]
  363.   * @retval
  364.   * @author
  365.   * @Data    2021-01-22
  366. 初始化全部
  367. **/
  368. /* -------------------------------- end -------------------------------- */

  369. void init_all()
  370. {
  371.     LCD_initial();//lcd1602初始化
  372.     Ad_receive();//水量采集
  373.     my_compensate_last=my_compensate;
  374.     drink_compensate[0]=0;
  375.     init_Time();
  376.     InitTimer0();
  377. }

  378. /* -------------------------------- begin  -------------------------------- */
  379. /**
  380.   * @Name    main
  381.   * @brief
  382.   * @param   None
  383.   * @retval
  384.   * @author  帅气鹏
  385.   * @Data    2021-01-22
  386.    主函数
  387. **/
  388. /* -------------------------------- end -------------------------------- */

  389. void main(void)//主函数
  390. {
  391.     init_all();
  392.     while(1)
  393.     {
  394.         GetTime();
  395.         now_time=DateTime[0];
  396.         Ad_receive();//ad采集
  397.         my_compensate=change_my_temperature(myData[0],tvalue/10);
  398.         display();//显示
  399.         control();
  400.     }
  401. }

  402. /* -------------------------------- begin  -------------------------------- */
  403. /**
  404.   * @Name    Timer0Interrupt
  405.   * @brief
  406.   * @param   None
  407.   * @retval
  408.   * @author  帅气鹏
  409.   * @Data    2021-01-22
  410. 定时器中断处理函数
  411. **/
  412. /* -------------------------------- end -------------------------------- */

  413. void Timer0Interrupt(void) interrupt 1
  414. {
  415.     TH0 = 0x0D8;
  416.     TL0 = 0x0F0;
  417.     read_temp();
  418. }
复制代码
AD读取代码.jpg
报警代码.jpg
闹钟修改代码.jpg
时间初始化代码.jpg
水位测量代码.jpg
温度补偿代码.jpg
显示代码.jpg

智能水杯.zip

4.04 MB, 下载次数: 77, 下载积分: 黑币 -5

动态图演示.7z

6.26 MB, 下载次数: 42, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

ID:582255 发表于 2021-2-1 22:29 | 显示全部楼层
兄弟当年是几等奖哦
回复

使用道具 举报

ID:1049725 发表于 2022-11-7 12:57 来自手机 | 显示全部楼层
有语音提醒吗
回复

使用道具 举报

ID:1049725 发表于 2022-11-7 12:58 来自手机 | 显示全部楼层
可以实现实时显示水位吗
回复

使用道具 举报

ID:1055161 发表于 2022-12-2 10:07 | 显示全部楼层
做实物难吗大佬
回复

使用道具 举报

ID:386857 发表于 2023-1-16 16:42 | 显示全部楼层

我这里采用的是蜂鸣器哦,亲
回复

使用道具 举报

ID:386857 发表于 2023-1-16 16:42 | 显示全部楼层
莫攸 发表于 2022-11-7 12:58
可以实现实时显示水位吗

可以的哦,亲
回复

使用道具 举报

ID:386857 发表于 2023-1-16 16:43 | 显示全部楼层
joyv 发表于 2022-12-2 10:07
做实物难吗大佬

不难的哦,亲,将您需要的功能集成一下就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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