使用到的模塊有9g舵機,步進電機人體感應模塊,金屬探測模塊,LCD1602顯示屏,原理圖如下:
單片機源程序如下:
- #include "main.h"
- #include "HX711.h"
- #include "uart.h"
- #include "LCD1602.h"
- #include "temp.h"
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned char u8;
- typedef unsigned short int u16;
- unsigned long HX711_Buffer = 0;
- unsigned long Weight_Maopi = 0;
- long Weight_Shiwu = 0;
- unsigned long Weight_Maopi1 = 0;
- long Weight_Shiwu1 = 0;
- long Weight_Shiwu3 = 000;
- long Weight_Shiwu4 = 10;
- unsigned char flag = 0;
- bit Flag_ERROR = 0;
- bit Flag_send = 0;
- sbit People= P3^6;
- sbit JINSHU= P3^2;
- unsigned char a;
- char qingpin=0;
- char shuju[]="0123456789";
- int TEMP=0;
- //校準參數
- //因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
- //當發現測試出來的重量偏大時,增加該數值。
- //如果測試出來的重量偏小時,減小改數值。
- //該值可以為小數
- #define GapValue 390
- void Get_Maopi1();
- void Get_Weight1();
- char Key_Scan(char mode);
- void TaoCan(void);
- int LcdDisplay(int temp); //lcd顯示
- void BuJing_Crole1(u16 j,u16 time);
- void BuJing_Crole2(u16 j,u16 time);
- //****************************************************
- //主函數
- //****************************************************
- sbit CTRL = P3^7; //舵機控制端口
- void delay_100ms(u16 x);
- u16 TIME = 20000; //PWM周期時間(單位us)
- u16 Min = 800; //高電平最小持續時間
- u16 Max = 2200; //高電平最大持續時間
- u16 aTime = 800; //高電平持續時間
- u8 Degree = 200; //單位時間寬度
- u8 R_TH0 = 0, R_TL0 = 0; //定時器0計數重載值
- void main()
- {
- char flage=0;
- CTRL = 0;
-
- R_TL0 = 65536 - TIME;
- R_TH0 = (65536 - TIME) >> 8;
-
- //設置定時器0
- TMOD = 0x01; //16位計數
- TL0 = R_TL0;
- TH0 = R_TH0;
- ET0 = 1; //定時器0中斷開關打開
- TR0 = 1; //定時器0計數開始
-
- //設置定時器1
- TMOD |= 0x10; //16位計數
- TL1 = 65536 - aTime;
- TH1 = (65536 - aTime) >> 8;
- ET1 = 1; //定時器1中斷開關打開
- TR1 = 0; //定時器1計數停止
-
- EA = 1;
- //中斷總開關打開
- Init_LCD1602();//屏幕初始化
- aTime=2300;//關垃圾桶蓋
- Delay_ms(1000); //延時,等待傳感器穩定
- Get_Maopi1(); //稱毛皮重量,誤差校驗
-
- while(1)
- {
- if(People==1&&flage==0)
- {
- flage=1;
- aTime=1400;//開蓋
- LCD1602_write_com(0x80);
- LCD1602_write_word("People:Y");
- BuJing_Crole1(2000,3);
- Delay_ms(1500);
- while(1)
- {
-
- while(1)
- {
- if(JINSHU==1)
- {
- LCD1602_write_word("JS:Y");
- Delay_ms(1500);
- LCD1602_write_com(0x89);
- BuJing_Crole2(260,3);
- }
- else{
- LCD1602_write_word("JS:N");
- Delay_ms(1500);
- LCD1602_write_com(0x89);
- BuJing_Crole2(26
- 0,3);
- }
- while(1)
- {
- LCD1602_write_com(0x80+0x40);//1602位置命令
- Get_Weight1(); //稱重
- LCD1602_write_word("W:");
- LCD1602_write_data(Weight_Shiwu1/1000 + 0X30);
- LCD1602_write_data(Weight_Shiwu1%1000/100 + 0X30);
- LCD1602_write_data(Weight_Shiwu1%100/10 + 0X30);
- LCD1602_write_data(Weight_Shiwu1%10 + 0X30);
- LCD1602_write_word("g");
- Delay_ms(1000);
-
- if(Weight_Shiwu1>=10)
- {
- LCD1602_write_com(0x01);
- aTime=2300;//關垃圾桶蓋
- break;
- }
- }
- break;
- }
- break;
- }
- }else{
- flage=0;
- LCD1602_write_com(0x80);
- aTime=2300;//關垃圾桶蓋
- LCD1602_write_word("People:W");
-
- }
- }
- }
- //****************************************************
- //稱重
- //****************************************************
- void Get_Weight()
- {
- Weight_Shiwu = HX711_Read();//讀取HX711AD采集值
- Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //獲取凈重
- if(Weight_Shiwu > 0) //判斷采集值正負
- {
- Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/GapValue); //計算實物的實際重量
-
- }
- else
- {
- Weight_Shiwu = 0;//
- }
- }
- void Get_Weight1()
- {
- Weight_Shiwu1 = HX711_Read1();
- Weight_Shiwu1 = Weight_Shiwu1 - Weight_Maopi1; //獲取凈重
- if(Weight_Shiwu1 > 0)
- {
- Weight_Shiwu1 = (unsigned int)((float)Weight_Shiwu1/GapValue); //計算實物的實際重量
-
- }
- else
- {
- Weight_Shiwu1 = 0;
- }
- }
- //****************************************************
- //獲取毛皮重量
- //****************************************************
- void Get_Maopi()
- {
- Weight_Maopi = HX711_Read();
- }
- void Get_Maopi1()
- {
- Weight_Maopi1 = HX711_Read1();
- }
- //****************************************************
- //MS延時函數(12M晶振下測試)
- //****************************************************
- void Delay_ms(unsigned int n)
- {
- unsigned int i,j;
- for(i=0;i<n;i++)
- for(j=0;j<123;j++);
- }
- int LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數組
- float tp;
- if(temp< 0) //當溫度值為負數
- {
- LCD1602_write_com(0x80); //寫地址 80表示初始地址
- LCD1602_write_data('-'); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數點后面。
-
- }
- else
- {
- LCD1602_write_com(0x80); //寫地址 80表示初始地址
- LCD1602_write_data('+'); //顯示正
- tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數點后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
- LCD1602_write_com(0x82); //寫地址 80表示初始地址
- LCD1602_write_data(datas[0]+0x30); //百位
-
-
- LCD1602_write_com(0x83); //寫地址 80表示初始地址
- LCD1602_write_data(datas[1]+0x30); //十位
-
- LCD1602_write_com(0x84); //寫地址 80表示初始地址
- LCD1602_write_data(datas[2]+0x30); //個位
-
- LCD1602_write_com(0x85); //寫地址 80表示初始地址
- LCD1602_write_data('.'); //顯示 ‘.’
-
- LCD1602_write_com(0x86); //寫地址 80表示初始地址
- LCD1602_write_data(datas[3]+0x30); //顯示小數點
- LCD1602_write_com(0x87); //寫地址 80表示初始地址
- LCD1602_write_data(datas[4]+0x30); //顯示小數點
-
- temp=datas[1]*10+datas[2];
- return temp;
- }
- void timer0() interrupt 1 using 1
- {
- TL0 = R_TL0;
- TH0 = R_TH0;
- TL1 = 65536 - aTime;
- TH1 = (65536 - aTime) >> 8;
- TR1 = 1;
- CTRL = 1;
- }
- //定時器1中斷函數
- void timer1() interrupt 3 using 1
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有參考資料51hei提供下載:
智能垃圾桶.7z
(1.94 MB, 下載次數: 156)
2019-5-5 17:05 上傳
點擊文件名下載附件
|