msp430 ADC多通道采集以及12864液晶显示以及串口发送Word文档下载推荐.docx
《msp430 ADC多通道采集以及12864液晶显示以及串口发送Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《msp430 ADC多通道采集以及12864液晶显示以及串口发送Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
//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,endseq.
ADC12IE=0x08;
//EnableADC12IFG.3
ADC12CTL0|=ENC;
//Enableconversions
}
/*******************************************
函数名称:
Trans_val
功能:
将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参数:
Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值:
无
********************************************/
voidTrans_val(ucharx,uchary,uintHex_Val)
unsignedlongcaltmp;
uintCurr_Volt;
caltmp=Hex_Val;
caltmp=(caltmp<
<
5)+Hex_Val;
//caltmp=Hex_Val*33
3)+(caltmp<
1);
//caltmp=caltmp*10
Curr_Volt=caltmp>
>
12;
//Curr_Volt=caltmp/2^n
Display_Value(x,y,Curr_Volt);
}
ADC12ISR
ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
无
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticuintindex=0;
results0[index++]=ADC12MEM0;
//Moveresults
results1[index++]=ADC12MEM1;
results2[index++]=ADC12MEM2;
results3[index++]=ADC12MEM3;
if(index==Num_of_Results)
uchari;
unsignedlongsum0=0,sum1=0,sum2=0,sum3=0;
index=0;
for(i=0;
i<
Num_of_Results;
i++)
sum0+=results0[i];
sum1+=results1[i];
sum2+=results2[i];
sum3+=results3[i];
sum0>
=5;
//除以32
sum1>
sum2>
sum3>
Display_Num(3,1,sum0);
Display_Num(3,2,sum1);
Display_Num(3,3,sum2);
Display_Num(3,4,sum3);
Trans_val(5,1,sum0);
Trans_val(5,2,sum1);
Trans_val(5,3,sum2);
Trans_val(5,4,sum3);
}
_BIC_SR_IRQ(LPM0_bits);
//ClearLPM0,SETBREAKPOINTHERE
//USART.C
//以下是串口0的初始化设置
voidUsart0_Init()
P3SEL|=0x30;
//P3.4,5选择为UART收发端口
ME1|=UTXE0+URXE0;
//使能USART0收发
UCTL0|=CHAR;
//8-bitcharacter
UTCTL0|=SSEL0;
//UCLK=ACLK
UBR00=0x0D;
//32k/2400-13.65
UBR10=0x00;
//
UMCTL0=0x6B;
//Modulation
UCTL0&
=~SWRST;
//初始化UART0状态机
IE1|=URXIE0;
//使能接收中断
//此函数用来发送一个char型
voidSentData(ucharnum)
while(!
(IFG1&
UTXIFG0));
TXBUF0=num;
//此函数用来把1~4位十进制数据转化为ASCII编码的形式发送给上位机
voidSent_Num(uintnum)
ucharge,shi,bai,qian;
qian=num/1000;
bai=num/100%10;
shi=num/10%10;
ge=num%10;
SentData(qian+0x30);
SentData(bai+0x30);
SentData(shi+0x30);
SentData(ge+0x30);
//SentData('
\n'
);
PutSting
向PC机发送字符串
voidPutString(uchar*ptr)
while(*ptr!
='
\0'
)
//TX缓存空闲?
TXBUF0=*ptr++;
//发送数据
TXBUF0='
;
Delays
延时一会
voidDelays(void)
uchari=20;
uintj;
while(i--)
j=2000;
while(j--);
//串口中断响应函数
#pragmavector=UART0RX_VECTOR
__interruptvoidusart0_rx(void)
if(49==RXBUF0)
if(50==RXBUF0)
ADC12IE=0x00;
//关闭ADC
//USART.H
#ifndef__USART0_H
#define__USART0_H
externvoidUsart0_Init();
externvoidSentData(ucharnum);
externvoidPutString(uchar*ptr);
externvoidDelays(void);
externvoidSent_Num(uintnum);
//LCD12864.H
#ifndef_LCD12864_H
#define_LCD12864_H
#defineCPU_F((double)8000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
#defineulongunsignedlong
/*12864应用指令*/
#defineCLEAR_SCREEN0x01//清屏指令:
清屏且AC值为00H
#defineAC_INIT0x02//将AC设置为00H。
且游标移到原点位置
#defineCURSE_ADD0x06//设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#defineFUN_MODE0x30//工作模式:
8位基本指令集
#defineDISPLAY_ON0x0c//显示开,不显示游标,且游标位置反白
#defineDISPLAY_OFF0x08//显示关
#defineCURSE_DIR0x14//游标向右移动:
AC=AC+1
#defineSET_CG_AC0x40//设置AC,范围为:
00H~3FH
#defineSET_DD_AC0x80
#defineP100
#defineP111
#defineP122
#defineP133
#defineP144
#defineP155
#defineP166
#defineP177
#defineRS_CLRP6OUT&
=~(1<
P17)//RS置低
#defineRS_SETP6OUT|=(1<
P17)//RS置高
#defineRW_CLRP6OUT&
P15)//RW置低
#defineRW_SETP6OUT|=(1<
P15)//RW置高
#defineEN_CLRP6OUT&
P16)//E置低
#defineEN_SETP6OUT|=(1<
P16)//E置高
#definePSB_CLRP1OUT&
P13)//PSB置低,串口方式
#definePSB_SETP1OUT|=(1<
P13)//PSB置高,并口方式
#defineRST_CLRP1OUT&
P13)//RST置低
#defineRST_SETP1OUT|=(1<
P10)//RST置高
#defineDataPortP5OUT//P5口为数据口
externvoidPort_init();
externvoidLCD_write_com(unsignedcharcom);
externvoidLCD_write_data(unsignedchardata);
externvoidLCD_clear(void);
externvoidDisplayCgrom(ucharaddr,uchar*hz);
externvoidDisplay(void);
externvoidLCD_init(void);
externvoidDisplay_Num(ucharx,uchary,uintnum);
externvoidLocate_XY(ucharx,uchary);
externvoidDisplay_Value(ucharx,uchary,uintvalue);
//LCD12864.C
//*************************************************************************
//初始化IO口子程序
voidPort_init()
P5SEL=0x00;
P5DIR=0xFF;
P6SEL=0x00;
P6DIR|=BIT5+BIT6+BIT7;
P1SEL=0x00;
P1DIR|=BIT0+BIT3;
PSB_SET;
//液晶并口方式
RST_SET;
//复位脚RST置高
//***********************************************************************
//显示屏命令写入函数
voidLCD_write_com(unsignedcharcom)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
delay_ms(5);
EN_CLR;
//显示屏数据写入函数
voidLCD_write_data(unsignedchardata)
RS_SET;
DataPort=data;
//显示屏清空显示
voidLCD_clear(void)
LCD_write_com(0x01);
//坐标定位
voidLocate_XY(ucharx,uchary)
ucharadress=0;
adress=x;
switch(y)
case1:
adress|=0x80;
break;
case2:
adress|=0x90;
case3:
adress|=0x88;
case4:
adress|=0x98;
default:
adress=0x80;
LCD_write_com(adress);
//函数名称:
DisplayCgrom(ucharhz)显示CGROM里的汉字
voidDisplayCgrom(ucharaddr,uchar*hz)
LCD_write_com(addr);
while(*hz!
LCD_write_data(*hz);
hz++;
}
//****************************************************************
Display()显示测试结果
voidDisplay(void)
DisplayCgrom(0x80,"
通道0:
"
DisplayCgrom(0x90,"
通道1:
DisplayCgrom(0x88,"
通道2:
DisplayCgrom(0x98,"
通道3:
DisplayCgrom(0x80+7,"
V"
DisplayCgrom(0x90+7,"
DisplayCgrom(0x88+7,"
DisplayCgrom(0x98+7,"
Display_Num显示一个uint型数据
voidDisplay_Num(ucharx,uchary,uintnum)
Locate_XY(x,y);
LCD_write_data(qian+0x30);
LCD_write_data(bai+0x30);
LCD_write_data(shi+0x30);
LCD_write_data(ge+0x30);
显示处理后电压值
voidDisplay_Value(ucharx,uchary,uintvalue)
ucharge,shi,bai;
bai=value/100%10;
shi=value/10%10;
ge=value%10;
LCD_write_data('
'
.'
//显示屏初始化函数
voidLCD_init(void)
LCD_write_com(FUN_MODE);
//显示模式设置
LCD_write_com(DISPLAY_ON);
//显示开
LCD_write_com(CLEAR_SCREEN);
//清屏
//MAIN.C