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

📄 msp430ywqzkok.c

📁 tiMSP430F147体能监测设备源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <msp430x14x.h>
#define uchar unsigned char
#define uint  unsigned int
#define SDA430 0X04   //SDA为P3.2
#define SCL430 0X08   //SCL为P3.3

#define ICID_W 0xa0 /*写卡器件地址*/
#define ICID_R 0xa1 /*读卡器件地址 */
#define IC_ID_W 0xa2 /*写器件地址*/
#define IC_ID_R 0xa3 /*读器件地址 */
////////////////////////////////////////
#define SG_save0 0x02
#define SG_save1 0x03
#define TZ_save0 0x04
#define TZ_save1 0x05
#define SG_flag  0x60
#define TZ_flag  0x61
#define TZstart_data 0x0d /*大于此值开始测试  d0*/
#define NUM0 0x00
#define NUM1 0x01
#define PASS0 0x7c
#define PASS1 0x7d
#define SEX 0x7e
#define AGE 0x7f	/*内部资源*/
//#define MAX197 XBYTE[0x4000]  /* 定义MAX197端口地址 */
////////////////////////////////////////
unsigned long get100da(void);
uint BCD_HEX(void);
void HEX_BCD(unsigned long dd);					//16进制数转换10进制数
void delay(uchar time);							//延时
void init(void);								//初始化
void sound_s(void);								//声音
uchar IC_read(uchar address);  					//从24c02的地址address中读取一个字节数据
void IC_write(uchar address,uchar info);		//向24c02的address地址中写入一字节数据info
uchar IC_R(uchar address);  					//从24c02的地址address中读取一个字节数据
void IC_W(uchar address,uchar info);		//向24c02的address地址中写入一字节数据info
void delay1(uchar x);							//延时2402				
void nop();										//延时	
void start();									//24c02起始位
void stop();									//24c02停止位
void writex(uchar j);							        //写卡
uchar readx();									//读卡
void clock();									//24c02 时钟
void disp_lcd(uchar d1,uchar d2,uchar d3,uchar d4,uchar dot);                   //显示 电源 数据 地 时钟
uint getdata(void);
void get_data(void);
void data_clear(void);
void HEX_BCD4(uint dd);
//sbit data_selet  = P3^1;						        //数据采集
//sbit sound       = P1^4;                  //蜂鸣器                                              
//sbit scl         = P1^7;
//sbit sda         = P1^6;
//sbit card_sw     = P1^5;
//sbit incard_led  = P3^2;						       //请插卡
//sbit prep_led    = P3^3;						       //准备测试
//sbit test_led    = P3^4;						       //测试中
//sbit testend_led = P3^5;						       //测试结束
//sbit sg_start	 = P3^0;
//sbit   clk	 = P1^0;                  //液晶时钟
//sbit   dat	 = P1^1;                  //液晶数据输入

uchar disp1,disp2,disp3,disp4,subf,repeatestf,testnum;		               //显示缓存

const uchar ledtab[15] = {0x88,0xBB,0xC1,0x91,0xB2,0x94,0x84,0xB9,0x80,0x90,0xA0,0xA8,0xC4,0xf7,0xff};
//                       //0    1    2     3    4   5     6    7    8    9    A    N    E   -
const uchar leddottab[11]={0x08,0x3b,0x41,0x11,0x32,0x14,0x04,0x39,0x00,0x10,0x7f};
//                        0    1   2    3    4    5    6    7    8    9     
uint dis[12]; //= 0;
uchar IC_error; //
uchar dispf;	//误卡判别位
uchar BCD[8];									
uchar comdata[3];
uchar al;
uint data_int;
uint tljish;
/*bit  addnumbf;*/	

uchar temp;           //临时存储器
uint i;
uint b;
uint stand;
uint prenum;
uint m;
uint num= 200; 
unsigned long tz;

