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

📄 jyzno1.c

📁 一个使用MSP430的项目例子
💻 C
📖 第 1 页 / 共 3 页
字号:

#include<msp430x44x.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//**************************
/*KEY*/
uchar	keyfuntask;
uchar	fkeyfun;
uchar	keyoktask;
uchar	fkeyok;
uchar	keyuptask;
uchar	fkeyup;
uchar	keydowntask;
uchar	fkeydown;
uchar	keylefttask;
uchar	fkeyleft;
//**************************
/*Timer*/
uchar	f_10ms;
uchar	f_10ms;		/*T0中断10ms到标志*/
uchar	f_20ms;		/*20ms按键判断标志*/
uchar	f_250ms;		/*250ms显示刷新标志*/
uchar	f_500ms;		/*500ms闪烁标志*/
uchar	f_5s;		/*1秒采样标志*/
uchar	f_20s;		/*20秒一个控制周期标志*/
#define	INT20MSCOUNT		2
uchar	cnt_20ms=INT20MSCOUNT;/*按键判断20ms*/
#define	INT250MSCOUNT		13
uchar	cnt_250ms=INT250MSCOUNT;/*按键判断20ms*/
#define	INT500MSCOUNT		2
uchar	cnt_500ms=INT500MSCOUNT;/*AD读温度显示500ms*/
#define	INT5SCOUNT	10
uchar	cnt_5s=INT5SCOUNT;/*2s*/
#define	INT20SCOUNT	4
uchar 	cnt_20s=INT20SCOUNT;/*定时20s计数器*/
#define	QDSJ	100		/*启动时间*/
#define	LJSJ	10		/*连击时间*/
uchar	keyupcount;	/*增加键计数器*/
uchar	keydowncount;	/*减少键计数器*/
//**********************************
/*LCD*/
const	uchar LCD_TAB1[15] = {0x7d,0x60,0x3e,0x7a,0x63,0x5B,0x5F,0x70,0x7F,0x7B,0x02,0x00,0x77,0x4f,0x1d};//第一行"0123456789-灭ABC"
const	uchar LCD_TAB2[12] = {0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE,0x40,0x00};//第二行"0123456789-灭"
//第一行lcdmem[i] 1 	2 	3 	4 	5 	6 	7
//第二行lcdmem[i] 15 	14 	13 	12 	11 	10 	9
#define LCD_P1	0x80
#define LCD_P2	0x01
//**********************************
//闪烁
uchar	blink_dat;
uchar	f_blink;
uchar	blink_address;
//当前模式记录0-7
uchar 	mode;
//功能键
uchar	fun_dat;
//线路号
uchar 	xlh[4]={0,0,0,0};//
uchar	xlh_cnt;
//杆号
uchar	ganh[3]={0,0,0};//注意!由于MEM地址的问题--杆号存储是反的,如:gan[0]存储的是显示值123的3
uchar	ganh_cnt;
//杆型
uchar	ganx=2;
//相别
uchar	xiangb=12;
//串号
uchar	chuanh[2]={1,1};//直杆01-02 耐张杆
uchar	chuanh_cnt;
//片号
uchar	pianh[2]={2,8};
uchar	pianh_cnt;
uchar	pian_num=28;//输入的片数
//测量
uint	timnew_dat;//本次的值
uint	timmin_dat;//
uint	ccr0_old;
uchar	lxf_mea;//连续测量标志
uchar	fcf_mea;//复测测量标志
uchar	f_cap;//捕获到上升沿1,没有0
uchar	lxmea_cnt;//连续测量计数器
uchar	fcmea_cnt;//复测测量计数器
uint	v_max;
#define	V_OK	1
uchar	warn_f;
uchar	voltage[30][3];//存放30个浮点数对应的BCD码
uchar	fc_voltage[3][3];//存放3个复测浮点数对应的BCD码
//uchar	f_vok[30];//对应连续测量的30个电压是否正常存储---有电压值不需要这个了
//xlh[4] ganh[3] ganx xiangb chuanh[2] pian_num voltage[30,3] f_vok[30]---5+3+1+1+2+1+90+30=133字节
//复测
uchar	fc_pianh;//复测的片号		
//flash
uint	adr_start;
uchar	cp_no1;//为了初始化第一次捕获值!cp_no1=1 第一次捕获  cp_no1=0 连续捕获
uchar 	cnt_70ms;//70ms控制无捕获处理
//UART
uint  	RecData;
uint  	RecData;
uchar	f_232;
#define	cmd_len	96	//长度暂定为96
//63+数据包字节数(16进制单字节)+数据包+校验字节(单字节求和校验)+0D+0A
//1+1+1+90+1+2=96
uchar	cmdok;//命令正常接收=1,无=0
uchar	rxddat[cmd_len];//接收组
uchar	rxdbuf[cmd_len];//缓存组
uchar	rxddat_cnt=0;//接收数据的数组存放位置
uchar	rxdbuf_cnt=0;//接收数据的数组存放位置
uchar 	*rxddat_p;
uchar 	*rxdbuf_p;
uint	bj_dat[30];//30个,28则最后添0
uint	bj_dat1;
//**********************************
void	lcd_disinit(void);
void	lcd_off(void);
void	key_mainloop(void);
void	taskfun_mainloop(void);
void	taskok_mainloop(void);
void	taskleft_mainloop(void);
void	taskup_mainloop(void);
void	taskdown_mainloop(void);
void 	main_init(void);
void	tim0_mainloop(void);
void	lcd_mainloop(void);
void	lcd_blink(void);
void 	delay(uint m);
void	cap_mainloop(void);
void	lxmea_mainloop(void);//连续测量循环
void	fcmea_mainloop(void);//复测测量循环
void	meadat_cl(void);
void	lxsave_dat(void);//存入flash
void	fcsave_dat(void);
void 	read_Flash(uchar* addr,uchar * rbuf,uchar len);
void 	FlashErase(uint *addr);
void 	FlashWriteUchar(uchar *addr, uchar data);//向flash写一个uchar
void 	FlashWriteInt(uint *addr, uint data);//向flash写一个uint
void	lcdupdate_mainloop(void);//LCD更新半秒 并判断是否要报警
void	send16(uint txdat);
void	send8(uchar txdat);
void	uart_mainloop();
void	buz(uchar buz_cnt);
void	uartcmd_cl(uchar cmd_no);
//**********************************
void main(void)
{
	uchar i;
	WDTCTL=WDTPW+WDTHOLD;           //关闭看门狗定时器
	main_init();	
	_EINT();
	lcd_disinit();
    P3OUT &= ~BIT0;//灭
    P4OUT &= ~BIT2;	
	delay(50000);
	for(i=0;i<7;i++)
	{
		delay(5000);
		if(i%2==0) 
		{
			P4OUT ^= BIT2;//BUZ blink	
		}	
		P3OUT ^= BIT0;//LED blink
		send8(i);
	}
	delay(50000);
	delay(50000);
    delay(50000);
    P3OUT &= ~BIT0;//灭
    P4OUT &= ~BIT2;
    fkeyfun=1;//默认按下功能键
	while(1)
	{
		tim0_mainloop();
		key_mainloop();
		taskfun_mainloop();
		taskok_mainloop();
		taskleft_mainloop();
		taskup_mainloop();
		taskdown_mainloop();
		cap_mainloop();
		lcdupdate_mainloop();
		lxmea_mainloop();
		fcmea_mainloop();
		lcd_blink();
		uart_mainloop();
	}
}
//***************************
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
	uchar	temp;
	if(!cmdok)
	{
		while (!(IFG1 & UTXIFG0));            // USART0 TX buffer ready?
		temp=RXBUF0;
		cnt_250ms=INT250MSCOUNT;
		*rxddat_p++ = temp;
		rxddat_cnt++;
		if((temp==0x0a)&&(*(rxddat_p-2)==0x0d))//结束符
		{
			cmdok=1;//正常接收到命令标志变量
		}
		else if(rxddat_cnt==cmd_len)//最长数据已收完未找到0d0a,则数据超出长度--清零数据指针
		{
			rxddat_cnt=0;rxddat_p=rxddat;
		}
	}
}
//******************************
void	uart_mainloop(void)
{
	uchar	i;
	if(f_232==0) return;
	if(f_250ms==1)
	{	
		f_250ms=0;
		rxddat_cnt=0;
		rxddat_p=rxddat;
	}
	if(cmdok==0)return;
	rxddat_p=rxddat;
	rxdbuf_p=rxdbuf;
	for(i=0;i<5;i++)//数据清0
	{
		*rxdbuf_p=0;
		rxdbuf_p++;
	}		
	rxdbuf_p=rxdbuf;
	for(i=0;i<rxddat_cnt-2;i++)//数据转存--不需要再存入0a和0d了
	{
		*rxdbuf_p++=*rxddat_p++;
	}
	rxdbuf_cnt=rxddat_cnt-3;//得到命令字符长度,去掉0a0d和加的1
	rxddat_cnt=0;
	rxdbuf_p=rxdbuf;
	rxddat_p=rxddat;
	cmdok=0;//允许下一组命令接收

	switch(rxdbuf[0])
	{
		case 0x61:	buz(1);uartcmd_cl(1);
					break;	
		case 0x62:	buz(2);uartcmd_cl(2);
					break;	
		case 0x63:	buz(3);uartcmd_cl(3);
					break;			
		default:	break;
	}	
}
void	uartcmd_cl(uchar cmd_no)
{
	uchar	adr_tmp[2];
	uint	tx_cnt;
	uchar	jy_dat;
	uint	i;
	uchar	j;
	uchar 	* addr;
	uint	* addr1;	
	uchar	temp;
	uint	temp1;
	switch(cmd_no)
		{
			case 1:	//回送数据1+2+28*3+1+2=
					//读info 算长度	求校验和 发送
                    //61+数据包字节数(16进制双字节)+0D+0A
                    //数据包+校验字节(单字节求和校验)+0D+0A
					read_Flash((uchar*)0x1000,adr_tmp,2);
					if(adr_tmp[1]==0xff){buz(3);send8(0x65);send16(0x0d0a);return;}//存储区为空,报警1+3退出
					adr_tmp[1]-=0x40;
					tx_cnt=adr_tmp[1]*256+adr_tmp[0]-1;//字节数
    				_DINT();					
					send8(0x61);
					send16(tx_cnt);
					send16(0x0d0a);
					delay(1000);
					jy_dat=0;
    				addr=(uchar *)0x4000;
					for(i=0;i<tx_cnt;i++)
					{
						temp=*(addr++);
						send8(temp);
						jy_dat+=temp; 
					}
					send8(jy_dat);
					send16(0x0d0a);
					_EINT();					
					break;	
			case 2:	//flash清除0x1000 0x4000-0xefff
					FlashErase((uint*)0x1000);
					//FlashWriteUchar((uchar*)0xeffe,fc_pianh);
					addr=(uchar *)0x4000;
					for(i=0;i<88;i++)
					{
						FlashErase((uint*)addr);
						addr+=512;
					}
					send8(0x62);
					send16(0x0d0a);
					break;	
			case 3:	//接收比较表---转换为uint比较值,存入infoA --0X1080
//63+数据包字节数(16进制单字节)+数据包+校验字节(单字节求和校验)+0D+0A
//比较表数据包格式:片数(2字节)+电压值(3字节*片数)
//63 04 01 02 01 03 6e 0d 0a
					//先校验再存入!
					jy_dat=0x63;
					rxdbuf_p++;
					if(*rxdbuf_p==0){buz(4);send8(0x64);send16(0x0d0a);return;}
					jy_dat+=*rxdbuf_p;
					rxdbuf_p++;
					for(j=0;j<rxdbuf[1];j++)
					{
						jy_dat+=*rxdbuf_p;
						rxdbuf_p++;
					}
					if(jy_dat!=*rxdbuf_p){buz(4);send8(0x64);send16(0x0d0a);return;}
					FlashErase((uint*)0x1080);
					addr1=(uint *)0x1080;
					rxdbuf_p=rxdbuf+3;
					for(j=0;j<rxdbuf[2];j++)//片数
					{
						temp1=(*rxdbuf_p)*100;	rxdbuf_p++;
 						temp1+=(*rxdbuf_p)*10;	rxdbuf_p++;
 						temp1+=*rxdbuf_p;		rxdbuf_p++;
 						FlashWriteInt(addr1, temp1);	
 						addr1++;
					}
					send8(0x63);
					send16(0x0d0a);					
					break;	
			default:	
					break;						
		}				
}
//******************************
void	buz(uchar buz_cnt)
{
	uchar	i;
	for(i=0;i<buz_cnt*2;i++)
	{
		delay(10000);
		P4OUT ^= BIT2;//BUZ blink	
	}		
    P4OUT &= ~BIT2;	
}
//******************************
void	lcdupdate_mainloop(void)
{
	uint temp;
	if((lxf_mea==1||fcf_mea==1) && f_250ms==1)
	{
		f_250ms=0;
		if(warn_f==1){P4OUT ^= BIT2;P3OUT ^= BIT0;LCDMEM[9] =LCD_TAB2[1];}//LED BUZ blink DISP 1
		else {LCDMEM[9] =LCD_TAB2[0];P3OUT &= ~BIT0;P4OUT &= ~BIT2;}
		//v_max-->lcd
		temp = v_max;//浮点小数化为10倍整数
		if(temp>9999){temp=9999;}
		if((temp/1000)==0)
			{LCDMEM[14] =0x0;}
		else
			{LCDMEM[14] =LCD_TAB2[temp/1000];}//00.0    0
		temp=temp%1000;
		LCDMEM[13] =LCD_TAB2[temp/100]+LCD_P2;
		temp=temp%100;
		LCDMEM[12] =LCD_TAB2[temp/10];
		temp=temp%10;
		LCDMEM[11] =LCD_TAB2[temp];		
	}	
}
//*****************************
void	cap_mainloop(void)//捕获循环
{
	if((lxf_mea==1||fcf_mea==1)&&f_cap==1)
	{
		f_cap=0;
		timmin_dat=((ulong)timnew_dat+(ulong)timmin_dat)/2;//***********************************
		meadat_cl();//***********************************
//		if(timmin_dat>timnew_dat)
//		{
//			timmin_dat=timnew_dat;
//			meadat_cl();			
//		}
	}
}
//**********************
//完成timmax_dat时间到电压v_max的转换,判断是否正确,并输出显示
void	meadat_cl(void)
{
	//T->V转换
	v_max = 100000/timmin_dat;
	if(v_max<bj_dat1){warn_f=1;}
	else{warn_f=0;}
}
//*****************************
//
void	fcmea_mainloop(void)
{
	uint	temp;
	if(fcf_mea==0||f_5s==0) return;
	TACCTL0 &= ~CM_3; // 禁止捕获
	TACTL &= ~MC_3; // 停止定时器---将MC0,MC1置成0
	f_5s=0;	fcf_mea=0;
	timmin_dat=65535;
	warn_f=0;
	temp = v_max;
	if(temp>9999)temp=9999;
	fc_voltage[fcmea_cnt-1][0] =temp/1000;//00.0 
	temp=temp%1000;
	fc_voltage[fcmea_cnt-1][1] =temp/100;
	temp=temp%100;
	fc_voltage[fcmea_cnt-1][2] =temp/10;
    P4OUT |= BIT2;
    delay(50000);	
    P4OUT &= ~BIT2;
    if(fcmea_cnt==3){fcsave_dat();fkeyok=1;fun_dat=7;mode=0;}

}
//*****************************
//在全部测完之后,将各个最大值浮点数转换成BCD,存储到flash
void	lxmea_mainloop(void)//连续测量循环
{
	uint	temp;
	if(lxf_mea==0||f_5s==0) return;
	f_5s=0;
	timmin_dat=65535;warn_f=0;	
	temp = v_max;
	if(temp>9999)temp=9999;
	voltage[lxmea_cnt-1][0] =temp/1000;//00.0 
	temp=temp%1000;
	voltage[lxmea_cnt-1][1] =temp/100;
	temp=temp%100;
	voltage[lxmea_cnt-1][2] =temp/10;		
	if(++lxmea_cnt>pian_num)
	{
		lxf_mea=0;warn_f=0;
		P3OUT &= ~BIT0;//灭
    	P4OUT &= ~BIT2;	
		TACCTL0 &= ~CM_3; // 禁止捕获
		TACTL &= ~MC_3; // 停止定时器---将MC0,MC1置成0		
		lxsave_dat();//存入flash
	    fkeyok=1;mode=5;    	
		buz(1);
		return;
	}
	bj_dat1=bj_dat[lxmea_cnt-1];	
	buz(1);	
	LCDMEM[6] =LCD_TAB1[lxmea_cnt/10];
	LCDMEM[7] =LCD_TAB1[lxmea_cnt%10];
}

//*****************
//1、infoa(0x1000)读address
//2、
void	lxsave_dat(void)//存入flash
{
	uchar	adr_tmp[2];
	uchar	i,j;
	//	FlashErase((uint*)0x1000);	
	read_Flash((uchar*)0x1000,adr_tmp,2);
	adr_start = adr_tmp[1]*256+adr_tmp[0];
	if(adr_start==0xffff){adr_start=0x4000;}//起始地址
	for(i=0;i<4;i++)
	{

⌨️ 快捷键说明

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