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

📄 msp430ldty.c

📁 tiMSP430F147体能监测设备源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/****2003.1.12编写************************************************************/
/***采用MSP430F147(现在临时用MSP430F149)*************************************/
/***FLASH的最后4个存储段用作远程升级的程序和中断向量的存储区********************/
/***后面的存储区分成两份,一份作主程序存储区,另一份作为升级时的 备份程序*********/
/*******************************************************************************/
/*****24C64地址安排如下*********************************************************/
//0X0000-0X003F 64个字节作为一些杂项的存储例如存储单元的个数、地址码、通信信道等
//0X0000-0X0001------表示现在存储单元的个数(每10个字节为1个存储单元)
//OX0002       ------等于0X55表示无线模块已经初始化了,否则没有初始化过
//0X0003       ------表示当前设备的信道 1表示信道1,2表示信道2......
//0X0004       ------表示当前设备的地址
//0X0005       ------表示当前设备功能的代码
//0X0006       ------表示当前设备功能的代码的编号,可能是1,2,3等,可能存在几项相同的测试项目
//0X0040-0X1FFF作为存储每项单元的存储区(每12个字节为1个存储单元可以存储677组数据)
/****************显示字符含义***************************************************/
//---1显示---1表示正在进行写地址操作
//---2显示---2表示正在进行写无线模块的信道
//---3显示---3表示清除存储器的全部数据
//---4显示---4表示清除存储器的全部数据
//---5显示---5表示向上位机发送存储器的全部数据
//---6
//---7显示---7表示接收错误
//---8显示---8表示将以前的数据覆盖完毕
#include <msp430x14x.h>
#define uchar unsigned char
#define uint  unsigned int
#define ICID_W 0xa0 /*写卡器件地址*/
#define ICID_R 0xa1 /*读卡器件地址 */
#define IC_ID_W 0xa2 /*写器件地址*/
#define IC_ID_R 0xa3 /*读器件地址 */
#define SDA430 0X04   //SDA为P3.2
#define SCL430 0X08   //SCL为P3.3

#define SDA64 0X01   //SDA为P4.0
#define SCL64 0X02   //SCL为P4.1
////////////////////////////////////////
#define FYS_save0 0x1f
#define FYS_save1 0x20
#define FYS_flag  0x6d
#define NUM0 0x00
#define NUM1 0x01
#define PASS0 0x7c
#define PASS1 0x7d
#define SEX 0x7e
#define AGE 0x7f	/*内部资源*/
////////////////////////////////////////
void HEX_BCD(unsigned long dd);					//16进制数转换10进制数
void ycsjre64(void);
void wxmkcsh(void);						//初始化
void sound_s(void);
void sound_star(void);						//声音
uchar re1byte(uint addr);
void wr1byte(uint addr,uchar shu);
uchar IC_read(uchar address);  					//从24c02的地址address中读取一个字节数据
void IC_write(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 readicid(void);                                            /*************读取卡号****************/
void r232cl(void);
void csszjc(const uchar  * data);                                    
void ycsj(void) @ "MYLOATION";
void flashmain(void) @ "MYLOATION";
void flashmaintry(void) @ "MYLOATION";
void delay(uint time) @ "MYLOATION";
void disp_lcd(uchar d1,uchar d2,uchar d3,uchar d4,uchar dot) @ "MYLOATION";   //显示 电源 数据 地 时钟
void flashmaintry(void) @ "MYLOATION"; 					      //延时
void rxdatatry(void) @ "MYLOATION";
void rxdata(void) @ "MYLOATION";
void txready(void) @ "MYLOATION";
void eraseseg(uchar n) @ "MYLOATION";
void flashfinish(void) @ "MYLOATION";
void flashcsh(void) @ "MYLOATION";
void init(void);
void checkcard(void);
void xsjg(void);
void readuart(void);
uchar disp1,disp2,disp3,disp4,subf;
uchar IC_error;
volatile uchar FLAG;               //flag.6对应int0f,flag.7对应int1f,flag.5对应对应timeoverf,flag.4对应firstnum 
                                   //flag.3对应在测插卡的状态          							
                                   //FLAG.0表示无线模块串口处于正常接收状态
                                   //FLAG.1表示无线模块串口处于设置检查状态
                                   //FLAG.2表示无线模块串口处于远程升级状态
volatile uchar FLAG1;                                             //FLAG1.0=1表示找到起始位
                                   //FLAG1.1=1表示接收到完整的命令侦
                                   //FLAG1.2
                                   //FLAG1.3
                                   //FLAG1.4
                                   //FLAG1.5=1表示读错误
                                   //FLAG1.6=1表示写错误
                                   //FLAG1.7=1表示校验错误
volatile uchar FLAG2;              //FLAG2.0=1表示有数据测试完毕,可以进行发送
                                   //FLAG2.1=1表示正在处于设置无线信道状态,并且现处于非测试状态
                                   //用于串口中断时判别是上位机发的还是无线模块发的数据
                                   //FLAG2.2=1表示和无线模块通讯时传输到"friendcom....."正确
                                   //FLAG2.3=1表示现在为空闲状态,可远程升级,写地址,写信道,读存储器器数据
                                                         //FLAG2.4=1表示没有插卡
                                                         //FLAG2.5=1表示准备测试
                                                         //FLAG2.6=1表示测试中
                                                         //FLAG2.7=1表示测试结束
volatile uchar FLAG3;                                    //FLAG3.0=1表示上位机要写机器地址
                                                         //FLAG3.1=1表示上位机要写通讯信道
                                                         //FLAG3.2=1表示上位机要清除所有存储的测试数据
                                                         //FLAG3.3=1表示上位机要进行远程升级
                                                         //FLAG3.4=1表示上位机读取存储器的数据
                                                         //FLAG3表示的是要花费时间较长的操作标志寄存器,不要在测试中进行

volatile uchar FLAG3BAK;                                          //作为FLAG3的备份                                                         
volatile uchar FLAG4;                                             //FLAG4.0=1表示读当前的测试数据
                                                         //FLAG4.1=1表示读机器地址
                                                         //FLAG4.2=1表示读通讯信道                                                         
                                                         //FLAG4.3=1表示读存储器状态
volatile uchar FLAG4BAK;                                          //作为FLAG4的备份
uchar FLASHFLAG;                                         //FLASHFLAG.0=1表示有接收到数据                                                         
                                                         //FLASHFLAG.1=1表示上位机传输结束
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     
const uchar  rsbaud[]={'R','S','B','A','U','D',':','9','6','0','0','N',0X0D,0X0A,'\0'}; //设置RSBAUD:9600N
const uchar  rfbaud[]={'R','F','B','A','U','D',':','1','9','2','0','0',0X0D,0X0A,'\0'}; //设置RFBAUD:19200
const uchar  ch[]={'C','H',':','\0'};
uchar r232buf[41];                                       //串口通讯缓存区
uchar tempmem;                                           //串口接收的数据临时存储器
uchar tempmem1;                                          //作为接收发送字节数据的个数
uchar tempmem2;                                          //作为串口的检验和存储单元
uchar tempmem3;                                          //临时存储器
uchar BCD[8];
uchar xmdmbuf;                                           //项目代码缓存区
//uchar xmdmadrbuf;                                      //项目代码地址缓存区
uchar deviceadr;                                         //机器地址
uchar devicexd;                                          //无线通信的信道
uint  at64count;                                         //存储在6264中未发送的数据的个数                         
uint  bytejs;                                            //从上位机到下位机编程的字节数
uint  bytejs1;                                           //已经写入FLASH的个数
uint  byteadd;                                           //编程所有字节的累加和
uchar icidbuf[8];                                        //卡号存储区,存储当前的卡号
uchar result[4];                                         //测试结果存储区,一般是两个字节,用四个字节为了兼容身高体重
uchar cl;
uchar bl;
uchar a,b,c,data1,data2,m;
uint i = 0,j = 0;
uint prenum;
uchar startjsq; 
uint lsbuf;
uchar ii;
uchar temp;                                              //串口做为启示位定时器
uint dis[6]=0;
uint  inti;
volatile uint txjsq;
volatile uint exitjsq; 

uchar guancha1;
uchar guancha2;                                         //观察寄存器
uint  byte32jsq;                                         //发送32个字节进行延时
uchar xhjsq;
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=0X01;               //P1.0输出高电平
	P2OUT=0XFF;               //P2口预置为0XFF
	P2DIR=0X3C;               //P2口P2.2,P2.3,P2.4,P2.5为输出口
	P3OUT=0XEF;               //P3口预置为0XEF,P3.4输出为低电平
	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?
        BCSCTL2 |= SELM1+SELM0;    // MCLK = LFXT1 (safe)
        
	UCTL0=CHAR;                //设置为8位数据位,一个停止位,无校验
        UTCTL0 = SSEL0;            // UCLK = ACLK
        UBR00 = 0xD0;              // 3.58Mhz/9600 - 372
        UBR10 = 0x00;              // 4Mhz/9600 - 416.6666666667
        UMCTL0 = 0x52;             // 4Mhz/19200 -208.3333333333
        ME1 |= UTXE0 + URXE0;      // Enable USART0 TXD/RXD
        /*IE1 |= URXIE0;*/        // Enable USART0 RX interrupt
        P3SEL |= 0xE0;            // P3.5,6,7= USART0 TXD/RXD
       
        UCTL1=CHAR;               //设置串口1为8位数据位,一个停止位,无校验
	UTCTL1 = SSEL0;           // UCLK = ACLK
        UBR01 = 0xA0;             // 3.58Mhz/9600 - 372
        UBR11 = 0x01;             // 4Mhz/9600 - 416.6666666667
        UMCTL1 = 0x6B;
        ME2 |= UTXE1 + URXE1;     // Enable USART1 TXD/RXD
        /*IE2 |= UTXIE1 + URXIE1;*/   // Enable USART1 RX interrupt
        IE2 |= URXIE1;            //开始允许接收中断
        
        P3SEL|=0XE0;              // P3.5,6,7= USART0 TXD/RXD
        
        
        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 init(void)
{
	uchar temp1;
	uchar temp2;
	/*sound=0;*/
        P5OUT&=~BIT7;                //关闭蜂鸣器
        /*incard_led = 1;*/
	P5OUT&=~BIT3;
	/*prep_led = 1;*/
	P5OUT&=~BIT2; 
	/*test_led = 1;*/
	P5OUT&=~BIT1; 
	/*testend_led = 1;*/
	P5OUT&=~BIT0; 
        TAR=0X3caf;                    
        TACTL = TASSEL0 + ID1;         // ACLK, clear TAR 使用ACLK作为时钟源,4分屏,工作于连续计数模式
        TBR=0XFC17;                    //1MS定时
        TBCTL =TBSSEL0  + ID1 + MC1;   //ACLK, clear TBR 使用ACLK作为时钟源,4分屏,工作于连续计数模式
        P2IES = 0XFF;                  //电平从高到低触发中断
        P2IFG = 0X00;                  //清标志位
        IC_error = 0;                  //初始化IC卡没有问题       
        subf = 0xb0;
        FLAG = 0X00;                   //初始化状态寄存器
        FLAG1= 0X00;
        FLAG2= 0X00;
        FLAG3= 0X00;
        FLAG4= 0X00;
        P4OUT&=~BIT2;                  //将24C64的WP置低电平,取消写保护
        
        devicexd=re1byte(0x0003);      //读取无线通信信道
        deviceadr=re1byte(0x0004);     //读取该设备的地址
        temp1=re1byte(0x0000);
        temp2=re1byte(0x0001);         //读取存储器的存储数据的个数
        at64count=temp1*256+temp2;     //已存储数据的个数
        xmdmbuf=0xc4;                  //项目代码为立定跳远
        
        TBR=0XFC17;                    //1MS定时
	//TBCCR0=0XFC17;
	TBCCR0=0XFC17;
} 
void xsjg(void)
{
	a = IC_read(FYS_save0);
        disp1 = a;
	a = IC_read(FYS_save1);
	disp2 = a>>4;
        a = a<<4;
	disp3 = a >> 4;
	disp_lcd(0,disp1,disp2,disp3,0);
	/*incard_led = 1;*/
        //P5OUT&=~BIT0; 
	/*test_led = 1;*/
        //P5OUT&=~BIT2; 
	/*incard_led = 1;*/
	//P5OUT&=~BIT0; 
	/*testend_led = 0;*/
	//P5OUT|=BIT3; 
	//P5OUT&=~BIT1;
}
void changepld(uchar pld)
{
	         delay(255);
	 creloop:
		delay(255);                                          //为了使显示清楚	
                for(i=0;i<33;i++)
		r232buf[i]=0;                                        //将r232buf清零
		UBR01 =0x82;                                         // 4MHZ/2400 - 1666.666666667   
                UBR11 =0x06;                                         //调整寄存器
                UMCTL1=0x6B;
                ME2 |=URXE1+UTXE1;                                   // Enable USART1 TXD/RXD                                                               //禁止中断
                P4OUT&=~BIT3;                                        // P4.3=0关闭电源
	        P1OUT&=~BIT0;                                        // P1.0=0复位
	        delay(255);
	        delay(255);
	        //IE2|=URXIE1;                                        // 允许接收中断
	        _DINT();                                              //暂时关闭中断
	        //P4OUT|=BIT3;                                        // P4.3=1打开电源
	        readuart();                                           //读取串口数据
	        FLAG4&=~BIT2;                                         // 先清接收"FRIENDCOM....."正确位
	        for(i=0;i<20;i++)
	        {
	        	delay(255);                                   // 延时
	        	if(r232buf[0]>=32)                            // 如果接收的数据大于等于32
	        	{
	        	   for(r232buf[0]=1;r232buf[0]<32;r232buf[0]++)
	        	   {
	        	   	if((r232buf[r232buf[0]+0]==0x0d)&&(r232buf[r232buf[0]+1]==0x0a))
	        	   	if((r232buf[r232buf[0]+2]==0x46)&&(r232buf[r232buf[0]+3]==0x52))
	        	        if((r232buf[r232buf[0]+4]==0x49)&&(r232buf[r232buf[0]+5]==0x45))
	        	        {
	        	        	FLAG4|=BIT2;                 // 接收"FRIENDCOM....."正确置位
	        	        	goto cexitxh;                 // 跳出循环
	        	         }
	        	    }
	        	        	
	        	        	
	        	
	                }
	         }
	  cexitxh:
	         //ME2&=~URXE1;
	         tempmem= RXBUF1;                                    //先暂时关闭串口接收
	         if((FLAG4&BIT2)!=0)                                 //如果接收到正确"FRIENDCOM....."
	         {
	         	delay(255);                                  //延时一会
	         	csszjc(ch);                                  //
	         	while ((IFG2 & UTXIFG1) == 0);               //USART1 TX buffer ready?
	         	TXBUF1=(pld&0x0f)+0x30;                 //将信道发送出去
	         	while ((IFG2 & UTXIFG1) == 0);               //USART1 TX buffer ready?                                               
	         	TXBUF1=0x0d; 	
                        while ((IFG2 & UTXIFG1) == 0);               //USART1 TX buffer ready?                                               
	         	TXBUF1=0x0a;                                 //发送确认键
	         }
	         else   goto creloop;                                 //如果没有正确接收"FRIENDCOM.....",则重新开始
                 delay(255);
                 ME2|=URXE1;                                         //重新允许接收
                 P1OUT|=BIT0;                                        //P1.0置位 
                 P4OUT&=~BIT3;                                        // P4.3=0关闭电源
                 delay(255);
	         delay(255); 
	         P1OUT|=BIT0;                                        //P1.0置位 
	         P4OUT|=BIT3;                                        // P4.3=1打开电源
	         delay(255);
	         delay(255); 
	         UBR01 = 0xA0;                                       // 3.58Mhz/9600 - 372
                 UBR11 = 0x01;                                       // 4Mhz/9600 - 416.6666666667
                 UMCTL1 = 0x6B;                                      //将UART1恢复到9600波特
  }
void main(void)
{ 
	msp430csh();
programbegin:
	init();
	disp_lcd(0x0d,0x0d,0x0d,0x0d,0);	//disp:- - - -
	//while(1)
        //{
            //while((IFG2&URXIFG1)==0);        //如果没有接收到数据时,等待  
	    //r232buf[0]=RXBUF1;
	    //while ((IFG2 & UTXIFG1) == 0);   //USART1 TX buffer ready?
	    //TXBUF1=0x55;
	 //} 
	//while(1)
	//{
		//RI = 0;
		//while (RI == 0);
		//RI = 0;
		//a = SBUF;
		//while (RI == 0);
		//RI = 0;
		//b = SBUF;
		//while (RI == 0);
		//RI = 0;
		//c = SBUF;
		//a = a;
	//}
	/*incard_led = 0;*/
        P5OUT|=BIT3;
        wxmkcsh(); 
        disp_lcd(0xd,0xd,0xd,0xd,0x0);
        /////////////////////////////////////////////////////////////////////////////
        IE2 &= ~UTXIE1;              
        ME2 |= UTXE1 + URXE1;                  // Enable USART1 TXD/RXD                                       
        IE2 |= URXIE1;
        _EINT();
        TBCTL|=TBIE;
        //changepld(1);
mainloop:
        while(1)
       {
	  delay(10);
	  checkcard();
mainloop1:        
          m=0;
          exitjsq=0;
          _EINT();
          TBCTL|=TBIE;
          ME2 |= UTXE1 + URXE1; 
	  while((P1IN&BIT2)==0)
	  {    
	     FLAG2|=BIT3;                               //
             //delay(200);                              //延时60ms
             ycsjre64();

⌨️ 快捷键说明

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