環境控制和紅外線控制
單片機源程序如下:
- #include "define.h"
- uint Voltage,Light,Temperature;
- uchar xdata DisplayReg[4]; //定義4個數碼管顯示的緩存數組
- //定義數碼管顯示0~9的段碼
- uchar code DIGITTAB[]=
- {
- 0X14,0x9F,0X38,0X1A,0X93,0X52,0X50,0X1F,0X10,0X12,0xff/*0~9*/
- };
- //0001 0100
- //定義數碼管顯示0.~9.的段碼
- uchar code DIGITDOTTAB[]=
- {
- 0X04,0X8F,0X28,0X0A,0X83,0X42,0X40,0X0F,0X00,0X02,0xff/*0.~9.*/
- };
- //定義數碼管顯示C,L,E的段碼
- uchar code CHARTAB[]=
- {
- 0X74,0XF4,0X70,0xff, /*C,L,E及熄滅*/
- };
- uchar code Char_C=0X74;
- uchar code Char_L=0XF4;
- uchar code Char_E=0X70;
- uchar code DigitOff=0Xff;
- /**********************************************************
- 初使化函數
- 設置輸出IO的初使狀態
- 定時器,變量,串行通訊口以及中斷的設置
- **********************************************************/
- void Timer0Init(void) //20毫秒@22.1184MHz
- {
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0x70; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- /**********************************************************
- 初使化函數
- 設置輸出IO的初使狀態
- 定時器,變量,串行通訊口以及中斷的設置
- **********************************************************/
- void Init()
- {
- P0=0xFF;
- P1=0xFF;
- P2=0xFF;
- P3=0xFF;
- Timer0Init();
- ET0=1;
- EA=1;
- SetT=360;
- }
- /**********************************************************
- 延時子程序(x)ms
- **********************************************************/
- void DelayMs(uint x)
- {
- uint i;
- do
- {
- for(i=0;i<600;i++)
- {
- ;
- }
- x--;
- }while(x>0);
- }
- /**********************************************************
- 顯示子程序
- **********************************************************/
- void Display()
- {
- uchar i,j,temp;
- for(i=0;i<4;i++)
- {
- temp=DisplayReg[i]; //讀外部RAM的DisplayReg,同時緩存的值會在P0口上
- for(j=0;j<8;j++) //加8個CLK信號
- {
- CLK=0;CLK=1;
- }
- }
- ST=0;ST=1; //鎖存信號,此時剛才送的4個數碼管顯示的內容將被送到數碼管引腳
- }
- /**********************************************************
- 測試數碼管子程序
- **********************************************************/
- void Test()
- {
- uchar i;
- for(i=0;i<10;i++) //四個數碼管顯示0~9
- {
- DisplayReg[0]=DIGITTAB[i];
- DisplayReg[1]=DIGITTAB[i];
- DisplayReg[2]=DIGITTAB[i];
- DisplayReg[3]=DIGITTAB[i];
- Display();
- DelayMs(100);
- }
- for(i=0;i<10;i++) //四個數碼管顯示0.~9.
- {
- DisplayReg[0]=DIGITDOTTAB[i];
- DisplayReg[1]=DIGITDOTTAB[i];
- DisplayReg[2]=DIGITDOTTAB[i];
- DisplayReg[3]=DIGITDOTTAB[i];
- Display();
- DelayMs(100);
- }
- }
- /**********************************************************
- 蜂鳴器子程序
- **********************************************************/
- void Speaker(uchar x)
- {
- uchar i;
- for(i=0;i<x;i++)
- {
- MK=0;
- DelayMs(1000);
- MK=1;
- DelayMs(500);
- }
- }
- /**********************************************************
- 采信溫度,并顯示
- **********************************************************/
- void DisplayTemperature()
- {
- DisplayReg[0]=Char_C; //顯示C
- DisplayReg[1]=DIGITTAB[Temperature/100%10]; //取百位
- DisplayReg[2]=DIGITDOTTAB[Temperature/10%10]; //取十位
- DisplayReg[3]=DIGITTAB[Temperature%10]; //取個位
- Display();
- }
- /**********************************************************
- 采信光照度,并顯示
- **********************************************************/
- void DisplayLight()
- {
- DisplayReg[0]=Char_L; //顯示L
- DisplayReg[1]=DIGITTAB[Light/100%10]; //取百位
- DisplayReg[2]=DIGITDOTTAB[Light/10%10]; //取十位
- DisplayReg[3]=DIGITTAB[Light%10]; //取個位
- Display();
-
- }
- /**********************************************************
- 采信光照度,并顯示
- **********************************************************/
- void DisplayVoltage()
- {
- DisplayReg[0]=Char_E; //顯示E
- DisplayReg[1]=DIGITDOTTAB[Voltage/100%10]; //取百位
- DisplayReg[2]=DIGITTAB[Voltage/10%10]; //取十位
- DisplayReg[3]=DIGITTAB[Voltage%10]; //取個位
- Display();
- }
- /**********************************************************
- 采集所有的參數 并判斷報警
- **********************************************************/
- void CjAllValue()
- {
- float tempV,tempR;
- //采集溫度
- tempV=ReadAD(0);
- tempR=(50.0-tempV*10.0)/tempV; //求出熱敏電阻值單位為K
- if(tempR>32.79) //求出電壓值 并轉換成無符號整型,便于數據處理
- {
- Temperature=0;
- }
- else if(tempR>19.83) //0~10
- {
- tempR=10.0-(tempR-19.83)/(32.79-19.83)*10.0;
- }
- else if(tempR>12.47) //10~20
- {
- tempR=20.0-(tempR-12.47)/(19.83-12.47)*10.0;
- }
- else if(tempR>8.065) //20~30
- {
- tempR=30.0-(tempR-8.065)/(12.47-8.065)*10.0;
- }
- else if(tempR>5.08) //30~40
- {
- tempR=40.0-(tempR-5.08)/(8.065-5.08)*10.0;
- }
- else if(tempR>4.16) //40~50
- {
- tempR=50.0-(tempR-4.16)/(5.08-4.16)*10.0;
- }
- else if(tempR>1.02) //50~100
- {
- tempR=100.0-(tempR-4.16)/(4.16-1.02)*10.0;
- }
- else// if(tempR>1.02) //50~100
- {
- tempR=99.9;//100.0-(tempR-4.16)/(4.16-1.02)*10.0;
- }
-
- Temperature=(uint)(tempR*10);
-
- //采集光照度
- tempV=ReadAD(1);
- tempR=(50.0-tempV*10.0)/tempV; //求出光敏電阻值單位為K
- Light=(uint)(tempR*10); //顯示當前光照下電阻值單位為K
-
- //采集電壓
-
- tempV=ReadAD(2);
- tempR=tempV*2; //求出電壓值 并轉換成無符號整型,便于數據處理
- Voltage=(uint)(tempR*100);
- if(Temperature>=SetT)
- {
- MK=0;
- }
- else
- {
- MK=1;
- }
-
- }
- /**********************************************************
- 主函數
- **********************************************************/
- void main()
- {
- uchar cnts;
- Init();
- Speaker(5); //蜂鳴器響5聲
- Test();
- while(1)
- {
- KeyPro();
- if(!SetBit)
- {
- if(cnts<3)
- {
- DisplayTemperature();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
hjjk.rar
(87.92 KB, 下載次數: 15)
2018-6-28 15:53 上傳
點擊文件名下載附件
溫度監控 下載積分: 黑幣 -5
|