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

📄 msp430sgtz.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等,可能存在几项相同的测试项目

//0X0020-0X0021------表示体重的比例系数
//0X0022-0X0023------表示身高的高度

//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 ulong  unsigned long
#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 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端口地址 */
////////////////////////////////////////
void HEX_BCD(unsigned long dd);					//16进制数转换10进制数
void HEX_BCD4(uint dd);
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); 
//uchar IC_R(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 checkcard(void);
void checkcard1(void);
//void xsjg(void);
void xsjg1(void);
void init(void);
uint adc_test(void);
uint get100da(void);
uint ad_result();
void readuart(void);
//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;		               //显示缓存
uint dis[12]; //= 0;
uchar IC_error,dispf; 	//误卡判别位									
uchar comdata[3];
uchar al;
uint data_int;
/*bit  addnumbf;*/
volatile uchar FLAG;               //flag.6对应int0f,flag.7对应int1f,flag.5对应对应timeoverf,flag.4对应firstnum 
                                   //flag.3对应在测插卡的状态          							
                                   //FLAG.0表示无线模块串口处于正常接收状态
                                   //FLAG.1表示无线模块串口处于设置检查状态
                                   //FLAG.2表示无线模块串口处于远程升级状态
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[10]={0x08,0x3b,0x41,0x11,0x32,0x14,0x04,0x39,0x00,0x10};
	   //             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 BCD[8];									//
uint disp_dat;
uint tljish,resultnum;							//显示暂存
uint i = 0;
uint b,prenum,repeatestnum;
uchar a,c,waitjish = 25,res1,res2,d=0,e,resultf;
uchar cl;
uchar bl;
uchar r232buf[41];                                       //串口通讯缓存区
uchar startjsq;                                          //串口做为启示位定时器
uchar tempmem;                                           //串口接收的数据临时存储器
uchar tempmem1;                                          //作为接收发送字节数据的个数
uchar tempmem2;                                          //作为串口的检验和存储单元
uchar tempmem3;                                          //临时存储器
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的备份
volatile uchar FLAG6;                                    //FLAG6.0=1表示写体重系数
                                                         //FLAG6.1=1表示写身高系数
                                                         //FLAG6.2=1表示读体重系数
                                                         //FLAG6.3=1表示写身高系数
                                                         //FLAG6.4=1表示自动标定

uchar FLASHFLAG;                                         //FLASHFLAG.0=1表示有接收到数据                                                         
                                                         //FLASHFLAG.1=1表示上位机传输结束
                                                         
                                                                                                                  
uchar icidbuf[8];                                        //卡号存储区,存储当前的卡号
uchar result[4];                                         //测试结果存储区,一般是两个字节,用四个字节为了兼容身高体重
//uchar flashbuf[33];                                    //flashbuf可以作为接收远程升级每次的接收数据,接收完毕后写入FLASH中
                                                         //flashbuf[0]作为要写入数据的第几位
uchar xmdmbuf;                                           //项目代码缓存区
//uchar xmdmadrbuf;                                        //项目代码地址缓存区
uchar deviceadr;                                         //机器地址
uchar devicexd;                                          //无线通信的信道
volatile uint  at64count;                                         //存储在6264中未发送的数据的个数                         
uint  bytejs;                                            //从上位机到下位机编程的字节数
uint  bytejs1;                                           //已经写入FLASH的个数
uint  byteadd;                                           //编程所有字节的累加和
volatile uint exitjsq;                                  //在测试状态按键按下超过2秒钟则退出测试
uint lsbuf;
uchar ii;
uchar temp,temp1,temp2;
uint  inti;
volatile uint txjsq; 
uchar FLAG5;                                            //FLAG5.0为原来的sf	
                                                        //FLAG5.1=1表示已经在IC卡中有测试数据
uint i;
uint stand;
uint prenum;
uint m;
uint num= 200; 
unsigned long tz;
uchar a,S,dat1,dat2;

volatile uint  sxjsq;                       //刷新计数器用于刷新是显示身高或者体重
uchar tzbak0;                               //体重存储区0
uchar tzbak1;                               //体重存储区1
uchar bcd4,bcd5,bcd6,bcd7;                  //BCD[4]..BCD[7]的临时存储区
uchar bcdb4,bcdb5,bcdb6,bcdb7;              //BCD[4]..BCD[7]的临时存储区

uint ad=0,init_ad=0;
ulong aaa=0;
volatile uint  tzxishu;                              //体重系数
volatile uint  sgxishu;                              //身高系数
uint  byte32jsq;                                         //发送32个字节进行延时
uchar xhjsq;
uint  loatjsq;                    //欠压计数器
uint  loatad;
uint  loatadbuf;
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
	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 = 0xA0;              // 3.58Mhz/9600 - 372
        UBR10 = 0x01;              // 4Mhz/9600 - 416.6666666667
        UMCTL0 = 0x6B;            
        ME1 |= UTXE0 + URXE0;      // Enable USART0 TXD/RXD
        /*IE1 |= URXIE0;*/        // Enable USART0 RX interrupt
        P3SEL |= 0xE0;            // P3.4,5 = 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.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 changepld(uchar pld)           //改频率点
{
	         delay(255);
	 mreloop:
		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 mexitxh;                 // 跳出循环
	        	         }
	        	    }
	        	        	
	        	        	
	        	
	                }
	         }
	  mexitxh:
	         //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 mreloop;                                 //如果没有正确接收"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 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);      //读取无线通信信道
        delay(80);
        deviceadr=re1byte(0x0004);     //读取该设备的地址
        //deviceadr=0;                   //????????????????????????????????????????????????///
        temp1=re1byte(0x0000);
        delay(80);
        temp2=re1byte(0x0001);         //读取存储器的存储数据的个数
        at64count=temp1*256+temp2;     //已存储数据的个数
        //at64count=500;                 //?????????????????????????????????????????????????
        xmdmbuf=0xc0;                  
        
        TBR=0XFC17;                    //1MS定时
	//TBCCR0=0XFC17;
	TBCCR0=0XFC17;
	repeatestf = 0xb0;
	//ncardtf = 1;
	FLAG5|=BIT0;
	testnum = 1;
	resultnum = 0;
	
	temp1=re1byte(0x0020);        //读体重系数
	temp2=re1byte(0x0021);
	tzxishu=temp1*256+temp2;
	i=tzxishu;
	if((i>1000)||(i<1))
	i=200;
	tzxishu=i;
	
	temp1=re1byte(0x0022);       //读身高系数
	temp2=re1byte(0x0023);
	sgxishu=temp1*256+temp2;
	i=sgxishu;
	if((i>4000)||(i<1500))
	i=2050;
	sgxishu=i;
	

⌨️ 快捷键说明

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