1. 程式人生 > >南理工紫金微控制器課程設計

南理工紫金微控制器課程設計

任務: 採用溫度感測器和微控制器等電路獨立設計並製作一個簡易數字式溫度控制裝置。

資源下載地址:

https://download.csdn.net/download/qq_40707685/10764080

單路溫度

雙路溫度

 部分程式碼:

#include<reg51.h>
#include<intrins.h>
#include <stdio.h>
#include<absacc.h>
#include<math.h>


#define PIN0 XBYTE[0X7FF8]       //ADC0809的絕對地址
typedef unsigned char byte;
typedef unsigned int word;
unsigned char xuehao[]="000000000 ";
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //數碼管熄滅


sbit int0=P3^2;                  //調整設定溫度和顯示當前溫度轉換
sbit green=P3^4;                 //加熱電阻絲
sbit red=P3^5;                   //風扇
sbit ck=P2^4;                    //串列埠傳送開關
sbit jia=P2^5;
sbit jian=P2^6;
byte l,m,flag1,flag2=0;
byte T,sdH=60,sdL=40;                      //設定溫度
                 

float result=0;
float result_reg;
byte i;
/*****************************************************
函式名:延時子函式
調  用:delay(?)
參  數:延時時長
返回值:無
結  果:延時
備  注:無
******************************************************/
void delay(int n)
{
  while(n--);
}

/*****************************************************
函式名:初始化子函式
調  用:init()
參  數:無
返回值:無
結  果:對外部中斷0,外部中斷1,定時器中斷0和串列埠暫存器進行初始化
備  注:無
*******************************************************/
void init()
{
     
     TMOD=0x01;
     TH0=(65536-50000)/256;       //定時器0計數初值設定,0.5秒定時
     TL0=(65536-50000)%256;
     
     EX0=1;
     EX1=1;
     ET0=1;
     PX0=0;
     PX1=0;
     PT0=1;
     PT1=1;
     EA=1;
     TR0=1;
    
     IT1=1;                       
     IT0=1;
}
/*****************************************************
函式名:AD採集電壓子程式
調  用:samp()
參  數:無
返回值:採集到的電壓值模擬量
結  果:採集電壓
備  注:無
*******************************************************/
float samp()
{
   
           PIN0=0xFF;
           for(i=0;i<0x9f;i++);
		                                      
            result_reg=PIN0;
            result=result_reg*5/255;
           return result;
 }

/*****************************************************
函式名:電壓轉換為溫度子函式
調  用:jisuan(?)
參  數:採集的電壓值
返回值:無
結  果:得到當前溫度的十位和個位,以及設定溫度的十位和個位
備  注:無
*******************************************************/
void jisuan(float result)
{	
	float T1,T2,T3=0.0;
//     if(result>0.00&&result<1.416)
//     {
//		T=48.78*result-39.07;
//	 }
//	 else if(result>1.416&&result<2.968)
//     {
//		T=19.33*result+2.629;
//	 }
//	 else if(result>2.968&&result<3.418)
//     {
//		T=31.11*result-32.338;
//	 }
//	 else if(result>3.418&&result<5.00)
//    {
//		T=105.26*result-285.79;
//	}            //把電壓轉換為溫度
	
	T1 = 11.247*result*result;
	T2 = 13.168*result;
	T3 = T1+T2+25.689;
	if(T3>100)
	{T3 -= 59;}
	else if(T3>80)
	{T3 -= 40;}
	else if(T3>60)
	{T3 -= 20;}
	else if(T3>50)
	{T3 -= 10;}
	else 
	{T3 -= 6;}
	
	T=(char)T3;
	
}

/*****************************************************
函式名:繼電器驅動發光二極體子函式
調  用:jidianqi()
參  數:無
返回值:無
結  果:當前溫度>設定溫度,紅燈亮;當前溫度<設定溫度,綠燈亮
備  注:無
*******************************************************/
void jidianqi()
{   if(T>sdH){red=1;green=0;}
    else if(T<sdL){red=0;green=1;}
    else  {red=0;green=0;}
 }
/******************************************************
函式名:動態顯示
調  用:display(?,?,?)
參  數:當前溫度的十位,個位和大寫C
返回值:無
結  果:數碼管動態顯示溫度
備  注:無
*******************************************************/
void display(byte wendu)
{       
       unsigned char a,b;
       a=wendu/10;
        b=wendu%10;
       
        P1=0xff;			     
        P2=0xf7;
        P1=tab[12];//顯示大寫'C'
        delay(100);
        P1=0xff;			     
        P2=0xfb;
        P1=0x9c;//顯示'o'
        delay(100);
        P1=0xff;
        P2=0xfd;
        P1=tab[b];
        delay(100);
        P1=0xff;
        P2=0xfe;
        P1=tab[a];
       delay(100);
        P1=0xff;  
}


