MSP430g2553 LCD1602
基于MSPG和dsb的测温系统
基于M S P G和d s b的测温系统Document number:PBGCG-0857-BTDO-0089-PTT1998嵌入式控制系统与应用课程论文题目: 基于MSP430G2553和ds18b20的测温系统院系名称:专业班级:学生姓名:学号:摘要为了在现实生活和工业生产及过程控制中准确测量温度,设计了一种基于低功耗MSP430单片机的数字温度计,整个系统通过单片机MSP430控制DS18B20读取温度,采用LCD1602显示,温度传感器DS18B20与单片机之间通过串口进行数据传输,且外围的整合性高,DS18B20只需一个端口即可实现数据通信,连接方便,通过多次实验证明,该系统的测试结果与实际环境温度一致,除了具有接口电路简单,测量精度高,误差小,可靠性高等特点外,其成本低,功耗低的特点使其拥有更广阔的应用前景。
关键字:DS18B20 MSP430G2553单片机液晶显示目录1 引言温度的测量和控制在储粮仓库、智能楼宇空调控制及其它的工农业生产和科学研究中应用广泛。
温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结(如AD590)之类的模拟传感器,经信号取样电路、放大电路和模数转换电路处理,获取表示温度值的数字信号,再交由微处理器或DSP处理。
被测温度信号从敏感元件接收的非电模拟量开始,到转换为微处理器可处理的数字信号之间,设计者须考虑的线路环节较多,相应测温装置中元器件数量难以下降,随之影响产品的可靠性及体积微小化。
由此会造成整个检测系统有较大的偏差.稳定性和抗干扰性能都较差。
本文设计一种基于数字温度传感器DSl8820的小型测温系统,主控芯片采用TI公司的MSP430单片机,数字温度传感器通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,可应用于仓库测温、楼宇空调控制和生产过程监控等领域。
2 测温系统硬件构成硬件设计2.1.1 系统硬件设计总方案系统硬件设计总方案如图1所示:图1 硬件设计方框图电源系统由miniUSB输出5V以及芯片LE33组成,实现对MSP430G2553核心处理芯片、LCD1602液晶显示等硬件模块提供所需电源;显示部分由LCD1602液晶对温度进行实时显示;软件设计部分包括模拟串口对DS18B20数据进行读取以及LCD1602液晶的驱动和显示。
基于msp430G2533的LCD1602液晶字符串循环显示课程设计谋画
学号:课程设计题目LCD1602液晶字符串循环显示学院专业班级姓名指导教师2013年1月15 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目要求:利用LaunchPad上的板上资源,外接1602液晶,编写程序使字符串在液晶上循环移动。
时刻安排:2021年元月1日~2021年元月17日下午17:30 指导教师签名:年月日系主任(或责任教师)签名:年月日目录引言 (1)1 课程设计要求 (2)2 硬件电路 (3)2.1 MSP430G2553单片机 (3)2.1.1 MSP430G2553单片机特点 (3)2.1.2 MSP430G2553单片机结构 (3)2.1.3 MSP430G2553的时钟系统 (4)2.1.4 I/O寄放器 (5)2.2 LCD1602液晶屏 (5)3 方案设计 (7)3.1 设计方案 (7)3.2 方案选择 (7)4 程序设计 (8)4.1 程序结构 (8)4.2 主程序源程序 (8)4.3 子程序源程序 (8)4.4 子程序头文件 (12)5 调试 (13)5.1 CCSv5编译软件 (13)5.2 调试进程 (13)6 终止语 (15)附录1:代码 (16)附录2:实物图 (22)参考文献 (23)本科生课程设计成绩评定表 (24)引言本次课程设计旨在设计一个基于MSP430 系列微处置器的LCD1602液晶字符串循环移动。
单片机是一种集成电路芯片,是采纳超大规模集成电路技术把具有数据处置能力的中央处置器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、按时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上组成的一个小而完善的微型运算机系统,在工业操纵领域普遍应用。
现今时期是一个新技术层出不穷的时期,在电子领域尤其是自动化智能操纵领域,传统的分立元件或数字逻辑电路组成的操纵系统,正在以前所未见的速度被单片机智能操纵系统所代替。
基于msp430g2553的1602四线驱动C源码
/*--------------------------------------------------------------*/基于msp430G2553de LCD1602四线驱动由于G2系列的IO口过于少,所以我们采用了四线驱动LCD1602的方法程序附后①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH 时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
msp430g2553多路数据采集器
基于MSP430G2553的多路数据采集班级:科技1201班姓名:石思恩学号:05122015日期:2014/12/10一.实验题目:基于msp430G2553的多路数据采集。
二.实验目的:8通道精密模拟量数据采集器采集8路模拟量输入信号。
任一时刻,多路模拟开关选择其中一路输入信号,该信号通过信号调理电路调理后,送入AD转换器转换成数字量,该数字量在lcd12864显示。
三.实验内容:1.实验原理:在本数据采集系统的设计中为了提高系统智能化、可靠性和实用性,采用单片MCU和上位机传输的方法,即MCU运行在数据采集系统的远端,完成数据的采集、处理、发送和显示,上位机则完成数据的接收、校验及显示,同时上位机可对远端MCU进行控制,使其采集方式可选。
MCU选用TI公司的低功耗MSP430G2553,该单片机比80C51功能要强大许多,他内部不仅有8路12位A/D,而且还带LCD的驱动,节省了不少外围电路。
本系统采用信号发生器产生正弦波,然后由LM358芯片实现对电压的放大,之间还需对信号进行调理以符合系统要求。
2.实验步骤:1.实验系统框图:2.放大电路:3.源程序:#include <MSP430G2553.h>#define uchar unsigned char#define uint unsigned int#define cs_1 P2OUT|=BIT5#define cs_0 P2OUT&=~BIT5#define sid_1 P2OUT|=BIT3#define sid_0 P2OUT&=~BIT3#define en_1 P2OUT|=BIT4#define en_0 P2OUT&=~BIT4uchar num1[8], a[5],m[5],n[5];double result[4],AD_result[4];int position=0;int status=0;int flag=0;int jiaquan=0;float sample;void delayr(void);void delays(void);void adc10_begin();void adc10_ceshi();void temar_ceshi();void adc10_ceshi1();void adc10_ceshi2();const uchar line1[]={"电压为V"};const uchar line2[]={"电压为V"};const uchar line3[]={"电压为V"};const uchar line4[]={"电压为V"};void IO_Init(void){P2SEL=0x00;// 2553将其初始化为晶振输入端,所以要关掉第二功能选择P2DIR|=0xff;//将其置为输出方向P2OUT=0x00;//输出0}void delay(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<100;j++);}void write_cmd(uchar command_data){uchar i;uchar i_data;i_data=0xf8;cs_1;en_0;for(i=0;i<8;i++){if(i_data & 0x80)sid_1;elsesid_0;en_0;en_1;i_data<<=1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++)if(i_data & 0x80)sid_1;elsesid_0;en_0;en_1;i_data<<=1;}i_data=command_data;i_data<<=4;for(i=0;i<8;i++){if(i_data & 0x80)sid_1;elsesid_0;en_0;en_1;i_data<<=1;}cs_0;delay(10);}void write_data(uchar command_data) {uchar i;uchar i_data;i_data=0xfa;cs_1;en_0;for(i=0;i<8;i++){if(i_data & 0x80)sid_1;elsesid_0;en_0;en_1;i_data<<=1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++)if(i_data & 0x80)sid_1;elsesid_0;en_0;en_1;i_data<<=1;}i_data=command_data;i_data<<=4;for(i=0;i<8;i++){if(i_data & 0x80)sid_1;elsesid_0;en_0;en_1;i_data<<=1;}cs_0;delay(10);}void LCD_Init (void){delay(10);write_cmd(0x30);delay(10);write_cmd(0x0c);delay(10);write_cmd(0x01);delay(5);}void LCD_pos(unsigned char X,unsigned char Y) {unsigned char pos;if(X==0)X = 0x80;else if(X==1)X = 0x90;else if(X==2)X = 0x88;else if(X==3)X = 0x98;pos = X + Y;write_cmd(pos);}void Display_Init (void) {unsigned char i;LCD_pos(0,0);i=0;while(line1[i]!= '\0') {write_data(line1[i]);i++;}LCD_pos(1,0);i=0;while(line2[i]!= '\0') {write_data(line2[i]);i++;}LCD_pos(2,0);i=0;while(line3[i]!= '\0') {write_data(line3[i]);i++;}LCD_pos(3,0);i=0;while(line4[i]!= '\0') {write_data(line4[i]);i++;}}void ADC10_init(){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP2SEL=0x00;P2DIR |= 0xff; // Set P1.0 to output directionP1DIR |= 0x38;P1SEL|=BIT0+BIT1+BIT2;ADC10AE0|=BIT0+BIT1+BIT2+BIT5; // 使P1.0允许AD模拟输入信号ADC10CTL0=ADC10ON+MSC+SREF_0;//+REFON 开AD内核,选择电源为参考电压ADC10CTL1=ADC10SSEL_0+CONSEQ_0; //+INCH_1+INCH_2 选择ADC12SC为触发源,选择系统时钟为AD内核时钟,采用单通道多次采用}void adc10_begin(void){ADC10CTL1|=INCH_0;ADC10CTL0|=ADC10SC+ENC; // 开始转换开转换允许while(ADC10CTL1&ADC10BUSY!=0);//判断是否转换完毕result[0]= ADC10MEM;AD_result[0]=(result[0]/1024)*3.485;ADC10CTL0&=~(ADC10SC+ENC); //关转换允许才能选择通道ADC10CTL1&=~INCH_0; //通道清0ADC10CTL1|=INCH_1;ADC10CTL0|=ADC10SC+ENC;while(ADC10CTL1&ADC10BUSY!=0);result[1]= ADC10MEM;AD_result[1]=(result[1]/1024)*3.485;ADC10CTL0&=~(ADC10SC+ENC);ADC10CTL1&=~INCH_1;ADC10CTL1|=INCH_2;ADC10CTL0|=ADC10SC+ENC;while(ADC10CTL1&ADC10BUSY!=0);result[2]= ADC10MEM;AD_result[2]=(result[2]/1024)*3.485;ADC10CTL0&=~(ADC10SC+ENC);ADC10CTL1&=~INCH_2;ADC10CTL1|=INCH_5;ADC10CTL0|=ADC10SC+ENC; // 开始转换开转换允许while(ADC10CTL1&ADC10BUSY!=0);//判断是否转换完毕result[3]= ADC10MEM;AD_result[3]=(result[3]/1024)*3.485;ADC10CTL0&=~(ADC10SC+ENC); //关转换允许才能选择通道ADC10CTL1&=~INCH_5; //通道清0}void adc10_ceshi(void){uchar p,q,e;ADC10_init();adc10_begin();a[0]=(int)AD_result[0];a[1]=a[0]%10;a[2]=(int)((AD_result[0]-a[0])*10);a[3]=(int)(AD_result[0]*100)%10;a[4]=(int)(AD_result[0]*1000)%10;LCD_pos(0,5);for(p=0;p<4;p++){write_data(a[p]);}delay(2000);m[0]=(int)AD_result[1];m[1]=m[0]%10;m[2]=(int)((AD_result[1]-m[0])*10);m[3]=(int)(AD_result[1]*100)%10;m[4]=(int)(AD_result[1]*1000)%10;LCD_pos(1,5);for(e=0;e<4;e++){write_data(m[p]);}delay(2000);n[0]=(int)AD_result[2];n[1]=n[0]%10;n[2]=(int)((AD_result[2]-n[0])*10);n[3]=(int)(AD_result[2]*100)%10;n[4]=(int)(AD_result[2]*1000)%10;LCD_pos(2,5);for(q=0;q<4;q++){write_data(n[p]);}delay(2000);}void main(){WDTCTL = WDTPW+WDTHOLD;//关闭看门狗IO_Init();LCD_Init();Display_Init();//对LCD进行初始化,设置一个开机初始化显示_EINT();while(1){temar_ceshi();delay(1000);ADC10CTL0&=~(ADC10SC+ENC); //关转换允许才能选择通道ADC10CTL1&=~INCH_0; //通道清0adc10_ceshi();delay(1000);ADC10CTL0&=~(ADC10SC+ENC); //关转换允许才能选择通道ADC10CTL1&=~INCH_1; //通道清0temar_ceshi1();delay(1000);ADC10CTL0&=~(ADC10SC+ENC); //关转换允许才能选择通道ADC10CTL1&=~INCH_2; //通道清0adc10_ceshi1();delay(1000);ADC10CTL0&=~(ADC10SC+ENC); //关转换允许才能选择通道ADC10CTL1&=~INCH_3; //通道清0 }}void delayr(void){unsigned long data_delay;for(data_delay=0;data_delay<100000;data_delay++){}}void delays(void){unsigned long data_delay;for(data_delay=0;data_delay<167935;data_delay++){}}#pragma vector=TIMER0_A1_VECTOR__interrupt void TIMER0_A1(void){TACTL &= ~TAIFG;jiaquan++;}四、试验运行结果:五、实验中遇到的问题及解决方法:1.测试时不能实现多路采集,只能采一组。
msp430g2553测频率以及测峰值
msp430g2553测频率以及测峰值电子设计综合实验项目报告项目名称:MCU交流电压参数测量小组成员:林伊、武正浩学号:20111112、20111201项目要求题目:交流电压参数的测量 要求:用给定的MCU:msp430g2553,制作交流电压参数测试设备图表 1基本要求:一、 用给定运放LM324制作一放大器 a) 增益大于:20dBb) 带宽大于:100KHz二、 用指定MCU 和已制作的放大器制作频率计a) 测量范围:10Hz~100KHzb) 显示:3位以上信号放大 A/D比较器 指定MCUMSP430发挥部分:一、用A/D测量已给电压的幅度,信号由已制作的放大器输入a)测量范围:输入信号越小越好实现思路放大:首先分析题目要求,要实现放大20dB,频率1~100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大10倍必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。
通过数据手册得知其增益带宽积为6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为反向比例放大电路,见Figure 1Figure 1频率:实现频率的测量,这一块需使用到MCU,测量频率的方法有很多种,通过捕捉上升沿下降沿产生中断,也可以不产生中断,还可通过时钟计数。
其中通过捕捉上升沿下降沿的思路又分两种,1、检测上升沿后再检测下一个上升沿(检测下降沿后再检测下一个下降沿)2、检测上升沿后再检测下降沿(检测下降沿后再检测上升沿)。
这些思路对应不同的采集方法又可以细分,其中方案1对于测量高频信号有着较好的效果,方案2对于测低频的信号较好,前提是占空比为50%,若不为则变为测脉宽。
这次的题目我采用的是用时钟计数的方式,msp430g2553中含有2个时钟,timer0和timer1,每个时钟都有如下功能,选择时钟来源:1、外部时钟(即外部输入的方波信号)2、ACLK 3、smclk等。
MSP430G2553学习笔记(数据手册)概要
MSP430G2553学习笔记(数据手册)MSP430G2553性能参数(DIP-20) 工作电压范围:1.8~3.6V。
5种低功耗模式。
16位的RISC结构,62.5ns指令周期。
超低功耗:运行模式-230µA;待机模式-0.5µA;关闭模式-0.1µA;可以在不到1µs的时间里超快速地从待机模式唤醒。
基本时钟模块配置:具有四种校准频率并高达16MHz的内部频率;内部超低功耗LF振荡器;32.768KHz晶体;外部数字时钟源。
两个16 位Timer_A,分别具有三个捕获/比较寄存器。
用于模拟信号比较功能或者斜率模数(A/D)转换的片载比较器。
带内部基准、采样与保持以及自动扫描功能的10位200-ksps 模数(A/D)转换器。
16KB闪存,512B的RAM。
16个I/O口。
注意:MSP430G2553无P3口!MSP430G2553的时钟基本时钟系统的寄存器DCOCTL-DCO控制寄存器DCOxDCO频率选择控制1MODxDCO频率校正选择,通常令MODx=0注意:在MSP430G2553上电复位后,默认RSEL=7,DCO=3,通过数据手册查得DCO频率大概在0.8~1.5MHz之间。
BCSCTL1-基本时钟控制寄存器1XT2OFF不用管,因为MSP430G2553内部没有XT2提供的HF时钟XTS不用管,默认复位后的0值即可DIV Ax设置ACLK的分频数00 /101 /210 /411 /8RSELxDCO频率选择控制2BCSCTL2-基本时钟控制寄存器2SELMxMCLK的选择控制位00 DCOCLK01 DCOCLK10 LFXT1CLK或者VLOCLK11 LFXT1CLK或者VLOCLK DIVMx设置MCLK的分频数00 /101 /210 /411 /8SELSSMCLK的选择控制位0 DCOCLK1 LFXT1CLK或者VLOCLK DIVSx设置SMCLK的分频数00 /101 /210 /411 /8DCORDCO直流发生电阻选择,此位一般设00 内部电阻1 外部电阻BCSCTL3-基本时钟控制寄存器3XT2Sx不用管LFXT1Sx00 LFXT1选为32.768KHz晶振01 保留10 VLOCLK11 外部数字时钟源XCAPxLFXT1晶振谐振电容选择00 1pF01 6pF10 10pF11 12.5pFmsp430g2553.h中基本时钟系统的内容/************************************************************* Basic Clock Module************************************************************/#define __MSP430_HAS_BC2__ /* Definition to show that Module is available */SFR_8BIT(DCOCTL); /* DCO Clock Frequency Control */SFR_8BIT(BCSCTL1); /* Basic Clock System Control 1 */SFR_8BIT(BCSCTL2); /* Basic Clock System Control 2 */SFR_8BIT(BCSCTL3); /* Basic Clock System Control 3 */#define MOD0 (0x01) /* Modulation Bit 0 */#define MOD1 (0x02) /* Modulation Bit 1 */#define MOD2 (0x04) /* Modulation Bit 2 */#define MOD3 (0x08) /* Modulation Bit 3 */#define MOD4 (0x10) /* Modulation Bit 4 */#define DCO0 (0x20) /* DCO Select Bit 0 */#define DCO1 (0x40) /* DCO Select Bit 1 */#define DCO2 (0x80) /* DCO Select Bit 2 */#define RSEL0 (0x01) /* Range Select Bit 0 */#define RSEL1 (0x02) /* Range Select Bit 1 */#define RSEL2 (0x04) /* Range Select Bit 2 */#define RSEL3 (0x08) /* Range Select Bit 3 */#define DIVA0 (0x10) /* ACLK Divider 0 */#define DIVA1 (0x20) /* ACLK Divider 1 */#define XTS (0x40) /* LFXTCLK 0:Low Freq. / 1: High Freq. */ #define XT2OFF (0x80) /* Enable XT2CLK */#define DIVA_0 (0x00) /* ACLK Divider 0: /1 */#define DIVA_1 (0x10) /* ACLK Divider 1: /2 */#define DIVA_2 (0x20) /* ACLK Divider 2: /4 */#define DIVA_3 (0x30) /* ACLK Divider 3: /8 */#define DIVS0 (0x02) /* SMCLK Divider 0 */#define DIVS1 (0x04) /* SMCLK Divider 1 */#define SELS (0x08) /* SMCLK Source Select 0:DCOCLK /1:XT2CLK/LFXTCLK */#define DIVM0 (0x10) /* MCLK Divider 0 */#define DIVM1 (0x20) /* MCLK Divider 1 */#define SELM0 (0x40) /* MCLK Source Select 0 */#define SELM1 (0x80) /* MCLK Source Select 1 */#define DIVS_0 (0x00) /* SMCLK Divider 0: /1 */#define DIVS_1 (0x02) /* SMCLK Divider 1: /2 */#define DIVS_2 (0x04) /* SMCLK Divider 2: /4 */#define DIVS_3 (0x06) /* SMCLK Divider 3: /8 */#define DIVM_0 (0x00) /* MCLK Divider 0: /1 */#define DIVM_1 (0x10) /* MCLK Divider 1: /2 */#define DIVM_2 (0x20) /* MCLK Divider 2: /4 */#define DIVM_3 (0x30) /* MCLK Divider 3: /8 */#define SELM_0 (0x00) /* MCLK Source Select 0: DCOCLK */#define SELM_1 (0x40) /* MCLK Source Select 1: DCOCLK */#define SELM_2 (0x80) /* MCLK Source Select 2: XT2CLK/LFXTCLK */#define SELM_3 (0xC0) /* MCLK Source Select 3: LFXTCLK */#define LFXT1OF (0x01) /* Low/high Frequency Oscillator Fault Flag */#define XT2OF (0x02) /* High frequency oscillator 2 fault flag */#define XCAP0 (0x04) /* XIN/XOUT Cap 0 */#define XCAP1 (0x08) /* XIN/XOUT Cap 1 */#define LFXT1S0 (0x10) /* Mode 0 for LFXT1 (XTS = 0) */#define LFXT1S1 (0x20) /* Mode 1 for LFXT1 (XTS = 0) */#define XT2S0 (0x40) /* Mode 0 for XT2 */#define XT2S1 (0x80) /* Mode 1 for XT2 */#define XCAP_0 (0x00) /* XIN/XOUT Cap : 0 pF */#define XCAP_1 (0x04) /* XIN/XOUT Cap : 6 pF */#define XCAP_2 (0x08) /* XIN/XOUT Cap : 10 pF */#define XCAP_3 (0x0C) /* XIN/XOUT Cap : 12.5 pF */#define LFXT1S_0 (0x00) /* Mode 0 for LFXT1 : Normal operation */ #define LFXT1S_1 (0x10) /* Mode 1 for LFXT1 : Reserved */#define LFXT1S_2 (0x20) /* Mode 2 for LFXT1 : VLO */#define LFXT1S_3 (0x30) /* Mode 3 for LFXT1 : Digital input signal */#define XT2S_0 (0x00) /* Mode 0 for XT2 : 0.4 - 1 MHz */#define XT2S_1 (0x40) /* Mode 1 for XT2 : 1 - 4 MHz */#define XT2S_2 (0x80) /* Mode 2 for XT2 : 2 - 16 MHz */#define XT2S_3 (0xC0) /* Mode 3 for XT2 : Digital input signal */基本时钟系统例程(DCO)MSP430G2553在上电之后默认CPU执行程序的时钟MCLK来自于DCO时钟。
基于MSP430G2553的电压表设计
数字式直流电压表一、整体说明在电子技术中,往往离不开对电压的测量,作为一种测量电压的仪器——电压表是近代电子技术领域的常用工具之一,在许多领域得到广泛应用。
本设计是基于TI单片机设计的数字式直流电压表,它主要由MSP430G2553、LCD12864和分压电路三部分组成。
分压电路先将输入的电压信号衰减一定的倍数,后通过控制双路选择开关设定测量的量程,分别有0~3V和0~15V两个档,以便实现精确读数;分压处理后的电压信号由MSP430G2553内部的ADC10模块转换成数字信号;再通过LCD12864液晶屏进行串行显示。
经多次测量实验得出误差范围在2%以内。
二、原理图基于MSP430G2553单片机设计的数字式直流电压表的电路图如图1所示。
由于MSP430开发板已具备单片机最小系统结构,只需添加显示电路和分压电路。
LCD12864通过串口方式显示,只需占用单片机2个I/O口;分压电路可以通过开关S1选择量程档位,只占用1个I/O口。
图1 直流电压表电路图三、接口定义MSP430G2553的接口说明如表1所示。
图1中的复位和晶振部分是MSP430开发板固有的部分,故不再说明。
P1.0接液晶屏的SID脚,作为串行的数据口用;P1.1则接液晶屏的SCLK脚,控制串行的同步时钟;P1.4接分压电路的输出端。
LCD12864的接口说明如表2所示。
当PSB脚接低电平时,串口模式被选择。
在该模式下,只用2根线(SID与SCLK)来完成数据传输。
RS接高电平,不使用片选功能。
注意:信号源与单片机之间要共地。
表1 MSP430G2553的接口说明表2 LCD12864的接口说明四、程序流程图(一)主函数主函数的流程框图如图1所示。
主函数主要是调用系统初始化函数和循环开启ADC 转换,这是由于ADC10采用单通道单次转换模式,每次采样后需要重新开启ADC ,才会进行下一次信号采样转换。
另外,信号的采样与处理以及电压值的显示都是通过中断来完成。
msp430g2553_LCD1602显示直流电压检测电路
msp430g2553_LCD1602显示直流电压检测电路按此图连接即可。
以下是显示部分程序,DA部分简单,大家稍微动动脑子~~~/************************msp430g2553_LCD1602_Voltage_Detect********************* *********date:2012.7.13*/#include <msp430g2553.h>int data;int i,j;double n;char a[];/************************延时函数*****************************/void delay(int i){int s=500;for(;i>0;i--){for(;s>0;s--){;;}}}/************************lcd写指令*****************************/void write_com(char com){P1OUT&=~(1<<3);//RS=0,输入指令P1OUT&=~(1<<4);//RW=0,向lcd写入指令或数据P1OUT&=~(1<<5);//EN=0,始终执行指令delay(8);P2OUT=com;delay(8);P1OUT|=(1<<5);//EN=1,读取信息delay(8);P1OUT&=~(1<<5);//EN=0,执行指令}/************************lcd写数据*****************************/ void write_data(char data_bit){P1OUT|=(1<<3);//RS=1,输入数据P1OUT&=~(1<<4);//RW=0,向lcd写入指令或数据P1OUT&=~(1<<5);//EN=0,执行指令delay(8);P2OUT=data_bit;delay(8);P1OUT|=(1<<5);//EN=1,读取信息delay(8);P1OUT&=~(1<<5);//EN=0,执行指令}/************************lcd初始化*****************************/ void initial_lcd(void){delay(20);write_com(0x38);delay(15);write_com(0x0c);delay(15);write_com(0x06);delay(15);write_com(0x01);}/************************lcd显示*****************************/void LCD_Display(char x,char y,char *str){char xtemp;switch(x){case 0:xtemp=0x80+y;break;case 1:xtemp=0xc0+y;break;default:break;}write_com(xtemp);while(*str!=0){write_data(*str);str++;}}/************************主函数*****************************/void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP2SEL=0x00;//设置P2为通用IOP2DIR |= 0xff; // Set P2 to output directionP1DIR |= 0x38;//0011 1000 p1.3 1.4 1.5 作为LCD使能复位控制端initial_lcd();//LCD初始化__enable_interrupt(); // Enable interrupts.TACCR0 = 30; // Delay to allow Ref to settleTACCTL0 |= CCIE; // Comvolre-mode interrupt.TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.LPM0; // Wait for delay.TACCTL0 &= ~CCIE; // Disable timer Interrupt__disable_interrupt();for (;;){n =12345678;a[0]=((long)n/100000000%10+0x30);a[1]=0x2e;a[2]=((long)n/10000000%10+0x30);a[3]=((long)n/1000000%10+0x30);a[4]=((long)n/100000%10+0x30);a[5]=((long)n/10000%10+0x30);a[6]=((long)n/1000%10+0x30);a[7]=((long)n/100%10+0x30);a[8]=((long)n/10%10+0x30);a[9]=((long)n/1%10+0x30);a[10]='\0';for(j = 0;j <= 618;j++) //扫描延时,稳定显示{//LCD_Display(0,0,"Voltage=");//LCD_Display(0,15,"V");LCD_Display(0,0,a);LCD_Display(1,1,"No:22 copyright");}}}// ADC10 interrupt service routine#pragma vector=TIMER0_A0_VECTOR__interrupt void ta0_isr(void){TACTL = 0;LPM0_EXIT; // Exit LPM0 on return }。
基本时钟模块_MSP430G2553
基本时钟模块_MSP430G2553G2xxx系列DCO校准数据(校正寄存器)1MHz:CALBC1_1MHZCALDCO_1MHZ8MHz:CALBC1_8MHZCALDCO_8MHZ12MHz:CALBC1_12MHZCALDCO_12MHZ16MHz:CALBC1_16MHZCALDCO_16MHZ例:设置DCO频率为1MHzif(CALBC1_1MHZ==0xFF || CALDCO_1MHZ==0xFF)while(1);//校准数据是否被擦除,若是则CPU挂起。
BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;基本时钟模块寄存器寄存器缩写形式类型初始状态DCO控制寄存器DCOCTL 读/写0x60(PUC)基本时钟系统控制器1 BCSCTL1 读/写0x87(POR)基本时钟系统控制器2 BCSCTL2 读/写由PUC复位基本时钟系统控制器3 BCSCTL3 读/写0x05(PUC)中断使能寄存器(特殊功能寄存器)IE1 读/写由PUC复位中断标致寄存器(特殊功能寄存器)IFG1 读/写由PUC复位说明:DCO的频率可以通过软件设定DCOx、MODx、RSELx相应位来调整,DCO频率是通过将f DCO和f DCO+1混频得到。
1、DCOCTL:DCO控制寄存器7 6 5 4 3 2 1 0DCOx MODxrw-0 rw-1 rw-1 rw-0 rw-0 rw-0 rw-0 rw-0 DCOx:DCO频率范围选择位,这些位可以用来在由RESLx设置决定的8个离散的频率范围中选择哪一个。
MODx:调制系数选择位,这些位用来决定在32个DCO时钟周期中f DCO+1占多少个,f DCO 占多少个。
注意:当MODx=0时调制器关闭,DCOx=7时,由于此时没有下一个更高的频率范围f DCO+1可用,因此MODx无效不可用。
2、BCSCTL1:基本时钟系统控制寄存器17 6 5 4 3 2 1 0 XT2OFF XTS(1)(2)DIVAx RSELxrw-(1) rw-(0) rw-(0) rw-(0) rw-0 rw-1 rw-1 rw-1 XT2OFF:第二晶振XT2(可选高频晶振)关闭控制位。
单片机驱动LCD1602
LCD_DispStr(1,1,"LCD_Serial_test!");
利用传递参数x、y void LCD_DispStr(char x,char y,char *p) { 确定要显示的字符 if (x !=0x00 && y!=0x00) 串的位置 { switch(y) //数据指针=80h+地址码(0-27H,40-67H) { case 1:LCD_WriteCommand( 0x80 + x-1 );break; //第1行 case 2:LCD_WriteCommand( 0x80 + 0x40 + x-1 );break; //第2行 }
0 要写的数据内容 1 读出的数据内容
写命令时序和对应程序
void LCD_WriteCommand(unsigned char Com)
{ RS_SET_L; //命令总线 RW_SET_L; //写操作 P1=Com; _NOP(); //P1为8位二进制数据
_NOP();
E_SET_H;
// tsp1
LCD_WriteCommand(0x38); 显示模式设置
LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06);//显示光标移动设置 LCD_WriteCommand(0x0c); //开显示,不显示光标 LCD_WriteCommand(0x00); }
DelayNop(15); // tpw E_SET_L; //使能端下降沿沿写入
图中的延时是有最小限制的,相当 于1602的反应时间,所以单片机 引脚高低电平跳变不能太快
Delay(Delay_Count);
用MSP430G2553单片机控制Ht1621的程序及笔记
用MSP430G2553单片机控制Ht1621的程序及笔记型号:HT1621BS725G01012液晶全部显示时如下图:6位数字、3个小数点和右方电源标志全部点亮函数:/*********全部点亮**************/ void HT1621_all_on(uchar num) { uchar i;uchar addr=0;for(i=0;i<num;i++){Write_1621(addr,0xff);addr+=2;}}屏幕数字笔画对应编码:程序例子:#include "msp430g2553.h"#define uint unsigned int#define uchar unsigned char/***定义1621的端口******/#define DATA1 P2OUT|=BIT0//1621DATA端口#define DATA0 P2OUT&=~BIT0 #define WR1 P2OUT|=BIT1//1621WR0端口#define WR0 P2OUT&=~BIT1#define CS1 P2OUT|=BIT2//1621CS端口#define CS0 P2OUT&=~BIT2/******定义HT1621的命令*******/#define ComMode 0x52 //4COM,1/3bias 1000 010 1001 0#define RCosc 0x30 //内部RC振荡器(上电默认)1000 0011 0000#define LCD_on 0x06 //打开LCD 偏压发生器1000 0000 0 11 0#define LCD_off 0x04 //关闭LCD显示#define Sys_en 0x02 //系统振荡器开 1000 0000 0010 #define CTRl_cmd 0x80 //写控制命令#define Data_cmd 0xa0 //写数据命令char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};//用来存放要显示的数字const char num[]={0x7d,0x60,0x3e,0x7a,0x63,0x5b,0x5f,0x70,0x7f,0x7b};/*0,1,2,3,4,5,6,7,8,9*****//**************延时子程序**********/void delay_1us(void) //1us延时函数{asm("nop");}//N us延时函数void delaynus(uint n){uint i;for(i=0;i<n;i++)asm("nop");}void delay_1ms(void) //1ms延时函数 {unsigned int i;for (i=0;i<1140;i++); }void delay_nms(unsigned int n) //N ms延时函数 {unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*****发送数据***********/void SendBit_1621(uchar sdata,uchar cnt) //data 的高cnt 位写入HT1621,高位在前{uchar i;for(i=0;i<cnt;i++){WR0;delaynus(20); //8M必须加,4M可省略if(sdata&0x80) DATA1;else DATA0;delaynus(20);//8M必须加,4M可省略WR1;delaynus(20); //8M必须加,4M可省略sdata<<=1;}delaynus(20);}/******送命令*****/void SendCmd_1621(uchar command){CS0;SendBit_1621(0x80,4); //写入标志码“100”和9 位command 命令,由于SendBit_1621(command,8); //没有使有到更改时钟输出等命令,为了编程方便CS1; //直接将command 的最高位写“0”}/******发送数据和命令**参数说明:addr:要在第几位显示***************************/ void Write_1621(uchar addr,uchar sdata) {addr<<=2;CS0;SendBit_1621(0xa0,3); //写入标志码“101”SendBit_1621(addr,6); //写入addr 的高6位,***6位显示SendBit_1621(sdata,8); //写入data的8位CS1;}/****清除显示********参数说明:num:要清除几位***********************/ void HT1621_all_off(uchar num) {uchar i;uchar addr=0;for(i=0;i<num;i++){Write_1621(addr,0x00);addr+=2;}}/*********全部点亮*******参数说明:num:要点亮几位***************************/ void HT1621_all_on(uchar num) { uchar i;uchar addr=0;for(i=0;i<num;i++){Write_1621(addr,0xff);addr+=2;}}/******全部点亮1621,显示同样的数字******* 参数说明:num:要显示几位****************************/void HT1621_all_on_num(uchar num,uchar xx){uchar i;uchar addr=0;for(i=0;i<num;i++){Write_1621(addr,xx);addr+=2;}}/*********(初始化1621)*************/ void Init_1621(void){SendCmd_1621(Sys_en);//系统振荡器开SendCmd_1621(RCosc); //内部RC振荡器SendCmd_1621(ComMode); //4COM,1/3bias 1000 010 1001 0 SendCmd_1621(LCD_on);//打开LCD 偏压发生器1000 0000 0 11 0}/***********初始化1621) *****************/ void LCDoff(void) {SendCmd_1621(LCD_off); }/*****Name: LCDon(初始化1621)***********/ void LCDon(void){SendCmd_1621(LCD_on); }void displayallnum(unsigned int n) //各位显示所有数码字符函数 { uchar i,j;uchar addr=0;for(i=0;i<n;i++){for(j=0;j<29;j++){Write_1621(addr,num[j]); delay_nms(100) ;}addr+=2;}}//测试第2位数码各位笔画,用于编写num数组 void displaybihua(void) { Write_1621(2,0x01);delay_nms(350) ;Write_1621(2,0x02);delay_nms(350) ;Write_1621(2,0x04);delay_nms(350) ;Write_1621(2,0x08);delay_nms(350) ;Write_1621(2,0x10);delay_nms(350) ;Write_1621(2,0x20);delay_nms(350) ;Write_1621(2,0x40);delay_nms(350) ;Write_1621(2,0x80);delay_nms(350) ; }//逐位显示各位8字+小数点void displayall8(void) {uchar i;HT1621_all_off(6);for(i=0;i<6;i++){Write_1621(2*i,0xff);delay_nms(50) ;}}//显示数组数据void displaydata(long int t,int p) {uchar i;dispnum[4]=num[t/10000];dispnum[3]=num[(t/1000)%10]; dispnum[2]=num[(t/100)%10]; dispnum[1]=num[(t/10)%10]; dispnum[0]=num[t%10];/*switch(p){case 1:sbi(dispnum[0], 4);break;case 2:sbi(dispnum[1], 4);break;case 3:sbi(dispnum[2], 4);break;default:break;}*/for(i=0;i<5;i++){Write_1621(i*2,dispnum[i]); }}void main(){WDTCTL = WDTPW + WDTHOLD; long int t=0;uchar i;P2DIR=0xff;Init_1621() ;//初始化HT1621_all_on(6);//全部点亮delay_nms(200);HT1621_all_off(16);//全部关闭delay_nms(50);for(i=0;i<10;i++){HT1621_all_on_num(6,num[i]);//点亮所有且显示相同数字delay_nms(100) ;}while(1){displaydata(t,2);t++;if(t>99999) t=0;delay_nms(20);}}。
我们所用的MSP430G2553...
电设工作小结之——MSP430G2553学习笔记——1一,MSP430G2553单片机的各个功能模块(一),IO口模块,1,我们所用的MSP430G2553有两组IO口,P1和P2。
2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN,IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。
3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。
所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。
4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。
注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。
程序如下:void IO_interrupt_init() //IO中断初始化函数{P1REN |= BIT4+BIT5+BIT6+BIT7; // pull up 内部上拉电阻使能//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断P1OUT = BIT4+BIT5+BIT6+BIT7; // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来//0:下拉,1:上拉P1IE |= BIT4+BIT5+BIT6+BIT7; // interrupt enabled P13中断使能P1IES |= BIT4+BIT5+BIT6+BIT7; // Hi/lo edge 下降沿中断//P1IES &= ~BIT3; //上升沿触发中断P1IFG &= ~(BIT4+BIT5+BIT6+BIT7); //中断标志位清零}5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。
MSP430G2553时钟,MSP430G2553时钟配置
MSP430G2553 时钟,MSP430G2553 时钟配置MSP430G2553 系统时钟和振荡器时钟系统由基本时钟模块提供支持,此时钟模块支持一个32768Hz 手表晶体振荡器、一个内部超低功耗低频振荡器和一个内部数字控制振荡器(DCO)。
基本时钟模块专为同时满足低系统成本及低功耗要求而设计。
内部DCO 提供了一个快速接通时钟源并可在不到1µs 的时间里实现稳定。
基本时钟模块提供了以下时钟信号:•辅助时钟(ACLK),此时钟由一个32768Hz 手表晶振或内部LF 振荡器提供信号源。
•主时钟(MCLK),CPU 所采用的系统时钟。
•系统子时钟(SMCLK),外设模块所采用的子系统时钟。
用于校准DCO 输出频率的DCO 设定值存储于信息内存的A 段中。
主DCO 特性MSP430G2553 时钟1,MSP430G2553 能做到超低功耗,合理的时钟模块是功不可没的。
但是功能强大的时钟模块设置起来也相对复杂一些。
2,MSP430G2553 的时钟源有:(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;(2),外接高速晶振XT2CLK:8MHz;(3),内部数字控制振荡器DCO:是一个可控的RC 振荡器,频率在0~16MHz;(4),超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz;3,时钟模块:430 的时钟模块有MCLK SMCLK ACLK :(1),主系统时钟MCLK:提供给MSP430 的CPU 时钟。
可以来自LFXT1CLK XT2CLK DCO VLO 可选,默认为DCO。
(2),子系统时钟SMCLK:提供给高速外设。
可以来自LFXT1CLK XT2CLK DCO VLO 可选,默认为DCO。
(3),辅助系统时钟ACLK:提供给低速外设。
msp430G2553接lcd1602
msp430G2553接lcd1602#include#include#include/*****************************************************端口定义****************************************************/#define LCD_EN_PORT P1OUT //以下2个要设为同一个口使能信号1时读取信息1——0(下降沿)时执行命令#define LCD_EN_DDR P1DIR#define LCD_RS_PORT P2OUT //以下2个要设为同一个口0输入指令1输入数据#define LCD_RS_DDR P2DIR#define LCD_DATA_PORT P2OUT //以下3个要设为同一个口#define LCD_DATA_DDR P2DIR //一定要用高4位#define LCD_RS BIT3#define LCD_EN BIT7#define LCD_DATA BIT7|BIT6|BIT5|BIT4 //4位数据线连接模式/***************************************************预定义函数**************************************************/void LCD_init(void);void LCD_init_first(void);void LCD_en_write1(void); //上升沿使能void LCD_en_write2(void); //下降沿使能void LCD_write_command(unsigned char command);void LCD_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); // 写命令void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data); // 写数据void delay_1ms(void);void delay_nus(unsigned int n);void delay_nms(unsigned int n);unsigned char LCDBuf1[]={"Hello!LCD1602"}; //第一行要显示的内容unsigned char LCDBuf2[]={"MSP430G2553123"}; //第二行要显示的内容/********************************************主函数*******************************************/void main(){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗LCD_init_first();LCD_init();delay_nms(100);LCD_write_string(0,0,LCDBuf1);delay_nms(10);LCD_write_string(0,1,LCDBuf2);}/********************************************LCD液晶操作函数*******************************************/void LCD_init_first(void) //LCD1602液晶初始化函数(热启动){delay_nms(500);LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_nms(50);LCD_write_command(0x30);// delay_nms(50);// LCD_write_command(0x30);// delay_nms(5);// LCD_write_command(0x30);delay_nms(500);}/******************************************* LCD1602液晶初始化函数*****************************************/void LCD_init(void){delay_nms(500);LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_nms(500);LCD_write_command(0x28); //4位数据接口delay_nms(50);LCD_write_command(0x28); //4位数据接口delay_nms(50);LCD_write_command(0x28); //4位数据接口delay_nms(50);LCD_en_write2();delay_nms(50);LCD_write_command(0x28); //4位数据接口delay_nms(500);LCD_write_command(0x01); //清屏LCD_write_command(0x0c); //显示开,关光标,不闪烁LCD_write_command(0x06); //设定输入方式,增量不移位delay_nms(50);}/******************************************* 液晶使能上升沿*****************************************/void LCD_en_write1(void){LCD_EN_PORT&=~LCD_EN;delay_nus(10);LCD_EN_PORT|=LCD_EN;}/******************************************* 液晶使能下降沿*****************************************/void LCD_en_write2(void){LCD_EN_PORT|=LCD_EN;delay_nus(10);LCD_EN_PORT&=~LCD_EN;}/******************************************* 写指令函数*****************************************/void LCD_write_command(unsigned char command){delay_nus(16);P2SEL=0x00;LCD_RS_PORT&=~LCD_RS; //RS=0 输入指令LCD_en_write1(); //使能信号先置低再置高LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写高四位delay_nus(16);LCD_en_write2(); //使能信号先置高再置低command=command<<4; //低四位移到高四位LCD_en_write1(); //使能信号先置低再置高LCD_DATA_PORT&=0x0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写低四位LCD_en_write2(); //使能信号先置高再置低}/******************************************* 写数据函数*****************************************/void LCD_write_data(unsigned char data){delay_nus(16);P2SEL=0x00;LCD_RS_PORT|=LCD_RS; //RS=1 输入数据LCD_en_write1(); //E上升沿使能信号先置低再置高LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写高四位delay_nus(16);LCD_en_write2();data=data<<4; //低四位移到高四位LCD_en_write1();LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写低四位LCD_en_write2();}/******************************************* 写地址函数*****************************************/void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command( address);}/*******************************************LCD在任意位置写字符串,列x=0~15,行y=0,1*****************************************/void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y ); //写地址while (*s) //写显示字符{LCD_write_data( *s );s++;}}/******************************************* LCD在任意位置写字符,列x=0~15,行y=0,1*****************************************/void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) {LCD_set_xy( X, Y ); //写地址LCD_write_data( data);}/***************************************** ** 1us延时函数*****************************************/void delay_1us(void){asm("nop");}/***************************************** ** N us延时函数*****************************************/ void delay_nus(unsigned int n){unsigned int i;for (i=0;i<n;i++)< bdsfid="261" p=""></n;i++)<>delay_1us();}/***************************************** ** 1ms延时函数*****************************************/ void delay_1ms(void) {unsigned int i;for (i=0;i<1140;i++);}/***************************************** ** N ms延时函数*****************************************/ void delay_nms(unsigned int n){unsigned int i=0;for (i=0;i<n;i++)< bdsfid="279" p=""></n;i++)<>delay_1ms();}。
基于MSP430G2553和ds18b20的测温系统
嵌入式控制系统与应用课程论文题目: 基于MSP430G2553和ds18b20的测温系统院系名称:专业班级:学生姓名:学号:摘要为了在现实生活和工业生产及过程控制中准确测量温度,设计了一种基于低功耗MSP430单片机的数字温度计,整个系统通过单片机MSP430控制DS18B20读取温度,采用LCD1602显示,温度传感器DS18B20与单片机之间通过串口进行数据传输,且外围的整合性高,DS18B20只需一个端口即可实现数据通信,连接方便,通过多次实验证明,该系统的测试结果与实际环境温度一致,除了具有接口电路简单,测量精度高,误差小,可靠性高等特点外,其成本低,功耗低的特点使其拥有更广阔的应用前景。
关键字:DS18B20 MSP430G2553单片机液晶显示目录1 引言 (1)2 测温系统硬件构成 (1)2.1 硬件设计 (1)3 软件设计 (6)3.1 总体设计流程图 (6)3.2 初始化模块 (6)4 实验展示 (7)4.1 实物整体展示 (7)4.2 报警显示和蜂鸣器报警 (8)5设计心得 (10)6本设计的不足和反思 (11)参考文献 (12)附录 (13)附一:元器件及仪器明细表 (13)附二:实验设计程序 (13)1 引言温度的测量和控制在储粮仓库、智能楼宇空调控制及其它的工农业生产和科学研究中应用广泛。
温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结(如AD590)之类的模拟传感器,经信号取样电路、放大电路和模数转换电路处理,获取表示温度值的数字信号,再交由微处理器或DSP处理。
被测温度信号从敏感元件接收的非电模拟量开始,到转换为微处理器可处理的数字信号之间,设计者须考虑的线路环节较多,相应测温装置中元器件数量难以下降,随之影响产品的可靠性及体积微小化。
由此会造成整个检测系统有较大的偏差.稳定性和抗干扰性能都较差。
本文设计一种基于数字温度传感器DSl8820的小型测温系统,主控芯片采用TI公司的MSP430单片机,数字温度传感器通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,可应用于仓库测温、楼宇空调控制和生产过程监控等领域。
MSP430G2553寄存器资料讲解
MSP430G2553 学习笔记常用赋值运算符:清除:&=~ , 置位:|= , 测试:&= , 取反:A=看门狗模块:WDT (看门狗)IS1,IS0选择看门狗定时器的定时输出, T 是WDTCNT 的输入时钟源周期0 T x 2(15) 1 T x 2(13) 2 T x 2(9) 3T x 2(6)SSEL选择WDTCNT 的时钟源 0 SMCLK 1ACLKIS0、IS1、SSEL 可确定 WDT 定时时间, WDT 只能定时8种和时钟源相关的时间CNTCL当该位为1时,清除WDTCNT TMSEL工作模式选择看门狗模式1定时器模式NMI选择RST/NMI 引脚功能,在 PUC 后被复位0 RST/NMI引脚为复位端NMIES 选择中断的边沿触发方式0 上升沿触发NMI中断1 下降沿触发NMI中断HOLD 停止看门狗定时器工作,降低功耗0 WDT功能激活1 时钟禁止输入,计数停止WDT (看门狗)配置语句WDTCTL=WDTPW+WDTHOLD ;// 将 WDTPW+WDTHOLD 赋值给 WDTCTL,关闭看门狗定时器控制寄存器( Stop watchdogtimer)IE1 |= WDTIE ;// 使能 WDT 中断WDTCTL = WDT_ADL Y_1000 ;//WDT 1 s / 4 间隔计时器WDTCTL = WDTPW + WDTHOLD + WDTNMI + WDTNMIES ;//WDTCTL 由高8位口令和低8位控制命令组成,要写入操作 WDT的控制命令,出于安全原因必须先正确写入高字节看门狗口令。
口令为5AH,如果口令写错将导致系统复位。
读 WDTCTL时不需要口令。
这个控制寄存器还可以用于设置NMI引脚功能。
WDT 看门狗定时器(Watch Dog Timer),这是16位增计数器,由MSP430所选定的时钟电路产生的固定周期时钟信号对计数器进行加法计数。
msp430g2553_ADC+LCD1602
MSP430G2x53德州仪器 (TI) 的MSP430 系列超低功率微控制器包含几个器件,这些器件特有针对多种应用的不同的外设集。
这种架构与 5 种低功耗模式相组合,专为在便携式测量应用中延长电池的使用寿命而优化。
该器件具有一个强大的16 位 RISC CPU、16 位寄存器和有助于获得最大编码效率的常数发生器。
数字控制振荡器(DCO) 可在不到1 µs的时间里完成从低功耗模式至运行模式的唤醒。
MSP430G2x13 和 MSP430G2x53 系列是超低功耗混合信号微控制器,具有内置的 16 位定时器、多达 24 个支持触摸感测的 I/O 引脚、一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。
此外,MSP430G2x53系列成员还具有一个 10 位模数 (A/D) 转换器。
有关配置的详情请见表 1。
典型应用包括低成本传感器系统,此类系统负责捕获模拟信号、将之转换为数字值、随后对数据进行处理以进行显示或传送至主机系统。
基于msp430g2553的ADC模拟采样 lcd1602 显示#include"msp430g2553.h"static int da;void delay(int t){int s=500;for(;t>0;t--){for(;s>0;s--){;;}}}void write_com(char com){P2OUT&=~(1<<3);P2OUT&=~(1<<4);P2OUT&=~(1<<5);delay(8);P1OUT=com;delay(8);P2OUT|=(1<<5);delay(8);P2OUT&=~(1<<5);}void write_data(char dt){P2OUT|=(1<<3);P2OUT&=~(1<<4);P2OUT&=~(1<<5);delay(8);P1OUT=dt;delay(8);P2OUT|=(1<<5);delay(8);P2OUT&=~(1<<5);}void initial_lcd(void){delay(20);write_com(0x38);delay(15);write_com(0x0f);delay(15);write_com(0x06);delay(15);write_com(0x00) ;}void lcd_dis (char hang,char lie,char spr[]) {if(hang==1){char g=0;write_com(0x80+lie);do{write_data(spr[g]);g++;}while(spr[g]!='\0');}else if(hang==2){char g=0;write_com(0x80+0x40+lie);do{write_data(spr[g]);g++;}while(spr[g]!='\0');}}void main(void){WDTCTL = WDTPW + WDTHOLD; ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; ADC10CTL1 = INCH_1;ADC10AE0 |= 0x02; P1DIR |= 0xff;P2DIR |= 0x38;initial_lcd();for (;;){ADC10CTL0 |= ENC + ADC10SC;__bis_SR_register(GIE);da=ADC10MEM;delay(2000);write_com(0x84);delay(2000);write_data((da/100)+0x30);delay(2000);write_data((da%100/10)+0x30);delay(2000);write_data((da%100%10)+0x30);delay(2000);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void WaitForEnable(void);
void Delay5ms(void);
main()
{
WDTCTL = WDTPW + WDTHOLD;
LcdReset();
Disp1Char(1,0,'a');
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P1IN & Busy)!=0); //检测忙标志
CLR_EN;
ห้องสมุดไป่ตู้
P1DIR |= 0xFF; //将 P4 口切换为输出状态
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
void Disp1Char(unsigned char x,unsigned char y,unsigned char data);
void LcdReset(void);
void LcdWriteCommand(unsigned char cmd,unsigned char chk);
返回值 :无
********************************************/
void Disp1Char(uchar x,uchar y,uchar data)
{
LocateXY( x, y );
LcdWriteData( data );
}
DataDir = 0xFF; //数据端口设为输出状态
LcdWriteCommand(0x38, 0); //规定的复位操作
Delay5ms();
LcdWriteCommand(0x38, 0);
功 能:等待 1602 液晶完成内部操作
参 数:无
返回值 :无
********************************************/
void WaitForEnable(void)
{
P1DIR &= 0x00; //将 P4 口切换为输入状态
/*******************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:x--位置的列坐标
y--位置的行坐标
data--显示的字符数据
while(1);
}
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
/*******************************************
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:WaitForEnable
}
/*******************************************
函数名称:LocateXY
功 能:向液晶输入显示字符位置的坐标信息
参 数:x--位置的列坐标
y--位置的行坐标
返回值 :无
函数名称:LcdReset
功 能:对 1602 液晶模块进行复位操作
参 数:无
返回值 :无
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状态 P2 012
DataPort = data; //将显示数据写入数据端口
_NOP();
#include<msp430g2553.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DataDir P1DIR
#define DataPort P1OUT
#define Busy 0x80
{
uchar temp;
temp = x&0x0f;
y &= 0x01;
if(y) temp |= 0x40; //如果在第 2 行
temp |= 0x80;
LcdWriteCommand(temp,1);
********************************************/
void LocateXY(uchar x,uchar y)
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0f, 1); //显示开,不开游标,不闪烁
}
_NOP();
CLR_EN;
}
void LcdWriteData( uchar data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
#define CtrlDir P2DIR
#define CLR_RS P2OUT&=~BIT0; //RS = P2.0
#define SET_RS P2OUT|=BIT0;
#define CLR_RW P2OUT&=~BIT1; //RW = P2.1
}
/*******************************************
函数名称:LcdWriteCommand
功 能:向液晶模块写入命令
参 数:cmd--命令,
chk--是否判忙的标志,1:判忙,0 :不判
返回值 :无
********************************************/
void LcdWriteCommand(uchar cmd,uchar chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS;
#define SET_RW P2OUT|=BIT1;
#define CLR_EN P2OUT&=~BIT2; //EN = P2.2
#define SET_EN P2OUT|=BIT2;
void LocateXY(unsigned char x,unsigned char y);