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