#include <msp430x14x.h>
#include "EEPROM.h"
#include "IIC.h"
#define uchar unsigned char
#define uint unsigned int
#define key (P1IN&0x80) //设置 P1.7 管脚
uint m; //写入IIC时循环参数
uint i; //
uint n; //
uint j; //延时
uint dd;
uchar qq;
uint num2;
int address=0x12; //前面地址有擦坏的
int zhi; //显示数组
uchar p=0; //把AD采集来的信号存入 0-20
uchar count=0; //按键的次数
static uchar results[4]; //AD采集的数据
uchar dataaddress[1]; //IIC的地址位置
uchar rd[21];
uchar rd2[7][3];
uchar rd1[7][3]; // 测试存入数据
uchar flag = 0; //标志是否能存取数据
uchar table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x11,0xfe};
//分别显示 0 1 2 3 4 5 R . 为小数点
// 共阳极数码管
/************************延时函数************************************/
void delay1(uint n)
{
for(j=n;j>0;j--)
{
for(i=1140;i>0;i--);
}
}
void main()
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
/************************AD转换************************************/
P6SEL = 0x0F; // Enable A/D channel inputs
P3DIR |= BIT3 + BIT1; //设置相应端口为输出状态 iic
ADC12CTL0 = ADC12ON+MSC+SHT0_2; // Turn on ADC12, set sampling time
ADC12CTL1 = SHP+CONSEQ_1; // Use sampling timer, single sequence
ADC12MCTL0 = INCH_0; // ref+=AVcc, channel = A0
ADC12MCTL1 = INCH_1; // ref+=AVcc, channel = A1
ADC12MCTL2 = INCH_2; // ref+=AVcc, channel = A2
ADC12MCTL3 = INCH_3+EOS; // ref+=AVcc, channel = A3, end seq.
ADC12IE = 0x08; // Enable ADC12IFG.3
ADC12CTL0 |= ENC; // Enable conversions
_EINT(); //开启总中断
/**********************显示部分**************************************/
P1DIR&=~0x80; //P1.7口设置为输入
P4DIR |= 0xff; //P4口设置为输出
P4OUT=0xff; //对P4口进行初始化
P6DIR |= 0xf0;
P2DIR |= 0xff;
/*******************************************************************/
while(1)
{
if(key!=(0x80))
{
delay1(10); //上电前长按进入标定状态 显示小数点
if(key!=(0x80))
{
while(1)
{
if(key!=(0x80))
{
delay1(5);
if(key!=(0x80))
{
while(1)
{
while(key!=(0x80));
dd=0x8fff;
while(dd--);
P4OUT=table[count];
P4OUT=table[7];
if(key!=(0x80))
{ delay1(5);
if(key!=(0x80))
{
ADC12CTL0 |= ADC12SC; //开启转换
//delay1(100);
count++;
if(count==7)
count=0;
address=address+3;
if (address>36)
address=18;
Write_NByte(results,3,address); //在address后连续写入了3个数据
Read_NByte_Randomaddress(rd1[p],3,address);
p++;
if(p==7)
p=0;
}
}
}
}
}
}
}
}
else
{
for(m=0;m<7;m++)
{
if (address>36)
address=18;
Read_NByte_Randomaddress(rd1[count],3,address);
count++;
address=address+3;
if(count==7)
count=0;
}
while(1)
{
dd=0x8fff;
while(dd--);
/****************************比较数据部分*******************************************/
{
if(results[1]<2800)
{ qq=8;}
if(results[1]<2500)
{ qq=0;P2OUT=0x00;}
if(results[1]<500)
{ qq=7;}
if(results[0]<2800)
{ qq=9;P2OUT=0x02;}
if(results[0]<2500)
{ qq=4;P2OUT=0x04;}
if(results[0]<500)
{ qq=2;P2OUT=0x06;}
if(results[2]<2800)
{ qq=5;P2OUT=0x01;}
if(results[2]<2500)
{ qq=3;P2OUT=0x03;}
if(results[2]<500)
{ qq=1;P2OUT=0x05;}
}
/****************************显示部分******************************************/
{
switch(num2)
{
case 0x00:num2=table[0];break;
case 0x01:num2=table[1];break;
case 0x02:num2=table[2];break;
case 0x03:num2=table[3];break;
case 0x04:num2=table[4];break;
case 0x05:num2=table[5];break;
case 0x06:num2=table[6];break;
case 0x07:num2=table[7];break;
}
P4OUT=num2;
}
ADC12CTL0 |= ADC12SC; //开启转换AD
}
}
}
}
/**********************AD转换中断*****************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
results[0] = (ADC12MEM0/12); // Move results, IFG is cleared
results[1] = (ADC12MEM1/12); // Move results, IFG is cleared
results[2] = (ADC12MEM2/12); // Move results, IFG is cleared
results[3] = (ADC12MEM3/12); // 未使用
//_BIC_SR_IRQ(LPM0_bits); // Clear LPM0, SET BREAKPOINT HERE
while((ADC12IFG & 0x0f)!=0);
}
/****************************************************************************************
这个是个档位传感器的程序,ad三个通道分别采集数据。
上电前,长按按键。进去标定状态,显示零,再按键,进行数据采集保存到二维数组,每次采集记录三组数据,一个采集六次,并将采集的数据存到EEPROM。再按键后显示为1,直到6.
此时手动断电,再上电后,首先将EEPROM里存的数据读出来。
我的问题是,每次都会有一两个值偏差很大,而且每次采集的数据都不变,我感觉是EEPROM没写进去,是不是IIC写的有问题?
此帖出自
小平头技术问答
一周热门 更多>