⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 section3.c

📁 msp430单片机基于温度采集报警系统的程序设计
💻 C
字号:
#include <MSP430X14X.h>
#include "alarm.h"

#define AT_DATA1   0xef00
#define AT_DATA2   0xf000
#define AT_DATA3   0xf100
#define AT_DATA4   0xf200

// 全局变量
int FLAG_PORT;
int PORT_INPUT;
int PORT_count;
int nADC_Flag;
int nADC_Count;
int ADC_BUF_Temp[10];
int ADC_BUF[10];
int UP1;// 上门限整数部分
int UP2;// 上门限小数部分
int DOWN1; // 下门限整数部分
int DOWN2; // 下门限小数部分
void main(void)
{
    int nTemp;
    int *pFlash;
    int nRes;
    int nCount;
    char chrTemp[6];
    float fTemp;
    
    int m_up1;
    int m_up2;
    int m_down1;
    int m_down2;
    char nTemp1;
    char nTemp2;
    char nTemp3;
    
    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗
    
    _DINT();			// 关闭中断
    
    // 初始化变量
    FLAG_PORT = 0;
    PORT_INPUT = 0;
    PORT_count = 0;
    nADC_Flag = 0;
    nADC_Count = 0;
    nRes = 1;
    // 初始化
    Init_Clk();
    Init_ADC();
    Init_TimerA();
    Init_INPUTPort();
    Init_TimerB();

    Init_DispPort();
    Init_AlarmPort();

    _EINT(); 			// 打开中断
    //读取FLASH里面的内容
    pFlash= (int*)(AT_DATA1);
    UP1 = *pFlash;
    if(UP1 == 0X00FF)
    {
    	nRes = 0;
    }
	else
	{
		UP1 *= 8;
	}
    pFlash= (int*)(AT_DATA2);
    UP2 = *pFlash;
    if(UP2 == 0X00FF)
    {
    	nRes = 0;
    }
	else
	{
		UP1 += UP2;
	}

    pFlash= (int*)(AT_DATA3);
    DOWN1 = *pFlash;
    if(DOWN1 == 0X00FF)
    {
    	nRes = 0;
    }
	else
	{
        DOWN1 *= 8;
	}
    pFlash= (int*)(AT_DATA4);
    DOWN2 = *pFlash;
    if(DOWN2 == 0X00FF)
    {
    	nRes = 0;
    }
	else
	{
        DOWN1 += DOWN2;
	}
    
    if(nRes == 0)
    {
    	nCount = 0;
    	// 需要读取4个数据
    	for(;;) // 等待配置数据
    	{
    	    
    	    if(FLAG_PORT == 1)
    	    {
				switch(nCount)
				{
				case 0:
					{
						FLASH_ww(AT_DATA1,PORT_INPUT)
						break;
					}
				case 1:
					{
						FLASH_ww(AT_DATA2,PORT_INPUT)
						break;
					}
				case 2:
					{
						FLASH_ww(AT_DATA3,PORT_INPUT)
						break;
					}
				case 3:
					{
						FLASH_ww(AT_DATA4,PORT_INPUT)
						break;
					}
				default:break;
				}
    	    	
    	    	FLAG_PORT = 0;
    	    	chrTemp[nCount] = PORT_INPUT;

				nCount += 1;
				if(nCount >= 4) 
				{
					UP1 = chrTemp[0] * 8 + chrTemp[1];
    
                    DOWN1 = chrTemp[2] * 8 + chrTemp[3];
					break;//数据配置完毕
				}
    	    }
    	    
    	}
    }
    
    
    for(;;)
    {
    	if(nADC_Flag == 1)
    	{
    	    nTemp = ADC_BUF_Temp[0];
    	    nADC_Flag = 0;
    	    // 这里只是简单的化成整数处理,就是乘以100
    	    nTemp = 16434 - 29 * nTemp;
    	    
    	    nTemp = (int)((nTemp / 100);//将结果除以100
    	    nTemp1 = (int)(nTemp / 100);//最高位
    	    nTemp2 = (nTemp - nTemp1 * 100) / 10;// 十位
    	    nTemp3 = (nTemp - nTemp2 * 10 - nTemp1 * 100);//个位
    	    
    	    // 这里只是简单的比较整数部分
    	    if((nTemp > UP1) || (nTemp < DOWN1))
    	    {
    	    	// 报警
    	    	Ring();
    	    }
    	    else
    	    {
    	    	// 显示
    	    	Display(nTemp2,nTemp3,0);
    	    }
    	
    	}
    }

}

//////////////////////////////////////////////
// 定时器中断,完成 ADC 转换
interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
{
    int results;
    
    ADC12CTL0 &= ~ENC;		    // 关闭转换
          	
    results = ADC12MEM0;	    // 读出转换结果                     
    ADC_BUF[nADC_Count] = results;
            
    nADC_Count += 1;     
    if(nADC_Count == 10)
    {
         nADC_Flag = 1;            //设置标志
         nADC_Count = 0; 
         for(int i = 0;i < 10;i++) ADC_BUF_Temp[i] = ADC_BUF[i];      
    }
                
    ADC12CTL0 |= ENC + ADC12SC;	   // 开启转换
}
///////////////////////////////////////
// 处理来自端口 1 的中断
interrupt [PORT1_VECTOR] void PORT_ISR(void)
{
    Delay_us(100);//消除延时抖动
    if(P1IFG & BIT0) // P1.0列线上有按键输入
    {
    	P1IFG &= ~(BIT4);	// 清除中断标志位
    	Delay_ms(1);
    	for(;;)
    	{
    	    if((P1IFG & BIT4) == 0) break;
    	}
    	// 获得输入值
    	switch(PORT_count)
    	{
            case 0:
            {
            	PORT_INPUT = 9;
            	PORT_count = 1;
            	break;
            }
            case:1
            {
            	PORT_INPUT = 7;
            	PORT_count = 2;
            	break;
            }
            case 2:
            {
            	PORT_INPUT = 5;
            	PORT_count = 3;
            	break;
            }
            case 3:
            {
            	PORT_INPUT = 3;
            	PORT_count = 4;
            	break;
            }
            case 4:
            {
            	PORT_INPUT = 1;
            	PORT_count = 0;
            	break;
            }
            default:break;
    	}
    	FLAG_PORT = 1;
    }
    
    if(P1IFG & BIT1)//// P1.1列线上有按键输入
    {
    	P1IFG &= ~(BIT5);	// 清除中断标志位
    	Delay_ms(1);
    	for(;;)
    	{
    	    if((P1IFG & BIT5) == 0) break;
    	}
    	// 获得输入值
    	switch(PORT_count)
    	{
            case 0:
            {
            	PORT_INPUT = 0;
            	PORT_count = 1;
            	break;
            }
            case:1
            {
            	PORT_INPUT = 8;
            	PORT_count = 2;
            	break;
            }
            case 2:
            {
            	PORT_INPUT = 6;
            	PORT_count = 3;
            	break;
            }
            case 3:
            {
            	PORT_INPUT = 4;
            	PORT_count = 4;
            	break;
            }
            case 4:
            {
            	PORT_INPUT = 2;
            	PORT_count = 0;
            	break;
            }
            default:break;
    	}
    	FLAG_PORT = 1;
    }
}
interrupt [TIMERB0_VECTOR] void TimerB_ISR(void)
{
    // 设置相应的行线为低电平
    switch(PORT_count)
    {
        case 0:
        {
            // 设置为高电平
            P1OUT |= BIT3;
            P1OUT |= BIT4;
            P1OUT |= BIT5;
            P1OUT |= BIT6;
            // 设置为低电平
            P1OUT &= ~(BIT2);            
            break;
        }
        case:1
        {
            // 设置为高电平
            P1OUT |= BIT2;
            P1OUT |= BIT4;
            P1OUT |= BIT5;
            P1OUT |= BIT6;
            // 设置为低电平
            P1OUT &= ~(BIT3); 
            break;
        }
        case 2:
        {
            // 设置为高电平
            P1OUT |= BIT3;
            P1OUT |= BIT2;
            P1OUT |= BIT5;
            P1OUT |= BIT6;
            // 设置为低电平
            P1OUT &= ~(BIT4); 
            break;
        }
        case 3:
        {
            // 设置为高电平
            P1OUT |= BIT3;
            P1OUT |= BIT4;
            P1OUT |= BIT2;
            P1OUT |= BIT6;
            // 设置为低电平
            P1OUT &= ~(BIT5); 
            break;
        }
        case 4:
        {
            // 设置为高电平
            P1OUT |= BIT3;
            P1OUT |= BIT4;
            P1OUT |= BIT5;
            P1OUT |= BIT2;
            // 设置为低电平
            P1OUT &= ~(BIT6); 
            break;
        }
            default:break;
    }
          
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -