📄 main.c
字号:
void ADC12_Init(void) //A/D转换初始化函数声明
{
//=======================ADC12程序=========================================
P6SEL|=0x07; //使能AD通道A2---P6.2
//ADC12CTL0=ADC12ON+SHT0_8+MSC; //打开ADC12,SHO_8,设置采样时钟,根据实际情况!!!!!!!!!!!
ADC12CTL0=ADC12ON+SHT0_15; //ADC12CTL0的位定义------------------采样时钟=4×tADC12CLK×N SHO—8---》64
//ADC12CTL1=SHP+CONSEQ_2; //使用采样时钟,设置单通道多次转换模式
ADC12CTL1=SHP+CONSEQ_0; //+CONSEQ_0;//+CSTARTADD_2; //使用采样时钟,单通道单次转换
//ADC12MCTL2=0xf2; //1 111 0010
//ADC12MCTL2=0x92; //10010010 正参考等于内部参考2.5V,负参考等于电源地
//ADC12MCTL2=INCH_2+SERF_7; //通道2使用外部参考2.5V作为转换基准
ADC12MCTL0=SREF_0+INCH_0; //and ??? 察看寄存器内容0x92=10010010!EOS=1,该序列中最后一次转换,SERF=1,VR+=Vref+;VR-=AVss,使用内部参考电压2.5V和GND
ADC12IE=0xFF; //使能ADC12IFG.2中断
//ADC12IE的位定义--------------------
ADC12CTL0|=ENC; //ENC=1,使能ADC转换
_EINT();
}
//==============================Timer_A中断服务程序======================
//Timer_A 中断服务程序,输出周期为2ms的方波,并由端口P1.2送出。
//函数功能:启动ADC12的每次转换
//调试状态:
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=0x04; //取反输出,用于产生方波信号,方波信号的频率为???如何计算
//_nop(); //延时使得输出电压稳定
_NOP();
if(P1OUT&0x04==4) //当输出为1时,定时采样
{
ADC12CTL0|=ADC12SC; //一个周期,使能一次采样
}
else
{
;
}
switch(P1OUT&0x04)
{
case 4:ADC12CTL0|=ADC12SC;break; //如果输出为1,则启动AD转换
case 0:_NOP();
}
}*/
/*==============================ADC12中断服务程序===============================
//函数功能:实现输入电压的显示和输出电压的显示,PID运算
//调试状态:
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
//static unsigned int index=0;
//results[index]=ADC12MEM0; //保存结果,清楚IFG
//index=(index+1)%Num_of_Results;
//AD_feedback=ADC12MEM2; //转换结束,把结果存入AD_result
//=============================局部变量定义===============================
unsigned int ADT,ADT_Z,ADT_S,ADT_B,ADT_Q; //定义电压的各位变量
unsigned long ADT1,MAX5812_VOUT1;
unsigned char MAX5812_vout_high; //MAX5812电压输出的高字节
unsigned char MAX5812_vout_low; // 低
//=============================转换结果转换===============================
LcdClear(); //每次都得清一次屏
ADT=ADC12MEM0; //12位AD转换值
ADT1=((unsigned long)ADT*3300)/4095; //电压转化计算,采用参考电压3.3V和地,AVss和DVSS
ADT_Z=ADT1/1000; //取整数位
ADT_S=(ADT1/100)%10; //取十分位
ADT_B=(ADT1%100)/10; //取百分位
ADT_Q=ADT1%10; //取千分位
//=============================采集电压显示===============================
LCD1602_buffer1[0]=' '; //
LCD1602_buffer1[1]='A'; //A
LCD1602_buffer1[2]='D'; //D
LCD1602_buffer1[3]='i'; //i
LCD1602_buffer1[4]='n'; //n
LCD1602_buffer1[5]=':'; //:
LCD1602_buffer1[6]='0'+ADT_Z; //计算千位
LCD1602_buffer1[7]='.'; //计算个位
LCD1602_buffer1[8]='0'+ADT_S; //计算百位
LCD1602_buffer1[9]='0'+ADT_B; //计算十位
LCD1602_buffer1[10]='0'+ADT_Q; //计算个位
LCD1602_buffer1[11]='V'; //V
LCD1602_buffer1[12]=' '; //
LCD1602_buffer1[13]=' '; //
LCD1602_buffer1[14]=' '; //
LCD1602_buffer1[15]=' '; //
//DispNChar(0,0,16,LCD1602_buffer1); //在第一行显示ADC12采集得到的电压值
//=============================PID运算======================================
clr_lastout(2048); //设定头一次输出的值,设定值1.5V
AD_feedback=ADT; //AD采集到的电压作为反馈值
MAX5812_vout = ypid(given,AD_feedback); //PI计算
//============================ DAC输出======================================
MAX5812_vout_high = (MAX5812_vout&0xff00)>>8; //取高8位
MAX5812_vout_low = (MAX5812_vout&0x00ff); //取低8位
DAC_MAX5812(0xc0,MAX5812_vout_high,MAX5812_vout_low); //DAC更新输出
//============================LCD1602显示电压输出结果(十进制数)===========
MAX5812_VOUT1=((unsigned long)MAX5812_vout*3300)/4095; //计算输出电压
LCD1602_buffer2[0]=' ';
LCD1602_buffer2[1]='V';
LCD1602_buffer2[2]='o';
LCD1602_buffer2[3]='u';
LCD1602_buffer2[4]='t';
LCD1602_buffer2[5]=':'; //显示Vout:
LCD1602_buffer2[6]='0'+(MAX5812_VOUT1/1000); //计算千位
LCD1602_buffer2[7]='.';
LCD1602_buffer2[8]='0'+((MAX5812_VOUT1/100)%10); //计算百位
LCD1602_buffer2[9]='0'+((MAX5812_VOUT1%100)/10); //计算十位
LCD1602_buffer2[10]='0'+(MAX5812_VOUT1%10); //计算个位
LCD1602_buffer2[11]='V'; //“V”
LCD1602_buffer2[12]=' '; //
//============================TEC状态判断===================================
//如果》1.5V,则制冷;反之,《1.5V则加热
if(MAX5812_VOUT1>1861) //1.5V=(1861/4096)×3.3
{
LCD1602_buffer2[13]='H'; //显示加热
LCD1602_buffer2[14]='.';
LCD1602_buffer2[15]=' ';
}
else
{
LCD1602_buffer2[13]='C'; //显示制冷
LCD1602_buffer2[14]='.';
LCD1602_buffer2[15]='.';
}
//============================采集和输出电压显示============================
DispNChar(0,0,15,LCD1602_buffer1); //在第一行显示ADC12采集得到的电压值
DispNChar(0,1,15,LCD1602_buffer2); //在第二行显示输出电压数值
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
}
*/
//=================================键盘中断服务程序=======================
//PORT_1 interrupt service routine
//interrupt[PORT1_VECTOR] void Port_1(void) //如果有按键按下,设按键按下标志
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_1(void)
{
key_flag|=0x01; //有键按下,按键标志位置1,else==0
//P1IFG=0x00; //清除中断标志
//P1DIR=0x00; //设置P1口为输入口
switch(P1IFG&0x38) //00111000,判断键盘是否产生中断
{
case 8:xi_setup();break; //P1.3按下 30H
case 16:xd_setup();break; //P1.4按下 28H
case 32:xp_setup(); //P1.5按下 18H
}
P1IFG=0x00; //清除中断标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -