环境控制和红外线控制
单片机源程序如下:
- #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)
|