|
硬件設計包括如下模塊: n 最小系統模塊: STC89C52RC正常工作的最小系統; n 模擬輸入模塊:一路光照、一路電壓; n 數字輸入模塊:兩路溫度、一路濕度、多個按鍵; n 模擬輸出模塊:一路光照; n 數字輸出模塊:一路PWM波控制直流電機、蜂鳴器、多個工作狀態指示燈; n 液晶顯示模塊:一塊12864LCD顯示輸出; n 串口通信模塊:CH340T模塊電路 軟件設計包括如下模塊:
n C代碼:AD采集、數字傳感器驅動、DA輸出、按鍵與液晶控制、串口收發處理等
- #include<reg52.h>
- #include<stdio.h>
-
- #define uchar unsigned char
- #define uint unsigned int
- #include"12864.c"
- #include"PCF8591ADDA.c"
- #include"DS18B20.C"
- #include"DTH11.C"
- sbit led0=P1^0;//通信測試燈
- sbit led1=P1^1;
- sbit led2=P1^2;
- sbit led3=P1^3;
- sbit MOTOR=P1^4;
- uchar ren_flag,ren_buff;
- uchar buff[8];
- char *get="Get it.";
- char *sendflag="sendflag";
- unsigned char num; //DA數模輸出變量
- unsigned char ADtemp; //定義中間變量
- void serial_init(void) //串口初始化函數
- {
- TMOD=0x20;//00100000
- PCON=0x00;//波特率不加倍
- SCON=0x50;//01010000 方式1,允許接收
- TH1=0xfd; //波特率9600
- TL1=0xfd;
- EA=1;
- ES=1;
- TR1=1;
- ET1=0;
-
- }
- void serial_send(char*parr) //串口數據發送函數
- {
- do
- {
- SBUF=*parr++; //發送數據
- while(!TI); //等待發送完成標志為1
- TI=0; //標志清0
- }while(*parr); //保持循環直到字符為‘\0’
- }
- void DAQ_display_sender()
- {
- //DS18B20
-
- show_char(0,0,"Data acquisition");
- tempchange(); //溫度轉換函數
- get_temp();
- show_char(1,2," ");
- show_char(1,0,"TEM:");
-
- sprintf(buff,"%.8s",sendflag);
- serial_send(buff);
- sprintf(buff,"%.3f",f_temp);//將浮點型溫度格式化為字符型
- show_char(1,2,buff); //獲取溫度并顯示
- show_char(1,5,"℃");
- f_temp+=0x64;
- sprintf(buff,"%.3f",f_temp);
- serial_send(buff); //串口發送數據
-
- /*DA
- DAC(num); //DA輸出,可以用LED模擬電壓變化
- num++; //累加,到256后溢出變為0,往復循環。顯示在LED上亮度逐漸變化
- */
-
- //DTH11
- RH();
- sprintf(buff,"%.1f",f_temp_T);//將浮點型溫度格式化為字符型
- show_char(2,0,"T: ℃");
- show_char(2,1,buff);
- serial_send(buff);
- sprintf(buff,"%.1f",f_temp_RH);//將浮點型溫度格式化為字符型
- show_char(2,4,"R: %");
- show_char(2,5,buff);
- serial_send(buff);
- //AD
- if(ADFlag) //定時采集輸入模擬量
- {
- ADFlag=0;
- ADtemp=ReadADC(0);
- TempData[0]=(ReadADC(0))/50;//處理0通道電壓顯示
- TempData[1]=((ReadADC(0))%50)/10;
-
- ADtemp=ReadADC(2);
- TempData[4]=(ReadADC(2))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
- TempData[5]=((ReadADC(2))%50)/10;
-
- /* ADC通道2、通道4采集
- ADtemp=ReadADC(1);
- TempData[2]=(ReadADC(1))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
- TempData[3]=((ReadADC(1))%50)/10;
-
-
- ADtemp=ReadADC(3);
- TempData[6]=(ReadADC(3))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
- TempData[7]=((ReadADC(4))%50)/10;
- */
- }
- ADFlag=1;
-
- f_temp=TempData[4]+TempData[5]*0.1;//通道3光敏電阻電壓值
- sprintf(buff,"%.1f",f_temp);//
- show_char(3,0,"O: V");
- show_char(3,1,buff);
- serial_send(buff);
-
- f_temp=TempData[0]+TempData[1]*0.1;
- sprintf(buff,"%.1f",f_temp);//將浮點型溫度格式化為字符型
- show_char(3,4,"V: V");
- show_char(3,5,buff);
- serial_send(buff);//串口發送數據
-
- /* ADC通道3、通道4處理顯示信息
- f_temp=TempData[4]+TempData[5]*0.1;
- sprintf(buff,"%.1f",f_temp);//將浮點型溫度格式化為字符型
- show_char(3,0,"3: V");
- show_char(3,1,buff);
- serial_send(buff); //串口發送數據
-
- f_temp=TempData[6]+TempData[7]*0.1;
- sprintf(buff,"%.1f",f_temp);//將浮點型溫度格式化為字符型
- show_char(3,4,"4: V");
- show_char(3,5,buff);
- serial_send(buff); //串口發送數據
- */
-
-
- }
- void main() //主函數
- {
-
-
- cmg();// 數碼管鎖存函數 關時鐘DS1302
- wela=0;
- dula=0;
- lcd_init(); //初始化LCD
- serial_init();
- MOTOR=0;
- while(1)
- {
- if(ren_flag==0)
- {
- led0=1;
- MOTOR=0;
- show_char(0,0,"Wait for command");
- show_char(1,0," ");
- show_char(2,0," ");
- show_char(3,0," ");
- }
- if(ren_flag==1) //測試通信
- {
- led0=0;
- delay_ms(10);
- led0=1;
- MOTOR=0;
- show_char(0,0,"Connection Succe");
- show_char(1,0,"ssful! ");
- show_char(2,0," ");
- show_char(3,0," ");
- sprintf(buff,"%.8s",get);
- serial_send(buff);
- }
- if(ren_flag==2)//
- {
- MOTOR=0;
- DAQ_display_sender();
- }
-
- if(ren_flag==3)
- {
- MOTOR=1;
- DAQ_display_sender();
- }
- if(ren_flag==4)
- {
- MOTOR=0;
- DAQ_display_sender();
- }
-
- if(ren_flag==5)
- {
- show_char(0,0,"Stop DAQ and sen");
- show_char(1,0,"ding! ");
- show_char(2,0," ");
- show_char(3,0," ");
- MOTOR=0;
- led0=1;
- }
- }
- }
- void ser() interrupt 4
- {
-
- if(TI)
- ;
- else
- {
- if(RI)
- lcd_clean();
- ES=0;
- RI=0;
- ren_buff=SBUF;
- switch(ren_buff)
- {
- case 0x31: ren_flag=1; break; //接受到1,第一個LED亮
- case 0x32: ren_flag=2; break; //接受到2,第二個LED亮
- case 0x33: ren_flag=3; break; //接受到3,第三個LED亮
- case 0x34: ren_flag=4;break; //接受到4,第四個LED亮
- case 0x35: ren_flag=5;break; //接受到5,第五個LED亮
- case 0x36: ren_flag=6;break; //接受到5,第六個LED亮
- case 0x37: ren_flag=7;break; //接受到5,第七個LED亮
- case 0x38: ren_flag=8;break; //接受到5,第八個LED亮
- default: ren_flag=0;break; //接受到其它數據,蜂鳴器響
- led1=~led1;
- }
-
- ES=1;
- }
- }
復制代碼
0.png (52.25 KB, 下載次數: 122)
下載附件
2016-6-3 14:34 上傳
|
-
-
C源碼.rar
2016-5-27 16:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
59.77 KB, 下載次數: 13, 下載積分: 黑幣 -5
下位機源代碼
評分
-
查看全部評分
|