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

📄 main.c

📁 MSP430单片机C语言应用程序设计实例精讲(秦龙编著)
💻 C
字号:
#include "I2C.h"
#include "Led.h"

#define N     624
int nInputCount;
int nIn_Flag;
int nTimeCount;
int nWrite_Flag;

unsigned char seg[]={0x3f,0x06,0x5b,0x4f, /* 0 1 2 3*/
 0x66,0x6d,0x7d,0x07, /* 4 5 6 7 */
 0x7f,0x6f,0x77,0x7c, /* 8 9 A B */
 0x39,0x5e,0x79,0x71  /* C D E F */
};


void Init_TimerB(void);

void main(void)
{
	unsigned char nValue;
	char nTemp0;
	char nTemp1;
	char nTemp2;
	char nTemp3;
	char nTemp4;
	char nTemp5;
	int nSpeed;
	int nSpeed1;
	int nSpeed2;
	int nSpeed3;

	// 关闭看门狗
	WDTCTL = WDTPW + WDTHOLD;   
	//关闭中断
    _DINT();

	//初始化时钟
	Init_CLK();
	//端口初始化
	Init_Port();
I2C_Initial();
	nInputCount = 0;
	nIn_Flag = 0;
    nTimeCount = 0;
	nWrite_Flag = 0;
	nTemp0 = 0;
	nTemp1 = 0;
	nTemp2 = 0;
	nTemp3 = 0;
	nTemp4 = 0;
	nTemp5 = 0;

	//打开中断
	_EINT(); 			
    
	//读出初始的里程数
    ReadRandom(0,&nTemp0);
	if(nTemp0 ==  0xff) nTemp0 = 0;
	ReadRandom(1,&nTemp1);
	if(nTemp1 ==  0xff) nTemp1 = 0;
	ReadRandom(2,&nTemp2);
	if(nTemp2 ==  0xff) nTemp2 = 0;
	ReadRandom(3,&nTemp3);
	if(nTemp3 ==  0xff) nTemp3 = 0;
	ReadRandom(4,&nTemp4);
	if(nTemp4 ==  0xff) nTemp4 = 0;
	ReadRandom(5,&nTemp5);
	if(nTemp5 ==  0xff) nTemp5 = 0;
	//显示初始里程数据
	//清除锁存信号
	STCLK_Lo();
	DataOut(seg[nTemp5]);
	DataOut(seg[nTemp4]);
	DataOut(seg[nTemp3]);
	DataOut(seg[nTemp2]);
	DataOut(seg[nTemp1]);
	DataOut(seg[nTemp0]);
	//给锁存信号,显示上面的6位数据
	STCLK_Hi();
	for(;;)
	{
		if(nIn_Flag == 1)
		{
			nIn_Flag = 0;
			//等待时间计数器设置完
			while(1)
			{
				if(nWrite_Flag == 0)
				{
					break;
				}
			}

			//计算速度
			nSpeed = (int)(1 * 3600 / nTimeCount);
			nTimeCount = 0;
			nSpeed3 = (int)(nSpeed / 100);
			nSpeed2 = (int)((nSpeed - 100 * nSpeed3) / 10);
			nSpeed1 = nSpeed - 100 * nSpeed3 - 10 * nSpeed2;
			//显示速度
			//清除锁存信号
	        STCLK_Lo1();
	        DataOut1(seg[nSpeed3]);
	        DataOut1(seg[nSpeed2]);
	        DataOut1(seg[nSpeed1]);
	        //给锁存信号,显示上面的3位数据
	        STCLK_Hi1();

			//处理里程参数
			nTemp0 += 1;
			if(nTemp0 >= 10)
			{
				nTemp0 = 0;
				nTemp1 += 1;
				if(nTemp1 >= 10)
				{
					nTemp1 = 0;
					nTemp2 += 1;
					if(nTemp2 >= 10)
					{
						nTemp2 = 0;
						nTemp3 += 1;
						if(nTemp3 >= 10)
						{
							nTemp3 = 0;
							nTemp4 += 1;
							if(nTemp4 >= 10)
							{
								nTemp4 = 0;
								nTemp5 += 1;
								if(nTemp5 >= 10)
								{
									nTemp0 = 0;
									nTemp1 = 0;
									nTemp2 = 0;
									nTemp3 = 0;
									nTemp4 = 0;
									nTemp5 = 0;
								}//if(nTemp5 >= 10)
							}//if(nTemp4 >= 10)
						}//if(nTemp3 >= 10)
					}//if(nTemp2 >= 10)
				}//if(nTemp1 >= 10)
			}//if(nTemp0 >= 10)
			//显示里程数据
            //清除锁存信号
	        STCLK_Lo();
	        DataOut(seg[nTemp5]);
	        DataOut(seg[nTemp4]);
	        DataOut(seg[nTemp3]);
	        DataOut(seg[nTemp2]);
	        DataOut(seg[nTemp1]);
	        DataOut(seg[nTemp0]);
	        //给锁存信号,显示上面的6位数据
	        STCLK_Hi();
			//将里程数据写入EEPROM
			WriteSingleByte(0,nTemp0);
			WriteSingleByte(1,nTemp1);
			WriteSingleByte(2,nTemp2);
			WriteSingleByte(3,nTemp3);
			WriteSingleByte(4,nTemp4);
			WriteSingleByte(5,nTemp5);			
		}
	}

	return;
}

void Init_TimerB(void)
{
	// 选择ACLK,清除TAR
    TBCTL = TBSSEL0 + TBCLR;
	// TBCCR0 中断允许
    TBCCTL0 = CCIE;         
	// 时间间隔为 1 s
    TBCCR0 = 32768;			  
    // 增记数模式
    TBCTL |= MC0; 
	return;
}
///////////////////////////////////////
// 处理来自端口 P2.0 的中断
interrupt [PORT1_VECTOR] void INPUT_ISR(void)
{
    if(P2IFG & BIT0)
    {
		//增加脉冲计数器
    	nInputCount += 1;
		if(nInputCount >= 8 * N)
		{
			//行使到一公里
			nInputCount = 0;
			//设置标志
            nIn_Flag = 1;
		}
		// 清除中断标志位
    	P2IFG &= ~(BIT0);	
    }
}
//定时器B的中断处理
interrupt [TIMERB0_VECTOR] void TimerB_ISR(void)
{
	//设置写标志
	nWrite_Flag = 1;
	//秒记数器加1
	nTimeCount += 1;
	//解除写标志
	nWrite_Flag = 0;
}

⌨️ 快捷键说明

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