void msp430csh(void)              //MSP430初始化
{       uint i;
	WDTCTL=WDTPW+WDTHOLD;     //口令及关闭看门狗,测试用,正常时不要此句
	BCSCTL1|=XTS+XT2OFF;      //LFXT1工作于高频
	BCSCTL2|=SELM1+SELM0;     //MCLK的时钟源为SELS
	P1OUT=0X01;               //P1.0输出高电平
	P1DIR=0X01;               //P1口均为输入口,P1.0为输出口
	P1OUT=0X00;
	P1OUT=0X01;               //P1.0输出高电平
	P2OUT=0XFF;               //P2口预置为0XFF
	P2DIR=0X3C;               //P2口P2.2,P2.3,P2.4,P2.5为输出口
	P3OUT=0XFF;               //P3口预置为0XFF
	P3DIR=0X5D;               //P3口P3.6,P3.4,P3.3,P3.2,P3.0为输出口
	P4OUT=0X7F;               //P4口预置为0X7F,P4.7控制485口为接收状态
	P4DIR=0XDF;
	P5OUT=0XFF;               //P5口预置为0XFF
	P5DIR=0XFF;               //P5口
	P6DIR=0X00;               //P6口均为输入口
	
	IFG1 &= ~OFIFG;            // Clear OSCFault flag
	
	do 
        {
        IFG1 &= ~OFIFG;            // Clear OSCFault flag
        for(i = 0xFF; i > 0; i--); // Time for flag to set
        }
       while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
	UCTL0=CHAR;                //设置为8位数据位,一个停止位,无校验
        UTCTL0 = SSEL0;            // UCLK = ACLK
        UBR00 = 0xA0;              // 3.58Mhz/9600 - 372
        UBR10 = 0x01;             //
        UMCTL0 = 0x6B;            
        ME1 |= UTXE0 + URXE0;     // Enable USART0 TXD/RXD
        /*IE1 |= URXIE0;*/        // Enable USART0 RX interrupt
        P3SEL |= 0xF0;            // P3.4,5 = USART0 TXD/RXD
       
        UCTL1=CHAR;               //设置串口1为8位数据位,一个停止位,无校验
	UTCTL1 = SSEL0;           // UCLK = ACLK
        UBR01 = 0xA0;             // 3.58Mhz/9600 - 372
        UBR11 = 0x01;             //
        UMCTL1 = 0x6B;
        ME1 |= UTXE1 + URXE1;     // Enable USART1 TXD/RXD
        /*IE1 |= URXIE1;*/        // Enable USART1 RX interrupt
        
        
        P3SEL|=0XF0;              //P3.4.5.6.7为USART0和USART1
        
        
        P6SEL=0X80;               //选择A7为转换通道
        /*ADC12CTL0 = ADC12ON+SHT0_15+REFON+REF2_5V+MSC;*/  //Turn on and set up ADC12,N=15
        ADC12CTL0 = ADC12ON+SHT0_8+REFON+REF2_5V;
        ADC12CTL1 = SHP+CONSEQ_0;   // Use sampling timer,ADCLOCK5分频,单通道单次
        ADC12MCTL0|= SREF_1+INCH_7; // Vr+=Vref+ 用第七通道
        /*ADC12IE = 0x01;*/         // Enable ADC12IFG.0
        ADC12CTL0 |= ENC;           // Enable conversions
        /*_EINT();*/                // Enable interrupts
        for (i=0;i<0x3600;i++)      //延时,使基准电压稳定            
        {
        }
        ADC12CTL0 |= ADC12SC;       // Start conversion
}

