|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (40.76 KB, 下載次數(shù): 40)
下載附件
2021-1-31 22:10 上傳
主函數(shù)代碼.jpg (16.01 KB, 下載次數(shù): 41)
下載附件
2021-1-31 22:17 上傳
單片機源程序如下:
- /**
- ************************************* Copyright ******************************
- * FileName : Main1.c
- * Version : v1.0
- * Author : superman
- * Date : 2021-01-22
- * Description:
- 電阻溫度換算公式:R2=R1*(T+t2)/(T+t1).
- t1-----繞組溫度常溫20°C
- T------電阻溫度常數(shù)(銅線取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顯示數(shù)組
- /**
- ************************************* 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個;
- ②只能顯示數(shù)字和字母(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 ******************************
- 延時函數(shù)
- ******************************************************************************
- */
- 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秒計時函數(shù),用于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
- 水位測量函數(shù)
- **/
- /* -------------------------------- 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
- 溫度補償函數(shù)
- **/
- /* -------------------------------- 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
- 控制函數(shù)
- **/
- /* -------------------------------- end -------------------------------- */
- void control()//控制函數(shù)
- {
- measure_water();
- change_alarm_Time();
- alarm_buzzer();
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name Ad_receive
- * @brief
- * @param None
- * @retval
- * @author
- * @Data 2021-01-22
- AD讀取函數(shù)
- **/
- /* -------------------------------- end -------------------------------- */
- void Ad_receive(void)//ad讀取函數(shù)
- {
- switch(AD_CHANNEL)
- {
- case 0:
- ISendByte(PCF8591,0x41);
- myData[0]=IRcvByte(PCF8591); //ADC0 模數(shù)轉換1
- break;
- case 1:
- ISendByte(PCF8591,0x42);
- myData[1]=IRcvByte(PCF8591); //ADC1 模數(shù)轉換2
- break;
- case 2:
- ISendByte(PCF8591,0x43);
- myData[2]=IRcvByte(PCF8591); //ADC2 模數(shù)轉換3
- break;
- case 3:
- ISendByte(PCF8591,0x40);
- myData[3]=IRcvByte(PCF8591); //ADC3 模數(shù)轉換4
- break;
- }
- if(++AD_CHANNEL>4) AD_CHANNEL=0;
- }
- /* -------------------------------- begin -------------------------------- */
- /**
- * @Name init_Time
- * @brief
- * @param : [輸入/出]
- * @retval
- * @author
- * @Data 2021-01-22
- 時間初始化函數(shù)
- **/
- /* -------------------------------- 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初始化函數(shù)
- **/
- /* -------------------------------- 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
- 主函數(shù)
- **/
- /* -------------------------------- end -------------------------------- */
- void main(void)//主函數(shù)
- {
- 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
- 定時器中斷處理函數(shù)
- **/
- /* -------------------------------- end -------------------------------- */
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x0D8;
- TL0 = 0x0F0;
- read_temp();
- }
復制代碼 |
-
AD讀取代碼.jpg
(33.02 KB, 下載次數(shù): 110)
下載附件
2021-1-31 22:17 上傳
-
報警代碼.jpg
(30.95 KB, 下載次數(shù): 116)
下載附件
2021-1-31 22:17 上傳
-
鬧鐘修改代碼.jpg
(20.19 KB, 下載次數(shù): 110)
下載附件
2021-1-31 22:17 上傳
-
時間初始化代碼.jpg
(10 KB, 下載次數(shù): 106)
下載附件
2021-1-31 22:17 上傳
-
水位測量代碼.jpg
(29.08 KB, 下載次數(shù): 111)
下載附件
2021-1-31 22:17 上傳
-
溫度補償代碼.jpg
(24.59 KB, 下載次數(shù): 125)
下載附件
2021-1-31 22:17 上傳
-
顯示代碼.jpg
(57.97 KB, 下載次數(shù): 118)
下載附件
2021-1-31 22:17 上傳
-
-
智能水杯.zip
2021-1-31 17:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
4.04 MB, 下載次數(shù): 78, 下載積分: 黑幣 -5
-
-
動態(tài)圖演示.7z
2021-1-31 22:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
6.26 MB, 下載次數(shù): 43, 下載積分: 黑幣 -5
評分
-
查看全部評分
|