|
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /**
- ************************************* Copyright ******************************
- * FileName : Main1.c
- * Version : v1.0
- * Author : superman
- * Date : 2021-01-22
- * Description:
- 电阻温度换算公式:R2=R1*(T+t2)/(T+t1).
- t1-----绕组温度常温20°C
- T------电阻温度常数(铜线取235,铝线取225)
- t2-----换算温度(75°C或15°C)
- R1----测量电阻值
- R2----换算电阻值
- ******************************************************************************
- */
- #include <reg51.h>
- #include <LCD1602.h>
- #include <stdio.h>
- #include <ADC.h>
- #include <DS1302.h>
- #include <DS18B20.h>
- #define T_constant 235
- /**
- ************************************* Copyright ******************************
- 引脚定义
- ******************************************************************************
- */
- sbit top_pin=P1^2;
- sbit buzzer_pin=P2^6;
- sbit hour_pin=P3^0;
- sbit minute_pin=P3^1;
- char strTemp[10]= {'0','1','2','3','4','5','6','7','8','9'};//lcd显示数组
- /**
- ************************************* Copyright ******************************
- 变量初始化
- ******************************************************************************
- */
- unsigned int myData[4];
- int drink_compensate[2],my_compensate_last,my_compensate;
- unsigned char AD_CHANNEL;
- unsigned int myTime[3];
- unsigned int volume_now,volume_last;
- unsigned int show_flag=0,time_flag=0,buzzer_flag=0;
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name display
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- ①LCD1602A 可以显示两行字符,一行显示16个;
- ②只能显示数字和字母(5X7的点阵)不能显示汉字;
- ③每个字符之间有间隔;
- ④引脚图
- **/
- /* -------------------------------- end -------------------------------- */
- void display()//显示程序
- {
- int T_ge,T_shi,T_bai;
- LCD_set_position(0);//定位到第一行
- LCD_prints("T:");
- LCD_printc(strTemp[DateTime[2]/10]);
- LCD_printc(strTemp[DateTime[2]%10]);
- LCD_printc(':');
- LCD_printc(strTemp[DateTime[1]/10]);
- LCD_printc(strTemp[DateTime[1]%10]);
- LCD_printc(':');
- LCD_printc(strTemp[DateTime[0]/10]);
- LCD_printc(strTemp[DateTime[0]%10]);
- LCD_printc(' ');
- T_bai=tvalue/100;
- T_bai=T_bai%10;
- LCD_printc(strTemp[T_bai]);
- T_shi=tvalue/10;
- T_shi=T_shi%10;
- LCD_printc(strTemp[T_shi]);
- LCD_printc('.');
- T_ge=tvalue%10;
- LCD_printc(strTemp[T_ge]);
- LCD_printc('C');
- LCD_set_position(0x40);//第二行显示AD采样值
- LCD_prints("A:");
- LCD_printc(strTemp[myTime[2]/10]);
- LCD_printc(strTemp[myTime[2]%10]);
- LCD_printc(':');
- LCD_printc(strTemp[myTime[1]/10]);
- LCD_printc(strTemp[myTime[1]%10]);
- LCD_printc(' ');
- LCD_printc(' ');
- if(show_flag==0)
- {
- LCD_prints("N:");
- LCD_printc(strTemp[my_compensate/100]);
- LCD_printc(strTemp[my_compensate/10%10]);
- LCD_printc(strTemp[my_compensate%10]);
- }
- else
- {
- LCD_prints("D:");
- LCD_printc(strTemp[drink_compensate[1]/100]);
- LCD_printc(strTemp[drink_compensate[1]/10%10]);
- LCD_printc(strTemp[drink_compensate[1]%10]);
- }
- LCD_printc('m');
- LCD_printc('l');
- }
- /**
- ************************************* Copyright ******************************
- 延时函数
- ******************************************************************************
- */
- void delay1ms(void) //误差 0.000000000000us
- {
- unsigned char a,b;
- for(b=25; b>0; b--)
- for(a=57; a>0; a--);
- }
- int now_time=0,last_time=0;//定义两个标志位
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name time_10s
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 10秒计时函数,用于lcd显示切换
- **/
- /* -------------------------------- end -------------------------------- */
- int time_10s()
- {
- static int time_count=0;
- if(last_time!=now_time)
- {
- time_count++;
- last_time=now_time;
- }
- if(time_count>=10)
- {
- time_count=0;
- return 1;
- }
- return 0;
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name change_alarm_Time
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 修改定时时间
- **/
- /* -------------------------------- end -------------------------------- */
- void change_alarm_Time()
- {
- if(hour_pin==0)//小时按键按下
- { delay1ms();
- if(hour_pin==0)
- myTime[2]++;
- if(myTime[2]>=24)
- myTime[2]=0;
- }
- if(minute_pin==0)//分钟按键按下
- { delay1ms();
- if(minute_pin==0)
- myTime[1]++;
- if(myTime[1]>=60)
- myTime[1]=0;
- }
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name measure_water
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 水位测量函数
- **/
- /* -------------------------------- end -------------------------------- */
- void measure_water()
- {
- if(top_pin==0)//水杯盖子没打开
- {
- drink_compensate[0]=my_compensate_last-my_compensate;
- my_compensate_last=my_compensate;
- }
- else
- {
- }
- if(drink_compensate[0]>30)
- {
- show_flag=1;
- drink_compensate[1]=drink_compensate[0];
- }
- if(show_flag==1)
- {
- if(time_10s()==1)
- show_flag=0;
- }
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name alarm_buzzer
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 定时蜂鸣器报警
- **/
- /* -------------------------------- end -------------------------------- */
- void alarm_buzzer()
- {
- static alarm_count=0;
- if(myTime[2]==DateTime[2]&&myTime[1]==DateTime[1]&&myTime[0]==DateTime[0]&&buzzer_flag==0)
- {
- buzzer_flag=1;
- }
- if(buzzer_flag==1)
- {
- if(last_time!=now_time)
- {
- if(now_time%2==0)
- {
- alarm_count++;
- buzzer_pin=0;
- }
- else
- buzzer_pin=1;
- if(alarm_count>=10)
- {
- alarm_count=0;
- buzzer_flag=0;
- buzzer_pin=1;
- }
- last_time=now_time;
- }
- }
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name change_my_temperature
- * @brief
- * @param in_Resistance: [输入/出]
- ** in_Temperature: [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 温度补偿函数
- **/
- /* -------------------------------- end -------------------------------- */
- int change_my_temperature(int in_Resistance,int in_Temperature)//电阻温度补偿换算公式:R2=R1*(T+t2)/(T+t1)
- {
- int out_temperature=0;
- float middle1=0,middle2=0,middle3=0;
- middle1=T_constant+in_Temperature;
- middle2=T_constant+20;
- middle3=middle1/middle2;
- out_temperature= in_Resistance*middle3;
- return out_temperature;
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name control
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 控制函数
- **/
- /* -------------------------------- end -------------------------------- */
- void control()//控制函数
- {
- measure_water();
- change_alarm_Time();
- alarm_buzzer();
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name Ad_receive
- * @brief
- * @param None
- * @retval
- * @author
- * @Data 2021-01-22
- AD读取函数
- **/
- /* -------------------------------- end -------------------------------- */
- void Ad_receive(void)//ad读取函数
- {
- switch(AD_CHANNEL)
- {
- case 0:
- ISendByte(PCF8591,0x41);
- myData[0]=IRcvByte(PCF8591); //ADC0 模数转换1
- break;
- case 1:
- ISendByte(PCF8591,0x42);
- myData[1]=IRcvByte(PCF8591); //ADC1 模数转换2
- break;
- case 2:
- ISendByte(PCF8591,0x43);
- myData[2]=IRcvByte(PCF8591); //ADC2 模数转换3
- break;
- case 3:
- ISendByte(PCF8591,0x40);
- myData[3]=IRcvByte(PCF8591); //ADC3 模数转换4
- break;
- }
- if(++AD_CHANNEL>4) AD_CHANNEL=0;
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name init_Time
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 时间初始化函数
- **/
- /* -------------------------------- end -------------------------------- */
- void init_Time()
- {
- GetTime();
- now_time=DateTime[0];
- last_time=now_time;
- myTime[2]=DateTime[2];
- myTime[1]=DateTime[1];
- myTime[0]=0;
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name InitTimer0
- * @brief
- * @param None
- * @retval
- * @author
- * @Data 2021-01-22
- 定时器0初始化函数
- **/
- /* -------------------------------- end -------------------------------- */
- void InitTimer0(void)
- {
- TMOD = 0x01;
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name init_all
- * @brief
- * @param : [输入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 初始化全部
- **/
- /* -------------------------------- end -------------------------------- */
- void init_all()
- {
- LCD_initial();//lcd1602初始化
- Ad_receive();//水量采集
- my_compensate_last=my_compensate;
- drink_compensate[0]=0;
- init_Time();
- InitTimer0();
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name main
- * @brief
- * @param None
- * @retval
- * @author 帅气鹏
- * @Data 2021-01-22
- 主函数
- **/
- /* -------------------------------- end -------------------------------- */
- void main(void)//主函数
- {
- init_all();
- while(1)
- {
- GetTime();
- now_time=DateTime[0];
- Ad_receive();//ad采集
- my_compensate=change_my_temperature(myData[0],tvalue/10);
- display();//显示
- control();
- }
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name Timer0Interrupt
- * @brief
- * @param None
- * @retval
- * @author 帅气鹏
- * @Data 2021-01-22
- 定时器中断处理函数
- **/
- /* -------------------------------- end -------------------------------- */
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- read_temp();
- }
复制代码 |
-
AD读取代码.jpg
(33.02 KB, 下载次数: 110)
-
报警代码.jpg
(30.95 KB, 下载次数: 116)
-
闹钟修改代码.jpg
(20.19 KB, 下载次数: 110)
-
时间初始化代码.jpg
(10 KB, 下载次数: 106)
-
水位测量代码.jpg
(29.08 KB, 下载次数: 111)
-
温度补偿代码.jpg
(24.59 KB, 下载次数: 125)
-
显示代码.jpg
(57.97 KB, 下载次数: 118)
-
-
智能水杯.zip
4.04 MB, 下载次数: 78, 下载积分: 黑币 -5
-
-
动态图演示.7z
6.26 MB, 下载次数: 43, 下载积分: 黑币 -5
评分
-
查看全部评分
|