高级会员
- 积分
- 715
- 威望
- 395
- 贡献
- 200
- 兑换币
- 220
- 注册时间
- 2014-2-20
- 在线时间
- 60 小时
- 毕业学校
- 湖北工程学院
|
/*
Nokia5110 在msp430单片机上的应用
08-12-08
*/
#include <msp430g2553.h>
#include "nokia_5110.h"
#include "HC-SR04.H"
uchar num,a;
char flag_time = 0;
long TIME0 = 0, TIME1 = 0; //存放时间的函数
long distance=0; //初始化超声波距离为0
uchar CSB_table[7]; //用于超声波显示函数
//uchar ge,shi,bai,qian; //定义显示的位数
/********************************数组*********************************/
uchar table[10]={"0123456789"};
/******************************蜂鸣器端口定义*********************************/
//#define beep0 P2DIR|=BIT5,P2OUT&=~BIT5 //BEEP=0;
//#define beep1 P2DIR|=BIT5,P2OUT|=BIT5 //BEEP=1;
/********************************时钟初始化*********************/
void CLK_Init(void)
{
WDTCTL = WDTPW + WDTHOLD; //关看门狗
if (CALBC1_8MHZ ==0xFF || CALDCO_8MHZ == 0xFF)
{
while(1);
}
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
BCSCTL3 |= LFXT1S_0;
BCSCTL2 |= DIVS_3; // SMCLK = DCO8M/8=1M
}
/***********************************延时函数****************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void uart_init()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P1DIR |= BIT2; // P1.2 输出模式
P1OUT |= BIT2; // P1.2 置高电平
//P1DIR &= ~BIT1;
P1SEL |= BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD 串口功能选择 p1sel和p1sel2都要置位
P1SEL2 |= BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK 时钟选择
UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE + UCA0TXIE; // 使能 USCI_A0 RX TX 中断
}
/********************************端口初始化*********************/
void GPIO_Init(void)
{
P1SEL|=BIT1; //P1.1作为捕获输入 副功能
P1DIR&=~BIT1; //P1.1作为捕获输入( 上升下降都捕获)CCI1A TA1 CCRO
P1DIR|=BIT0+BIT2;
P1SEL|=BIT4; //P1.4作为OUT2输出 副功能
P1DIR|=BIT4; //1.4为输出
// P2SEL|=BIT5;//蜂鸣器输出端口
//P2DIR|=BIT5; //2.5为输出
}
//蜂鸣器报警
/*void beep()
{
for(a=0;a<5;a++)
{
beep0;
delay(200);
beep1;
delay(200);
}
}*/
/********************************定时器TIMER初始化函数*********************/
void TIMER_Init(void)
{
TA1CTL |= TASSEL1 + MC_1+TACLR+TAIE; //SMCLK作为时钟源,连续计数模式 计数器清零 开溢出中断
TA1CCTL1 |= CM_3 + CCIS_0 + SCS + CAP + CCIE; //上升沿与下降沿都捕获, CCI1A 同步 输入 P2.1 使能中断
TA1CCR0=5520;
TA1CCTL2|=OUTMOD_3; //TA1CCR2 连续 p2.4 复位置位
TA1CCR2=5510; ///模式3 复位置位
}
/******************************************************************************/
void main(void)
{
CLK_Init(); //时钟初始化
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//P2DIR = 0xff;
GPIO_Init(); //端口初始化
TIMER_Init(); //定时器TIMER初始化函数
//uart_init(); //串口初始化
LCD_init(); //初始化液晶
LCD_clear();
while(1)
{
//LCD_write_english_string(10,3,"--------");
//LCD_write_english_string(1,1,CSB_table);
//LCD_set_XY(3,3);
//LCD_write_byte(CSB_table[3]);
//这是昨天我自己写的驱动函数,倒着看数据
LCD_write_shuju(10,2,CSB_table[0]);
LCD_write_shuju(11,2,CSB_table[1]);
LCD_write_shuju(12,2,CSB_table[2]);
LCD_write_shuju(13,2,CSB_table[3]);
LPM0;
}
_EINT(); //CSB中断使能()
}
#pragma vector = TIMER1_A0_VECTOR
__interrupt void TIMER1_A0(void)
{
if (flag_time == 0) //时间标志位
{
TIME0 = TA1CCR0; //数据等于定时器捕获比较寄存器0
flag_time ++; //时间标志位++
}
else
{
TIME1 = TA1CCR0; //数据等于定时器捕获比较寄存器0
flag_time = 0; //再赋为0
if (TIME1 > TIME0)
{
TIME1 = TIME1 - TIME0;
}
else
{
TIME1 = TIME1 + (65535 - TIME0);
}
//将数据赋给distance
//distance = TIME1*170/1000000*100; // 数据 CM 为单位
distance = TIME1*170/1000000*100; // 数据 mm 为单位
//=======这里确定精度==================
//========这里显示=====================
//if(distance>=1) //精确度为1CM
//{
//beep();
CSB_table[0]=distance % 10+48;
CSB_table[1]=(distance/10) % 10+48;
CSB_table[2]=(distance/10000) % 10+48;
CSB_table[3]=(distance/100000) % 10+48;
//init();
//LCD_init(); //初始化液晶
//LCD_clear();
//LCD_set_XY(0,0);
//LCD_write_char('n');
//LCD_write_chinese_string(0,4,12,7,4,0); //宁波单片机开发
/*write_com(0x80);
write_date('L');
write_date('=');
write_date(table[qian]);
write_date(table[bai]);
write_date(table[shi]);
write_date(table[ge]);
write_date('C');
write_date('M');*/
}
/*if(distance<1)
{
//LCD_init(); //初始化液晶
//LCD_clear();
//LCD_set_XY(1,1);
//LCD_write_char('M');
init();
write_com(0x80);
write_date('L');
write_date('=');
write_date(table[0]);
write_date(table[0]);
write_date(table[0]);
write_date(table[0]);
write_date('C');
write_date('M');
//}*/
//}
}
|
|