收藏 分销(赏)

基于msp430g2553单片机ADC测量外部直流电压.doc

上传人:快乐****生活 文档编号:9944388 上传时间:2025-04-14 格式:DOC 页数:13 大小:35.54KB 下载积分:8 金币
下载 相关 举报
基于msp430g2553单片机ADC测量外部直流电压.doc_第1页
第1页 / 共13页
基于msp430g2553单片机ADC测量外部直流电压.doc_第2页
第2页 / 共13页


点击查看更多>>
资源描述
#include<msp430g2553.h> #define uchar unsigned char #define uint unsigned int #define LCD_CON_DIR  P2DIR #define LCD_CON_IN   P2IN #define LCD_CON_OUT P2OUT #define LCD_RS     BIT0 //p2.5接51 p2.5 #define LCD_RW     BIT1  //p2.0接51 p2.6 #define LCD_EN  BIT2  //p2.1接51 p2.7 #define LCD_DATA_DIR  P1DIR #define LCD_DATA_IN   P1IN #define LCD_DATA_OUT P1OUT #define A 1000 #define B 100 #define X 10 void InitOsc(void); void InitLCD(void); void write_command(uchar command); void write_data(uchar data); void Display_ZFC(uchar *s); void LCD_Set_xy(uchar x,uchar y); void Trans_val(uint Hex_Val); void Display_Volte(uint Hex_Val); void Measure_Volte(void); uchar num[]={".v"}; uchar volte[]={"Volt:     "}; uint index=0; int i; unsigned long sum=0; uint Hex_Val; #define Num_of_Results 32 uint results[Num_of_Results];    //保存ADC转换成果旳数组 uint average; /****************************************************************************        ADC初始化 *****************************************************************************/ void ADC_Init(void) {   ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE;  // ADC10ON, interrupt enabled    ADC10CTL1 = INCH_1;                // input A1  ADC10AE0 |= 0x02;              //二次采集 } /****************************************************************************     DCO时钟初始化  设为1MHz *****************************************************************************/ void DCO_Init(void) { if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF) ﻩﻩ{ ﻩﻩﻩwhile(1); } BCSCTL1 = CALBC1_1MHZ; ﻩDCOCTL = CALDCO_1MHZ; ﻩBCSCTL2 = SELM_0 +DIVM_0; } /****************************************************************************                              向12864发送字节 *****************************************************************************/ void SendByte(uchar Zdata) { uint i; ﻩfor(i=0; i<8; i++) { ﻩﻩif((Zdata << i) & 0x80) ﻩ{ ﻩﻩﻩLCD_CON_OUT |= LCD_RW;          //clk始终信号为高 ﻩﻩ} ﻩﻩelse ﻩ{ ﻩ LCD_CON_OUT &=~LCD_RW;       //clk始终信号为低 ﻩﻩ} ﻩﻩLCD_CON_OUT &= ~LCD_EN; ﻩ LCD_CON_OUT |= LCD_EN; ﻩ} } /****************************************************************************                                      向12864写命令 *****************************************************************************/ void write_command(uchar command) { LCD_CON_OUT |= LCD_RS; ﻩSendByte(0xF8); ﻩSendByte(command & 0xF0); SendByte((command<<4)&0xF0); ﻩ_delay_cycles(200); } /****************************************************************************           向12864写数据 *****************************************************************************/ void write_data(uchar data) { ﻩLCD_CON_OUT |= LCD_RS; ﻩSendByte(0xFA); ﻩSendByte(data & 0xF0); ﻩSendByte((data << 4) & 0xF0); _delay_cycles(200); } void Display_ZFC(uchar  *s) { while(*s > 0)   { ﻩﻩwrite_data(*s); ﻩﻩs++; ﻩﻩ_delay_cycles(5000); } } /****************************************************************************            拟定12864屏幕显示旳坐标位置(x,y) *****************************************************************************/ void LCD_Set_xy( uchar x, uchar y ) {   uchar address; ﻩswitch(x) ﻩ{ ﻩcase 0: address = 0x80 + y; break;   case 1: address = 0x80 + y; break; ﻩﻩcase 2: address = 0x90 + y; break; ﻩ ﻩcase 3: address = 0x88 + y; break; ﻩﻩcase 4: address = 0x98 + y; break; ﻩdefault:address = 0x80 + y; break; ﻩ} write_command(address);            //写入地址命令 } /****************************************************************************                   lcd初始化 *****************************************************************************/ void InitLCD(void) { ﻩLCD_CON_DIR |= 0xFF;                 //p2口定义为输出 ﻩwrite_command(0x01);                    //清屏 ﻩwrite_command(0x30); ﻩ_delay_cycles(5000); write_command(0x0c); ﻩ_delay_cycles(5000); } /****************************************************************************             采集到旳数据转化成电压形式 *****************************************************************************/ void Trans_val(uint Hex_Val) { ﻩunsigned long caltmp; ﻩuint Curr_Volt,volt,max; ﻩuint a[50]; ﻩcaltmp = Hex_Val; caltmp = caltmp*34600;              //caltmp = Hex_Val * 34600 Curr_Volt = caltmp >> 10 ;          //Curr_Volt = caltmp / 2^n     volt = Curr_Volt;    for(i=0;i<50;i++)     {a[i]=volt;} for(max=a[0],i=0;i<50;i++)   {if(a[i]>max)max=a[i];}   Curr_Volt = max;   Display_Volte(Curr_Volt); } /****************************************************************************                         主函数 *****************************************************************************/ void main(void) { ﻩWDTCTL = WDTPW + WDTHOLD; ﻩADC_Init();                    //ADC初始化 ﻩDCO_Init();               //DCO初始化 InitLCD();            //12864液晶初始化 ﻩwhile(1) ﻩ{ ﻩMeasure_Volte();              //测量直流电压值并且显示 ﻩ} } /****************************************************************************                                                                         测量电压 *****************************************************************************/ void Measure_Volte(void) { ﻩ ADC10CTL0 |= ENC + ADC10SC;        // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); ﻩ  results[index++] = ADC10MEM;       // Move results ﻩ  if(index == Num_of_Results)   { ﻩ  index = 0; ﻩ  for(i = 0; i < Num_of_Results; i++)   ﻩ  { ﻩ    ﻩ  sum += results[i];  ﻩ } ﻩ sum >>= 5;             //除以32 ﻩ  ﻩ Trans_val(sum); ﻩ sum=0; ﻩ     } } /****************************************************************************                                                                        显示电压值 *****************************************************************************/ void Display_Volte(uint Hex_Val) { ﻩuint Curr_Volt; Curr_Volt = Hex_Val; ﻩwrite_command(0x90); ﻩfor(i=0;i<16;i++) {write_data(volte[i]);} write_command(0x93); write_data(num[Curr_Volt / 10000]); ﻩwrite_data(num[10]); write_data(num[Curr_Volt % 10000/1000]); ﻩwrite_data(num[Curr_Volt % 10000 % 1000 / 100]); ﻩwrite_data(num[Curr_Volt % 10000 % 1000 % 100 / 10]); write_data(' '); ﻩwrite_data(num[11]); } /****************************************************************************            ADC中断,进入低功耗模式   关闭CPU *****************************************************************************/ #pragma vector=ADC10_VECTOR   __interrupt void ADC10_ISR(void) {    __bic_SR_register_on_exit(CPUOFF);    // Clear CPUOFF bit from 0(SR) }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服