历史上的今天
今天是:2025年07月24日(星期四)
2020年07月24日 | MSP430单片机制作智能数字万用表
2020-07-24 来源:51hei
电路原理图如下:
单片机源程序如下:
/*
* 简易低功耗万用表
*/
#include #include "LCD12864P.h" unsigned int ADC_flag,ADC_flag1,shua_xin; unsigned int ADC_data[8],ADC_result[8],mser,song,liang_cheng = 0,s,wen_pt,pt100 = 0,zu_zhi = 0; unsigned int data0,data1,data2,data3,data4,data5,data6,data7; //double data0,data1,data2,data3,data4,data5,data6,data7; unsigned int table[]={0x00,0x02,0x01,0x04,0x08,0xEF,0xdf,0xcf,0x80};//量程选择 【1】直流10v 【2】直流1v 【3】电阻值10k /* *初始化 */ void int_t() { WDTCTL = WDT_MDLY_8; //看门狗定时器的初始化设置 IE1 |= WDTIE; Ini_Lcd(); //lcd初始化 BCSCTL1 = CALBC1_8MHZ; DCOCTL = CALDCO_8MHZ; /* P1DIR &= BIT3+BIT4;/////////将按键口设置为输入 P1REN |= BIT3+BIT4;////////打开上拉电阻,目的为产生触发沿高电平往低电平 P1IE |= 0X18;//////////设置按键口中断 P1IES |= 0X18;///////////下降沿中断。只有在松手时触发中断的产生 */ P1DIR &= BIT3;/////////将按键口设置为输入 P1REN |= BIT3;////////打开上拉电阻,目的为产生触发沿高电平往低电平 P1IE |= 0X08;//////////设置按键口中断 P1IES |= 0X08;///////////下降沿中断。只有在松手时触发中断的产生 P2DIR &= ~(BIT2+BIT3+BIT4+BIT5);/////////将功能选择按键口设置为输入 1.直流电压 2.交流电压 3.电阻量程 4.电容测量 P1DIR |= BIT5 + BIT6 + BIT7 ; // 将扩展口为输出 _EINT(); //使能中断,这是一个C编译器支持的内部过程。 } /* * 按键延时程序 */ void delay(unsigned int n)//带参数有返回值的函数 { unsigned int i; unsigned int j; for(i=n;i>0;i--) for(j=100;j>0;j--) _nop(); } /************************************************************** *名称:ADC() *功能:AD设置转换 中断 ****************************************************************/ void ADC() { P1SEL |= BIT0 + BIT1 + BIT2 + BIT4;//+ BIT3;//+ BIT4 + BIT5 + BIT6 + BIT7; //设置为模拟输入 ADC10AE0 |= BIT0 + BIT1 + BIT2+ BIT4;// + BIT3;//+ BIT4 + BIT5 + BIT6 + BIT7; //开启通道A1/A2/A4/A5/A6/A7 ADC10CTL0|=ADC10ON+MSC+ADC10SHT_2+ADC10IE; //打开ADC转换 ,ADC10使能 ,设置采用频率16个周期,允许中断 ADC10CTL0 |=SREF_1 + REFON + REF2_5V; //开内部参考电压为2.5V,允许中断 ADC10CTL1|=CONSEQ_3+INCH_7; //使用双(4)通道、循环采集模式 ADC10DTC1|=0x08; //每一通道连续采样1次 _BIS_SR(GIE); } /* *功能:AD数据处理 */ void ADC_DATA() { unsigned char i; ADC10CTL0&=~ENC; while(ADC10CTL1&ADC10BUSY); //检测AD是否繁忙 ADC10CTL0|=ENC+ADC10SC; //启动ADC ADC10SA=(unsigned int)ADC_result; //获取ADC_result[]的首地址。首先对A1、A0采样,放入ADC_result[0]和ADC_result[1]中,如此循环下去。 for(i=0;i<8;i++) { ADC_data[i]=0; ADC_data[i]=ADC_result[i]; // ADC_data[i]=(ADC_data[i]*25)/1023; //将ADC转换成实际的电压值 } } /* * 扩展芯片595写入程序 */ void kuo_zhan(unsigned int dat) { unsigned int i; for(i=0;i<8;i++) { if((dat< P1OUT|=BIT5; else P1OUT &= ~BIT5; P1OUT &= ~BIT7; _NOP(); P1OUT |= BIT7; _NOP(); } P1OUT &= ~BIT6; _NOP(); P1OUT |= BIT6; _NOP(); } /* * 直流电压检测 */ void zhi_liu() { unsigned int song_chao; lcd_pos(1,0); Disp_HZ("★低功耗万用表★",8); lcd_pos(2,0); Disp_HZ("直流电压",4); lcd_pos(3,0); Disp_HZ("测量量程",4); lcd_pos(4,0); Disp_HZ("测量电压",4); if(liang_cheng == 1) //量程为10v的时候数据处理 { kuo_zhan(table[1]); //打开10v通道 song_chao = data0*5.8585*0.002443*100; // if(ADC_flag1 == 1) { ADC_flag1 = 0; lcd_pos(3,5); Disp_SZ(10/10); Disp_SZ(10%10); lcd_pos(3,6); Disp_HZ("V",1); lcd_pos(4,5); Disp_SZ(song_chao/1000); Disp_SZ(song_chao%1000/100); Disp_SZ(song_chao%100/10); Disp_SZ(song_chao%10); lcd_pos(4,7); Disp_HZ("V",1); } } else if(liang_cheng == 2) //量程为10v的时候数据处理 { kuo_zhan(table[2]); //打开10v通道 song_chao = data0*1.9825*0.002443*1000; // if(ADC_flag1 == 1) { ADC_flag1 = 0; lcd_pos(3,5); Disp_SZ(01/10); Disp_SZ(01%10);
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 1.有线电视数字机顶盒的基本原理 有线电视数字机顶盒的基本功能是接收数字电视广播节目,示意图如图1所示,调谐模块接收射频信号并下变频为中频信号,然后进行A/D转换变为数字信号,再送 ...… 查看全部问答> |
|
cygwin安装mips编译器后不识别库函数,请高手指教,谢谢! cygwin下安装了mips的编译器,但不能识别函数,即使写一个“Hello World”,使用mips-elf-gcc编译时也会提示“undefined reference to `printf\'”,直接用gcc编译就没问题。不知是何原因,望高手指教,谢谢!… 查看全部问答> |
|
我是wince的初学者,以前没有接触过,对于我问的小白问题大家请不要介意,给我点明就好 ,谢谢了 我要做一个项目,这个项目就是用wince5.0实现 gps导航功能应用程序方面用mapx插件做。 主要是我这里只有蓝牙gps模块,所以在编译内核的时候要 ...… 查看全部问答> |
|
最近需要写个读写SMBUS设备的寄存器的程序,好象挂在SMBUS上的各类设备都有自己固定的SLAVE ADDRESS,所以想问下是否有相关的资料记录了各类设备预先分配好的地址,如果有相关资料的话,是否可以提供下哪里下载?比如SPD的SLAVE ADDRESS为A0,A2,A4 ...… 查看全部问答> |
|
最近被要求看DSP库.也不知道是干啥..信号与系统当时学就没明白..现在只能摸石头过河了..额..话说好像一直都是在摸石头过河...看了小一天.现在感觉FFT的意义就是吧时域下的信号(横轴是时间.纵轴幅度)变换成频域下(横轴是频率.纵轴是幅度(幅度=sqrt( ...… 查看全部问答> |




