📄 main.c
字号:
//描述:ADC12-A0模数转换+LCD12864[KS0108(HD61202)]演示
//******************************************************************************
# include <msp430x14x.h>//包含针对MSP430F149的头文件
# include "lcd12864.h"
//******************************************************************************
//全局变量定义区
unsigned char H;
unsigned char temp;
unsigned char M;
unsigned char L;
unsigned char timp;
unsigned int value1;
unsigned int value2;
unsigned char title0[] = {"ADC12 Conventor"};
unsigned char title1[] = {"Ref voltage : 3.3V"};
unsigned char title2[] = {"A0 Result = "};
unsigned char title3[] = {"A0 voltage : "};
unsigned char a[]={'.','.','.','.','\0'};
unsigned char ADVAL[5]={'x','x','x','x','\0'};
unsigned char zhi[7]={'x','x','x','x','x','x','\0'};
unsigned char number_tab[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.','V'};
unsigned char display_buffer[]={0x00,0x00,0x00,0x00,'\0'};
//*******************波特率***********300 600 1200 2400 4800 9600 19200 38400 76800 115200const
//************************************[0]**[1]**[2]*[3]**[4]**[5]***[6]***[7]****[8]***[9]*
unsigned char BaudrateUBR0[] ={0x6D,0x36,0x1B,0x0D,0x06,0x03, 0xA0, 0xD0, 0x68, 0x45};
unsigned const char BaudrateUBR1[] ={0x00,0x00,0x00,0x00,0x00,0x00, 0x01, 0x00, 0x00, 0x00};
unsigned const char BaudrateUMCTL[]={0x22,0xD5,0x03,0x6B,0x6F,0x4A, 0xC0, 0x40, 0x40, 0x4A};
//******************************************************************************
void LED(void) //LED灯闪烁,并且闪烁频率和数据采集频率有关(zhouxxy)
{
float count = 128;//稍加修改,使得LED灯闪烁频率和AD采集速率稍降低(zhouxxy)
if(P1OUT & BIT1) //数值越大,LED灯和数据采集的频率越低(zhouxxy)
{
P1OUT &= ~BIT1;
while(count--);
}
else
{
P1OUT |= BIT1;
while(count--);
}
}
//******************************************************************************
//UART0初始化 //8Mhz晶体程序不能用.
void BaudrateSetup(unsigned char U0)
{
unsigned int i;
if(U0>5) //当U0>5时,启用XT2
{
BCSCTL1 &= ~XT2OFF; //启动XT2,
do
{IFG1 &= ~OFIFG; //清OSCFault标志
for(i=0xFF;i>0;i--); //延时等待
}
while((IFG1 & OFIFG) != 0); //查OSCFault,为0时转换完成
BCSCTL2 |= SELS; //SMCLK为XT2
}
//UART0
P1OUT=0x00;
if(U0>5){UTCTL0=SSEL1;} // Clock Source:SMCLK
else{UTCTL0=SSEL0;} // Clock Source:ACLK
UCTL0 &= ~SWRST; // SWRST复位, USART允许
UCTL0=CHAR; // 8bit
ME1|=UTXE0 + URXE0; // Enable Tx0,Rx0
IE1|=URXIE0; // RX enable
UBR00=BaudrateUBR0[U0]; // 低位分频器因子
UBR10=BaudrateUBR1[U0]; // 高位分频器因子
UMCTL0=BaudrateUMCTL[U0]; // 波特率调整因子
P3SEL |= 0x30; // 将P3.4,5使用外围模块 = USART0 TXD/RXD
P3DIR |= 0x10; // 将P3.4设为输出(发),P3.5默认为输入(收)
}
//******************************************************************************
//串口接收中断,退出LPM3模式.
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
LPM0_EXIT;
}
//******************************************************************************
//说明:单片机初始化
void init(void)
{ InitLCD();
//ADC12初始化-------------------------------------------------------
//单通道,单次采样模式
P6SEL |= BIT0; //使能A/D通道 A0
//P6SEL |= 0x01; //和上一语句等效
ADC12CTL0 = ADC12ON + SHT0_2; //开ADC12内核和设置SHIT0=2(N=4)
//SHT1,SHT0分别表示采样保持器1和采样保持器0
ADC12CTL1 |= SHP; //SHP=1表示采样信号SAMPCON信号来源于为采样定时器输出
//SHP=0表示采样直接由ADC12SC控制
ADC12CTL1 |= CSTARTADD_0; //定义单次转换地址(CSTARTADD为转换存储器地址位)
ADC12MCTL0 |= INCH_0; //INCH为模拟输入通道选择位,INCH0~7对应A0~A7
//ADC12MCTL0 = SREF_2; //SREF为参考电压源选择位,使用外部参考电压 Vr+ = VeREF+
ADC12CTL0 |= ENC; //ADC转换允许(ENC为转换允许位)
//Timer_A初始化-----------------------------------------------------
P1DIR |= 0x02;
CCR0 = 1638-1;
CCTL0 = CCIE; //CCR0中断允许
TACTL = TASSEL_1+MC_1; //timerA CLK=ACLK,增计数模式
_EINT(); //开总中断
}
//******************************************************************************
//说明:数值转换
void conv(unsigned int intdata, unsigned char *pc)//将AD转换后的数值分解成四个数
{ unsigned int a,b,c;
pc[0]=number_tab[intdata/1000] ;
a=intdata%1000 ;
pc[1]=number_tab[a/100] ;
b=a%100 ;
pc[2]=number_tab[b/10] ;
c=b%10 ;
pc[3]=number_tab[c/1] ;
}
//******************************************************************************
//说明:转换成电压值
void zhuanhuan(unsigned int data,unsigned char *pc1)//将AD转换后的值转换成实际的电压值
{
unsigned int a,b,c;
pc1[0]=number_tab[data/1000] ;
a=data%1000 ;
pc1[1]=number_tab[16];
pc1[2]=number_tab [a/100] ;
b=a%100 ;
pc1[3]=number_tab[b/10] ;
c=b%10;
pc1[4]=number_tab[c/1] ;
pc1[5]=number_tab[17];
}
//******************************************************************************
//TimerA0中断服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_a(void)
{
LPM0_EXIT;
}
//******************************************************************************
//串行口发送数组
void send_data(unsigned char *p)
{unsigned int n;
timp=RXBUF0;
for(n=0;p[n]!='\0';n++)
{
while ((IFG1 & UTXIFG0) == 0); // USART0发送UTXIFG0=1,表示UTXBUF准备好发送一下字符
TXBUF0 = p[n];
}
}
//******************************************************************************
void main(void)
{ unsigned int i;
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗,以便调试程序
init(); //程序开始要先单片机初始化
BaudrateSetup(5);
ShowString86(0,3, title0);//在第几行,从第几列开始显示
ShowString86(2,2, title1);
ShowString86(4,1, title2);
ShowString86(6,1, title3);
//ReverseLinChar(0,0,21); //从第几行第几列开始反白显示
LPM3;
while(1)
{ADC12CTL0 |= ADC12SC; //ADC12SC为开始转换位,当为1时开始转换
while((ADC12IFG & BIT0)==0);
_NOP(); //????????
LED();
value1=ADC12MEM0; // 读取结果;
value2=ADC12MEM0*0.8058608058; //将转换出来的值*3.3/4095,换算出实际电压值
//******************************************************************************
H=ADC12MEM0/256; //十六进制输出的高四位
temp=ADC12MEM0%256;
M=temp%16; //十六进制输出的中四位
L=temp%16; //十六进制输出的低四位
//******************************************************************************
conv(value1,ADVAL); //数据转换调用
zhuanhuan(value2,zhi);
for(i=0;i<4;i++) //将转换值赋给串口缓冲器
{
display_buffer[i]=ADVAL[i];
}
send_data(display_buffer); //发送数据
send_data(a);
send_data(a);
send_data(a);
ShowString86(4,13,ADVAL);
ShowString86(6,14,zhi);
LPM3;
}
}
//******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -