功能
采用P1.4作为ADC输入通道,采集流量,显示到oled,并串口发送。
硬件
//OLED
// SCL接P2^0
// SDA接P2^1
//vcc接VCC
//GND接GND
//串口
//P1.1 = RXD, P1.2=TXD
//P1.1接模块的TX P1.2接模块的RX 反着接
//ADC通道
//采用P1.4作为ADC输入通道
//可以接3.3V以下的电平
部分程序
int main(void) {WDTCTL = WDTPW + WDTHOLD; /* Stop WDT *///16Mhzif (CALBC1_16MHZ==0xFF) // If calibration constant erased{while(1); // do not load, trap CPU!!}DCOCTL = 0; // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_16MHZ; // Set rangeDCOCTL = CALDCO_16MHZ; // Set DCO step + modulation*/OLED_Init(); /* OLED初始化 */ADC10CTL0 = ADC10SHT_0 + ADC10ON + ADC10IE; // 采样速率:4 x ADC10CLKs 打开讷河 打开中断/* 定时器0 检测按键的 */CCTL0 = CCIE;TACCR0 = 32768; /* 1000 MS */TACTL = TASSEL_1 + MC_1;//(1) 设置为输入P1DIR &= ~BIT3; // P1.5引脚为输入//(2)使能上下拉P1REN |= BIT3; // 打开使能上拉或者下拉//(2)设置为上拉P1OUT |= BIT3; // 上拉//(3)选中断边沿P1IES &= ~BIT3; // 触发中断为 上升//(4)启动中断使能P1IE |= BIT3; // 中断使能//(5)清零中断标志P1IFG &= ~BIT3; // 中断标志清零//串口设置P1DIR |= BIT2;P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXDUCA0CTL1 |= UCSSEL_1; // CLK = ACLKUCA0BR0 = 0x03; // 32kHz/9600 = 3.41UCA0BR1 = 0x00; //send_string("manle huidao 0 \r\n");_EINT();while (1) {LPM0;dis_num_6(); //刷新显示}
}// 中断服务函数
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void) {if (xianshi_choose == 0) {xianshi_choose = 1;} else {xianshi_choose = 0;}P1IFG &= ~BIT3; // 手动软件清除中断标志才能退出中断函数//这里可以编写按键后想要执行的程序LPM0_EXIT;
}/* 1S钟执行一次这个函数 */
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void) {ADC10CTL0 |= ENC + ADC10SC; // 软件打开转换 转换开始
}// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void) {bufa = (float) ADC10MEM; //读取采样结果 放在bu变量中liusu = (u32) ((bufa * 1.0 / 1024 * 4) * 10);//bufa值是0到1023 对应到4L/S 因为要保留1位小数 乘以10 显示到LED后有小数leijiliang += liusu; //每一秒的流速单位就是 L/S 一秒算多少升 加到累积量上if (leijiliang > 100000) {leijiliang = 0;send_string("manle huidao 0 \r\n");}send_liuliang_andleiji();LPM0_EXIT;
}
全部代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2