void main(void)
{             
    uchar a,S,dat1,dat2;
    /*bit sf= 0;*/
    uchar FLAG=0;                  //定义一个类市位的字节
    FLAG&=~BIT0;                  //FLAG.0=0,等同于bit sf= 0
 
    /*sound=0;*/
    P5OUT&=~BIT7;                //关闭蜂鸣器
    disp_lcd(0x8,0x8,0x08,0x8,0);
    delay(255);
    delay(255);
    delay(255);
    delay(255);
    delay(255);
    delay(255);
    for(b=0;b<300;b++);
    tz = tz+get100da();
    data_int = tz/300;
    disp_lcd(0x0d,0x0d,0x0d,0x0d,0);	//disp:- - - -
    init();
    /*incard_led = 0;*/
    P5OUT|=BIT0;         
    while(1)
	{
		//if(card_sw == 0)
		if((P1IN&BIT2)== 0)    //P1IN&BIT2为card_sw
		{
			IC_error =0x00;
			a = IC_read(PASS0);
			i = a;
			i = i<<8;
			a = IC_read(PASS1);
			i = i+a;
			if ((IC_error == 0xff)||(i!=0x4a48))		//判卡:1。插反  2。误卡
			{	
loop:			//while(card_sw == 0)
                        while((P1IN&BIT2)== 0)
				{
				 disp_lcd(0x0d,0x0c,0x0c,0x0d,0);
				 //EA = 0;
				 _DINT();
				 sound_s();
				 //EA = 1;
				 _EINT();
				 delay(100);
				}
				 delay(15);
				 //if(card_sw == 0)
				 if((P1IN&BIT2)== 0)
					goto loop;
				 delay(255);
				 delay(255);
				 //while(card_sw == 0)
				 while((P1IN&BIT2)== 0)
				 {
					a = IC_R(0x08);
					b = IC_R(0x07);
					b=((b<<8)+a);
					HEX_BCD(b);
					disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],3);//显示编号
					a = 0;
					m = 0;
					S = 0;
					while(1)
					{
			nlop:		
						switch(S)
						{
							case 0:
								disp_lcd(BCD[4],BCD[5],BCD[6],0x0e,3);
								delay(250);
								break;
							case 1:
								disp_lcd(BCD[4],BCD[5],0x0a,BCD[7],3);
								delay(250);
								break;
							case 2:
								disp_lcd(BCD[4],0x0e,BCD[6],BCD[7],3);
								delay(250);
								break;								
							case 3:	
								disp_lcd(0x0e,BCD[5],BCD[6],BCD[7],3);
								delay(250);
								break;
						}
						disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],3);
						delay(250);
						delay(250);
						//while(card_sw == 1)
						while((P1IN&BIT2)!=0)
						{
							delay(50);
							//if(card_sw == 0)
							if((P1IN&BIT2) == 0)
								goto nlop;
							a = 0;
							//while(card_sw == 1&&a!=9)
							while(((P1IN&BIT2)!= 0)&&a!=9)
							{
								delay(255);
								a++;
							}
							if (a!=9)
							{
								//b = IC_R(0x08);--b;
								//IC_W(0x08,b);
								//delay(30);
								//a = IC_R(0x08);
								//HEX_BCD(a);
								if(S!=4)
									S++;
								else
									S=0;
								//while(card_sw==0) 
								while((P1IN&BIT2)==0)
								{
									switch(S)
									{
										case 0:
											if(BCD[7]!=9)
												BCD[7]++;
											else
												BCD[7]=0;
											disp_lcd(BCD[4],BCD[5],BCD[6],0x0e,3);
											delay(250);
											break;
										case 1:
											if(BCD[6]!=9)
												BCD[6]++;
											else
												BCD[6]=0;
											disp_lcd(BCD[4],BCD[5],0x0a,BCD[7],3);
											delay(250);
											break;
										case 2:
											if(BCD[5]!=9)
												BCD[5]++;
											else
												BCD[5]=0;
											disp_lcd(BCD[4],0x0e,BCD[6],BCD[7],3);
											delay(250);
											break;								
										case 3:	
											if(BCD[4]!=9)
												BCD[4]++;
											else
												BCD[4]=0;
											disp_lcd(0x0e,BCD[5],BCD[6],BCD[7],3);
											delay(250);
											break;
									}
									disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],3);
									delay(250);
									delay(250);
								}
							}
							else
							{
								b=BCD_HEX();
								a=b;
								IC_W(0x08,a);
								delay(30);
								a=b>>8;
								IC_W(0x07,a);
								delay(30);
								goto e_lop;
							}
						/*
						{
							EA = 0;
							sound_s();
							EA = 1;
							a = 0;
							while(card_sw == 1&&a!=5)
							{
								delay(255);
								a++;
							}
							if(a==5)
								goto e_lop;
							else
							{
								b = IC_R(0x08);
								++b;
								 if (m <= 0)
								   {sf = 1;
								    ++m;S = 0x0d;goto pend;
								    }
								 else
								    if (sf == 1)
								      {++m;goto pend;}
								    else
								      --m;
								if (m > 0)
							     S = 0;
							   else
							     S = 0x0d;
								  
							pend:	
								IC_W(0x08,b);
								delay(30);
								a = IC_R(0x08);
								HEX_BCD(a);
								disp_lcd(BCD[5],BCD[6],BCD[7],0,3);//显示编号
							}
							*/
						}
							
					}
						
				}
			//	????
				goto e_lop;
			}
			
			a = IC_read(NUM0);
			i = a;
			i = i<<8;
			a = IC_read(NUM1);
			i = i+a;
			HEX_BCD(i);
			disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],0);//显示编号
			sound_s();
			delay(255);
			delay(255);
				
			a = IC_read(SG_flag);
			if (a!=0)
				if(IC_read(TZ_flag)!=0)
					goto disp_end;	//已经测试,显示结果
next_test:	
			/*prep_led = 0;*/
			P5OUT|=BIT1; 
			/*incard_led = 1;*/
			P5OUT&=~BIT0; 
			P5OUT|=BIT0; 
			//while(card_sw == 0)
			while((P1IN&BIT2) == 0)
			{
				tz = 0;
				a = 0;
				//while(card_sw == 0&&a != 10)
				while((P1IN&BIT2) == 0&&a != 10)
				{
					tz = get100da();
					if (tz<=data_int)
					{	
						a = 0;
						continue;
					}
					tz = tz-data_int;
					if(tz>TZstart_data)
						a++;
					else
						a = 0;
					delay(255);
				}
				//if (card_sw == 1)         
				if ((P1IN&BIT2) != 0)
					goto e_lop;
				
				sound_s();
				/*prep_led = 1;*/
				P5OUT&=~BIT1; 	
				/*test_led = 0;*/		//测试开始
				P5OUT|=BIT2; 
				/***********************/	
				
	    		//体重测试////////////////////////////////	
				delay(255);
				delay(255);
				delay(255);
				tz = 0;
				for(b=0;b<300;b++)
					tz = tz+get100da();
				tz = tz/300;
				if(tz>data_int)
					tz = (tz-data_int)*3663;//4884;
				else
					tz = 0;	
				//tz=tz-50000;
				HEX_BCD(tz);
				disp_lcd(BCD[0],BCD[1],BCD[2],BCD[3],3);
				//while (card_sw == 1)//是否插卡   
				while ((P1IN&BIT2)!= 0)
				{
		FK_error1:	disp_lcd(0x0d,0x0c,0x0c,0x0d,0); 
					//EA = 0;
					_DINT();
					sound_s();
					//EA = 1;
					_EINT();
					delay(255);
					a++;
					if (a == 5)
					{
						disp_lcd(0,0,0,0,0);
						delay(255);
						delay(255);
						delay(255);
						goto e_lop;
					}
				}
				IC_error =0x00;
				a = IC_read(0x00);
				if (IC_error == 0xff)
				{
					sound_s();
					goto FK_error1;		//卡查反
				}
				a = (BCD[2]<<4)+BCD[3];
				IC_write(TZ_save1,a);
				delay(20);
				a = (BCD[0]<<4)+BCD[1];
				IC_write(TZ_save0,a);	
				delay(20);
				IC_write(TZ_flag,1);
	    		
	    		
    		//*************身高//
	    		/*TMOD = 0x20;
			TL1 = 0xfd;	TH1 = 0xfd;
			SCON = 0x50;
			PCON = 0x00;	
			TR1 = 1;*/
			
	    		a = 0;
	    		stand = IC_R(0x07);
	    		a = IC_R(0x08);
	    		stand = (stand<<8)+a;
	    		prenum = stand;
	    		HEX_BCD(stand);
	    		disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],3);
	    		/*sg_start=0;*/
	    		P3DIR|=BIT5;           //将P3.5YXRX定义为输出
	    		P3OUT&=~BIT5;          //将P3.5YXRX定义为零   
			delay(255);
			delay(255);
			delay(255);
			temp=RXBUF0;          //清除URXIFG0接收标志 ,相当于RI=0
			/*sg_start=1;*/
			P3OUT|=BIT5;          //将P3.5YXRX定义为高电平
			P3DIR&=~BIT5;         //将P3.5YXRX定义为输入
			/*EA=0;*/
			_DINT();              //禁止中断
			
l_p:				/*
				while(1)
				{
					while(RI==0);
					RI=0;
					a=SBUF;
					while(RI==0);
					RI=0;
					dat1=SBUF;
					while(RI==0);
					RI=0;
					dat2=SBUF;
				}*/
				m=0;
				/*RI=0;*/
				//while((RI==0)&&(m<1300))//0xbb
				while((URXIFG0==0)&&(m<1300))//0xbb
					m++;
				if(m>=1300)
					goto sgok;
				/*a=SBUF;*/
				a=RXBUF0;         //URXIFG0自动复位
				m=0;
				//RI=0;
				if(a!=0xbb)
					goto l_p;	
				//while((RI==0)&&(m<1300))//dat1
				while((URXIFG0==0)&&(m<1300))//dat1
					m++;
				if(m>=1300)
					goto sgok;	
				//dat1=SBUF;
				dat1=RXBUF0;
				m=0;
				//RI=0;   
				//while((RI==0)&&(m<1300))//dat2
				while((URXIFG0==0)&&(m<1300))//dat2
					m++;
				if(m>=1300)
					goto sgok;	
				//dat2=SBUF;
				dat2=RXBUF0;
				m=0;
				//RI=0;
				
				b=dat1;
				b=(b<<8)+dat2;
				b=stand-b;
				if(b<=1150)
				{
					/*sg_start=0;*/
					P3DIR|=BIT5;           //将P3.5YXRX定义为输出
	    		                P3OUT&=~BIT5;          //将P3.5YXRX定义为零 
					delay(50);
					/*sg_start=1;*/
					P3OUT|=BIT5;          //将P3.5YXRX定义为高电平
			                P3DIR&=~BIT5;         //将P3.5YXRX定义为输入
					
				}
				HEX_BCD4(b);
				disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],3);
				goto l_p;
			}
			
sgok:		        /*sg_start=0;*/
                        P3DIR|=BIT5;           //将P3.5YXRX定义为输出
	    		P3OUT&=~BIT5;          //将P3.5YXRX定义为零 
			delay(50);
			/*sg_start=1;*/
			P3OUT|=BIT5;          //将P3.5YXRX定义为高电平
			P3DIR&=~BIT5;         //将P3.5YXRX定义为输入
			HEX_BCD(b);
			disp_lcd(BCD[4],BCD[5],BCD[6],BCD[7],3);
			delay(255);
			delay(255);

⌨️ 快捷键说明

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