已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
A/D转换实验一、转换原理MSP430F149的A/D转换器原理请参考相关书籍。实验板上与AD相关的硬件电路: 编程工作实际就是对以下寄存器的操作:寄存器类型寄存器缩写寄存器的含义转换控制寄存器ADC12CTL0转换控制寄存器0ADC12CTL1转换控制寄存器1中 断控制寄存器ADC12IFG中断标志寄存器ADC12IE中断使能寄存器ADC12IV中断向量寄存器存 储及其控制寄存器ADC12MCTL0 ADC12MCTL15存储控制寄存器015ADC12MEM0 ADC12MEM15存储寄存器015设计主程序和中断服务程序。二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。“main.c”主程序与中断程序:/*程序功能:将ADC对P6.0端口电压的转换结果按转换数据和对应的 模拟电压的形式通过串口发送到PC机屏幕上显示-通信格式:N.8.1, 9600-测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据*/#include #include allfunc.h#include UART0_Func.c#include ADC_Func.c#define Num_of_Results 32uint resultsNum_of_Results; /保存ADC转换结果的数组uint average;uchar tcnt = 0;/*主函数*/void main( void ) uchar i; uchar buffer5; WDTCTL = WDTPW + WDTHOLD; /关狗 /*下面六行程序关闭所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; P6DIR |= BIT2;P6OUT |= BIT2; /关闭电平转换 P6DIR|=BIT6;P6OUT&=BIT6; /关闭数码管显示 InitUART(); Init_ADC(); _EINT(); buffer4 = 0; while(1) LPM1; Hex2Dec(average,buffer); for(i = 0; i 4; i+) bufferi += 0x30; PutString0(The digital value is: ); PutString(buffer); Trans_val(average,buffer); buffer3 = buffer2; buffer2 = buffer1; buffer1 = 0x2e - 0x30; for(i = 0; i 4; i+) bufferi += 0x30; PutString0(The analog value is: ); PutString(buffer); /*函数名称:ADC12ISR功 能:ADC中断服务函数,在这里用多次平均的 计算P6.0口的模拟电压数值参 数:无 返回值 :无*/#pragma vector=ADC_VECTOR_interrupt void ADC12ISR (void) static uchar index = 0; resultsindex+ = ADC12MEM0; / Move results if(index = Num_of_Results) uchar i; average = 0; for(i = 0; i = 5; /除以32 index = 0; tcnt+; if(tcnt = 250) /主要是降低串口发送速度 LPM1_EXIT; tcnt = 0; “ADC_Func.c” A/D转换相关程序:#include typedef unsigned int uint;/*函数名称:Init_ADC功 能:初始化ADC参 数:无返回值 :无*/void Init_ADC(void) P6SEL |= 0x01; / 使能ADC通道 ADC12CTL0 = ADC12ON+SHT0_15+MSC; / 打开ADC,设置采样时间 ADC12CTL1 = SHP+CONSEQ_2; / 使用采样定时器 ADC12IE = 0x01; / 使能ADC中断 ADC12CTL0 |= ENC; / 使能转换 ADC12CTL0 |= ADC12SC; / 开始转换/*函数名称:Hex2Dec功 能:将16进制ADC转换数据变换成十进制 表示形式参 数:Hex_Val-16进制数据 ptr-指向存放转换结果的指针返回值 :无*/void Hex2Dec(uint Hex_val,uchar *ptr) ptr0 = Hex_val / 1000; ptr1 = (Hex_val - ptr0*1000)/100; ptr2 = (Hex_val - ptr0*1000 - ptr1*100)/10; ptr3 = (Hex_val - ptr0*1000 - ptr1*100 - ptr2*10); /*函数名称:Trans_val功 能:将16进制ADC转换数据变换成三位10进制 真实的模拟电压数据,并在液晶上显示参 数:Hex_Val-16进制数据 返回值 :无*/void Trans_val(uint Hex_Val,uchar *ptr) unsigned long caltmp; uint Curr_Volt; uchar t1; caltmp = Hex_Val; caltmp = (caltmp 5) + Hex_Val; /caltmp = Hex_Val * 33 caltmp = (caltmp 3) + (caltmp 12; /Curr_Volt = caltmp / 2n ptr0 = Curr_Volt / 100; /Hex-Dec变换 t1 = Curr_Volt - (ptr0 * 100); ptr1 = t1 / 10; ptr2 = t1 - (ptr1 * 10);“UART0_Func.c”串口程序:#include typedef unsigned char uchar;/*函数名称:InitUART功 能:初始化UART端口参 数:无返回值 :无*/void InitUART(void) P3SEL |= 0x30; / P3.4,5 = USART0 TXD/RXD ME1 |= URXE0 + UTXE0; / Enable USART0 T/RXD UCTL0 |= CHAR; / 8-bit character UTCTL0 |= SSEL0; / UCLK = ACLK UBR00 = 0x03; / 32k/9600 - 3.41 UBR10 = 0x00; / UMCTL0 = 0x4A; / Modulation UCTL0 &= SWRST; / Initialize USART state machine/*函数名称:Send1Char功 能:向PC机发送一个字符参 数:sendchar-要发送的字符返回值 :无*/void Send1Char(uchar sendchar) while (!(IFG1 & UTXIFG0); /等待发送寄存器为空 TXBUF0 = sendchar; /*函数名称:PutSting功 能:向PC机发送字符串并换行指令参 数:ptr-指向发送字符串的指针返回值 :无*/void PutString(uchar *ptr) while(*ptr != 0) Send1Char(*ptr+); / 发送数据 while (!(IFG1 & UTXIFG0); TXBUF0 = n; /发送换行指令/*函数名称:PutSting0功 能:向PC机发送字符串,无换行参 数:ptr-指向发送字符串的指针返回值 :无*/void PutString0(uchar *ptr) while(*ptr != 0) Send1Char(*ptr+); / 发送数据 2、程序2:转换结果显示在1602显示模块上“main.c”程序#include #include cry1602.htypedef unsigned char uchar;typedef unsigned int uint;/*宏定义*/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=BIT3; /RS = P6.3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=BIT4;/RW = P6.4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=BIT5;/EN = P6.5#define SET_EN P6OUT|=BIT5;/*函数名称:DispNchar功 能:让液晶从某个位置起连续显示N个字符参 数:x-位置的列坐标 y-位置的行坐标 n-字符个数 ptr-指向字符存放位置的指针返回值 :无*/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i; for (i=0;in;i+)Disp1Char(x+,y,ptri);if (x = 0x0f) x = 0; y = 1;/*函数名称:LocateXY功 能:向液晶输入显示字符位置的坐标信息参 数:x-位置的列坐标 y-位置的行坐标返回值 :无*/void LocateXY(uchar x,uchar y) uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; /如果在第2行temp |= 0x80; LcdWriteCommand(temp,1);/*函数名称:Disp1Char功 能:在某个位置显示一个字符参 数:x-位置的列坐标 y-位置的行坐标 data-显示的字符数据返回值 :无*/void Disp1Char(uchar x,uchar y,uchar data) LocateXY( x, y );LcdWriteData( data );/*函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值 :无*/void LcdReset(void) CtrlDir |= 0x07; /控制线端口设为输出状态 DataDir = 0xFF; /数据端口设为输出状态 LcdWriteCommand(0x38, 0); /规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);/显示模式设置 LcdWriteCommand(0x08, 1);/显示关闭 LcdWriteCommand(0x01, 1); /显示清屏LcdWriteCommand(0x06, 1);/写字符时整体不移动LcdWriteCommand(0x0c, 1);/显示开,不开游标,不闪烁/*函数名称:LcdWriteCommand功 能:向液晶模块写入命令参 数:cmd-命令, chk-是否判忙的标志,1:判忙,0:不判返回值 :无*/void LcdWriteCommand(uchar cmd,uchar chk) if (chk) WaitForEnable(); / 检测忙信号?CLR_RS;CLR_RW; _NOP();DataPort = cmd; /将命令字写入数据端口 _NOP();SET_EN; /产生使能脉冲信号_NOP();_NOP();CLR_EN;/*函数名称:LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数:data-显示字符数据返回值 :无*/void LcdWriteData( uchar data ) WaitForEnable(); /等待液晶不忙SET_RS;CLR_RW; _NOP(); DataPort = data; /将显示数据写入数据端口 _NOP();SET_EN; /产生使能脉冲信号_NOP(); _NOP(); CLR_EN;/*函数名称:WaitForEnable功 能:等待1602液晶完成内部操作参 数:无返回值 :无*/void WaitForEnable(void) P2DIR &= 0x00; /将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN; _NOP();_NOP();while(P2IN & Busy)!=0); /检测忙标志CLR_EN; P2DIR |= 0xFF; /将P4口切换为输出状态 /*函数名称:Delay5ms功 能:延时约5ms参 数:无返回值 :无*/void Delay5ms(void) uint i=40000; while (i != 0) i-; /*函数名称:Delay400ms功 能:延时约400ms参 数:无返回值 :无*/void Delay400ms(void) uchar i=50;uint j; while(i-)j=7269;while(j-);“cry1602.c”程序#include #include cry1602.htypedef unsigned char uchar;typedef unsigned int uint;/*宏定义*/#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=BIT3; /RS = P6.3#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=BIT4;/RW = P6.4#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=BIT5;/EN = P6.5#define SET_EN P6OUT|=BIT5;/*函数名称:DispNchar功 能:让液晶从某个位置起连续显示N个字符参 数:x-位置的列坐标 y-位置的行坐标 n-字符个数 ptr-指向字符存放位置的指针返回值 :无*/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i; for (i=0;in;i+)Disp1Char(x+,y,ptri);if (x = 0x0f) x = 0; y = 1;/*函数名称:LocateXY功 能:向液晶输入显示字符位置的坐标信息参 数:x-位置的列坐标 y-位置的行坐标返回值 :无*/void LocateXY(uchar x,uchar y) uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; /如果在第2行temp |= 0x80; LcdWriteCommand(temp,1);/*函数名称:Disp1Char功 能:在某个位置显示一个字符参 数:x-位置的列坐标 y-位置的行坐标 data-显示的字符数据返回值 :无*/void Disp1Char(uchar x,uchar y,uchar data) LocateXY( x, y );LcdWriteData( data );/*函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值 :无*/void LcdReset(void) CtrlDir |= 0x07; /控制线端口设为输出状态 DataDir = 0xFF; /数据端口设为输出状态 LcdWriteCommand(0x38, 0); /规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);/显示模式设置 LcdWriteCommand(0x08, 1);/显示关闭 LcdWriteCommand(0x01, 1); /显示清屏LcdWriteCommand(0x06, 1);/写字符时整体不移动LcdWriteCommand(0x0c, 1);/显示开,不开游标,不闪烁/*函数名称:LcdWriteCommand功 能:向液晶模块写入命令参 数:cmd-命令, chk-是否判忙的标志,1:判忙,0:不判返回值 :无*/void LcdW
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届浙江省杭州市杭六中学初三第二次诊断性测试化学试题试卷含解析
- 滁州凤阳县联考2026年初三摸底考试化学试题含解析
- 2026年道路沿线边坡治理工程(挡墙 护坡 绿化)设计指南
- 2026年量子 AI双向赋能:从算法融合到算力协同
- 2026年无线监护设备数据加密传输网络安全防护技术方案
- 2026年委托人死亡后委托关系终止对信托影响分析
- 2025年临床医学专业内科学基础测试卷
- 电子商务高级项目经理面试问题
- 如何从初级到高级:产品经理的职业路径解析
- 综合体智能化设施的运行和维护方案介绍
- 2026江苏盐城建湖县司法局选聘法律助理2人考试备考试题及答案解析
- 2025年保安员考试题(含答案)
- 2026广东广州市海珠区瑞宝街道招聘雇员16人考试参考试题及答案解析
- 统编版|五年级下册语文全册教案(含教学反思)
- 2025年湖南生物机电职业技术学院单招综合素质考试题库及答案解析
- 2026年乌兰察布职业学院单招职业技能测试题库含答案详解(新)
- 第三方支付外包服务合作相关制度
- 档案数字化加工考核制度
- 2026年及未来5年市场数据中国电炉钢行业市场全景监测及投资战略咨询报告
- 私宴服务礼仪培训
- 2026年商业银行支行行长竞聘管理能力面试问题含答案
评论
0/150
提交评论