void displayH(byte wendu)
{       
       unsigned char a,b;
        a=wendu/10;
        b=wendu%10;
	
        P1=0xff;			     
        P2=0xf7;
        P1=0x89;//顯示大寫'H'
        delay(100);
        P1=0xff;			     
        P2=0xfb;
        P1=0xbf;//顯示大寫'-'
        delay(100);
        P1=0xff;
    	  P2=0xfd;
        P1=tab[b];
        delay(100);
        P1=0xff;
        P2=0xfe;
        P1=tab[a];
	      delay(100);
        P1=0xff; 
		 
		
   	 
}

void displayL(byte wendu)
{       
	   
	    unsigned char a,b;
	      a=wendu/10;
        b=wendu%10;
	
	      P1=0xff;			     
        P2=0xf7;
        P1=0xc7;//顯示大寫'L'
        delay(100);
        P1=0xff;			     
        P2=0xfb;
        P1=0xbf;//顯示大寫'-'
        delay(100);
        P1=0xff;
    	  P2=0xfd;
        P1=tab[b];
        delay(100);
        P1=0xff;
        P2=0xfe;
        P1=tab[a];
	      delay(100);
        P1=0xff; 	 
}


byte anjian(byte wendu)
{
	if(jia==0)
	{
		delay(100);
		if(jia==0)
		{
			wendu++;
			if(wendu>90)
				wendu=90;
		}
	}
	while(!jia);
    if(jian==0)
	{
		delay(100);
		if(jian==0)
		{
			wendu--;
			if(wendu<0)wendu=0;
		}
	}
	while(!jian);

    return wendu;

}
void chuankou(float wendu)
{
	char t=0;
	byte a,b;
	if(ck==0)
	{
	    delay(100);
		if(ck==0)
		{
		     TMOD=0x21;
			 SCON=0x40;
			 PCON=0;
			 TH1=0xFD;
			 TL1=0xFD;
			 TR1=1;
			for(t=0;t<9;t++)
			{SBUF=xuehao[t];while(!TI);TI=0;} 
			SBUF=':';while(!TI);TI=0; 
			a=(byte)wendu/10;
			 b=(byte)wendu%10;
			 SBUF=0x30+a;while(!TI);TI=0;
			 SBUF=0x30+b;while(!TI);TI=0;
			 SBUF='C';while(!TI);TI=0;
			 SBUF=' ';while(!TI);TI=0;
			
			
			TR1=0;
		}
		while(!ck);
	}
}
/******************************************************
函式名:主函式
調  用:main()
參  數:無
返回值:無
結  果:0.5秒採集電壓,並顯示,可調設定溫度,按鍵傳送當前溫度給PC機
備  注:無
*******************************************************/
void main(void)
{
    byte temp;
    red=0;green=0;
	  l=10;
	  
    init();
     
     while(1)
    {
       if(flag1==1)
         { 
           flag1=0;
           result=samp();
					 jisuan(result); 
         }
		switch(flag2)
		{
			case 0:  display(T);break;
				        
			case 1:  displayH(sdH);
				         sdH=anjian(sdH);
				         break;
				
			case 2:  temp=sdL;
				     temp=anjian(temp);
					 if(temp>sdH)
					{
						displayL(temp);
						sdL=sdH;
					}									 
                     else  
					 {
					 displayL(temp);
					 sdL=temp;
					 }
				         
				         
				         break;
			}			
			
       jidianqi();
	     chuankou(T);
   
    }
}
/******************************************************
函式名:t0定時器中斷函式
參  數:無
返回值:無
結  果:0.5秒定時
備  注:無
*******************************************************/  
void t0() interrupt 1 
{  
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    l--;
    if(l==0) 
    {flag1=1;l=10;}
}


/******************************************************
函式名:外部中斷0中斷函式
參  數:無
返回值:無
結  果:模式選擇
備  注:無
*******************************************************/

void int00() interrupt 0 
{	 
	if(int0==0)
	{
		delay(30);
       if(int0==0)
		{  
				flag2++;
				if(flag2==3)
					flag2=0;
                                 
		}
    }
}

完整資源截圖:

 

 資源下載地址:https://download.csdn.net/download/qq_40707685/10764080