📄 msp430ywqzkok.c
字号:
#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 + -