MSP430 G2553 LaunchPad AD转换结果用LCD1602显示
MSP430_G2553_LaunchPad__AD转换结果用LCD1602显示
/***********************内部基准电压2.5V*****************************/#include "msp430g2553.h"char a[6] ="";int da;int j ;double c,data;void delay(int t){int s=500;for(;t>0;t--){for(;s>0;s--){;;}}}void write_com(char com){P1OUT&=~(1<<3);//rS=0;P1OUT&=~(1<<4);//RW=0;P1OUT&=~(1<<5);//en=0;P1OUT&=~(1<<1);//delay(8);P2OUT=com;delay(8);P1OUT|=(1<<5);//en=1;delay(8);P1OUT&=~(1<<5);//en=0;}void write_data(char dt){P1OUT|=(1<<3);//rs=1;P1OUT&=~(1<<4);//rw=0;P1OUT&=~(1<<5);//en=0;delay(8);P2OUT=dt;delay(8);P1OUT|=(1<<5);//en=1;delay(8);P1OUT&=~(1<<5);//en=0;}void initial_lcd(void){delay(20);write_com(0x38);delay(15);write_com(0x0c);delay(15);write_com(0x06);delay(15);write_com(0x01) ;}void LCD_Disp(char x,char y,char *character){char xtemp;switch(x){case 0:xtemp=0x80+y;break;case 1:xtemp=0xc0+y;break;default:break;}write_com(xtemp);while(*character!=0){write_data(*character);character++;}}void main(void){char *pa;pa=a;WDTCTL = WDTPW + WDTHOLD; // Stop WDTP2SEL=0x00;P2DIR |= 0xff; // Set P1.0 to output direction P1DIR |= 0x38;initial_lcd(); //LCD初始化ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v__enable_interrupt(); // Enable interrupts.TACCR0 = 30; // Delay to allow Ref to settleTACCTL0 |= CCIE; // Compare-mode interrupt.TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.LPM0; // Wait for delay.TACCTL0 &= ~CCIE; // Disable timer Interrupt__disable_interrupt();ADC10CTL1 = INCH_1; // input A1ADC10AE0 |= 0x02; // PA.1 ADC option selectfor (;;){ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exida = ADC10MEM;data = ((double)da/1024)*2.5;c =data;a[0]=((int)c%10+0x30);a[1]=0x2e;a[2]=((int)(c*10)%10+0x30);a[3]=((int)(c*100)%10+0x30);a[4]=((int)(c*1000)%10+0x30);a[5]='\0';for(j = 0;j <= 5000;j++) //延时显示LCD_Disp(0,0,pa);}}// ADC10 interrupt service routine#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR (void){__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)}#pragma vector=TIMER0_A0_VECTOR__interrupt void ta0_isr(void){TACTL = 0;LPM0_EXIT; // Exit LPM0 on return/****************************内部基准电压2.5V版**************************************/* 5v基准电压,计算公式参见手册** 功能:数模转换** 日期:2012年7月18日**************************************/#include<msp430g2452.h>#include"intrinsics.h"#define SRI_0 P2OUT &= ~BIT3 //引脚定义#define SRI_1 P2OUT |= BIT3#define CLK_0 P2OUT &= ~BIT4#define CLK_1 P2OUT |= BIT4#define LD_0 P2OUT &= ~BIT5#define LD_1 P2OUT |= BIT5void DAC8043_change(unsigned int da);/***********主函数************/void main(){WDTCTL = WDTPW + WDTHOLD;P2DIR |= BIT3 + BIT4 + BIT5;P2OUT &= ~BIT3 + ~BIT4 + ~BIT5;while(1){DAC8043_change(0x0200);//输入0x0200,输出0.62,5v基准电压}/***************DAC转换函数***************/ void DAC8043_change(unsigned int da){unsigned char i;unsigned int da1;LD_1;//使能端拉高CLK_0;//时钟拉低for(i=0;i<12;i++){da1=da&0x0800;//数据转换开始,提取最高位if(da1){SRI_1;//数据传输}else{SRI_0;}CLK_1;CLK_0;da<<=1;//移位,}LD_0;//为下一次传输做准备}基于msp430g2553模拟IIC程序#ifndef _IIC_H_#define _IIC_H_#include "msp430g2553.h"//*******************宏定义****************** #define uchar unsigned char#define uint unsigned int#define SDA_OUT P1DIR|=BIT3#define SDA_IN P1DIR&=~BIT3#define SDA_H P1OUT|=BIT3#define SDA_L P1OUT&=~BIT3#define SCL_OUT P1DIR|=BIT2#define SCL_IN P1DIR&=~BIT2#define SCL_H P1OUT|=BIT2#define SCL_L P1OUT&=~BIT2//8M晶振时大约20us延时程序void delayus(uint z){uint i,j;for(i = 0;i<20;i++)for(j=0;j<z;j++){;;};}// 开始位void start(){SDA_OUT;SCL_OUT;SDA_H;SCL_H;delayus(1); //20SDA_L;delayus(2);//40SCL_L;}// 停止位void stop(){SDA_OUT;SCL_OUT;SDA_L;delayus(1);//20SCL_H;delayus(1);SDA_H;}// 从AT24Cxx移入数据到MCU uchar shin(){uchar i,read_data;SDA_OUT;SCL_OUT;for(i = 0; i < 8; i++){SDA_H;delayus(1);SCL_H;SDA_IN;read_data <<= 1;if(P1IN&BIT3)read_data|=0x01;SDA_OUT;SCL_L;}return(read_data);}// 从MCU移出数据到AT24Cxx uchar shout(uint write_data){uchar i;uchar ack_bit;SDA_OUT;SCL_OUT;for(i = 0; i < 8; i++) // 循环移入8个位{if(write_data&0x80)SDA_H;elseSDA_L;delayus(1);//2SCL_H;delayus(1);//2SCL_L;delayus(1);//2write_data <<= 1;}SDA_H; // 读取应答delayus(1);SCL_H; //注意拉高delayus(1);SDA_IN;if(P1IN&BIT3)ack_bit=1;else ack_bit=0;SCL_L;return ack_bit; // 返回AT24Cxx应答位}#endif。
LCD1602高手使用详解
LCD1602高手使用详解事无巨细,LCD1602前面总算走完了对AVR MEGA16这块单片机的一些基本的应用方式了,这时候大家对AVR的一些内部资源比如定时器,ADC,最主要的IO口的使用方式应该有了一个虽比较粗浅但是却比较形象的认识了。
这节我们来看使用单片机的另外一大主题,就是用单片机来实现芯片控制。
在前面的数码管显示一文中,就已经涉及到了用单片机来控制芯片为我们工作,CEPARK AVR开发板,为了达到增强驱动能力和节省IO口的作用,运用了移位寄存器74HC595来驱动两个四位八段数码管,是一个十分有创意的设计。
但是前面的内容重心还是集中于对AVR的IO口的控制,所以,我们从这节开始要正式逐渐深入的接触各种芯片了。
先做个引子。
单片机是一种微控制器,本身内部集成了数种资源比如CPU、内存、内部和外部总线系统,目前大部分还会具有外存。
他的主要任务是利用各种资源实现电平控制,可以以此控制与它相连的下级系统,广泛用于工业自动控制领域。
我们就从这句话出发,首先单片机用来做控制用的,而且是利用的是本身的内部资源。
但是,它的功能再强大,资源再丰富也总有一个上限,总有枯竭的一天。
所以我们常常利用单片机外接芯片来弥补或者增强单片机的功能来完成我们所需功能的电路。
比如程序存储器不足,可以外接外部存储器,比如单片机内部中断级不足,可以外接中断控制器等等。
大家可以从这个角度来理解芯片控制的意义罢。
今天我们用AVR单片机来实现对LCD1602液晶显示芯片的控制。
首先从这个名字讲起,LCD:英文全称为Liquid Crystal Display,即为液态晶体显示,也就是我们常说的液晶显示了。
(平时老说LCDLCD,可能大家也都不怎么注意过这个全称吧,呵呵,当增加词汇量了)1602则是表示这个液晶一共能显示2行数据,每一行显示16个字符。
这个就是LCD1602的全部来由。
液晶显示的使用有多广泛我就不多说了,LCD1602好像10元左右就可以拿到了的,不算贵。
430g2553的ad转化代码
delay(500);
WriteCommandLcd(0x01); //显示清屏
WriteCommandLcd(0x0c); //开显示,显示光标,光标不闪烁;
WriteCommandLcd(0x06); //读写操作时地址自动加1
}
else
{
x = x+0x80;
}
WriteCommandLcd(x);
}
/*********************************************************************
** 函数名称: display_string
display_string(0,0,"The Voltage is:");//在第一行(0)左数第1个(0)位置显示;
while(1)
{
ADC10CTL0=SREF_1+ADC10SHT_0+REFON+REF2_5V+ADC10ON+ADC10IE;//设置参考电压、采样保持时间、时钟 16xADC10CLK、开中断
}
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
DCOCTL = CALDCO_1MHZ;
BCSCTL2|=SELM_0;
P2SEL=0; //P2做普通IO口
P2DIR = 0xff; //设置P2口为输出状态;
}
/**************************************************
程控运算放大模块实验指导书
一、 实验目的1. 熟悉Launchpad 开发板的使用方法2. 学习MSP430G2553单片机内部ADC10和定时器的使用方法。
3. 学习使用PGA112芯片4. 学习使用12864液晶显示5. 提升动手能力和独立思考问题的能力 二、 实验设备和工具Launchpad 开发板、程控运算放大器实验模块、万用表、MSP430实验底板、12864液晶、CCS 开发工具等 三、 实验原理该实验的总体设计框图如下图1 程控运算放大模块整体设计框图可简单概括为:将3.3V 电源电压通过稳压芯片LM385稳压到2.5V ,再通过电阻分压获得一个十几mV 的电压接到程控运算放大芯片PGA112的输入端口,该芯片通过与单片机进行SPI 通信,对输入信号进行不同的放大(由拨码开关或按键控制放大倍数),将放大后的信号输入给单片机,通过单片机的ADC 对放大信号进行采样,最后将采样值转化为实际值并在液晶上实时显示。
1. MSP430G2553 图2是单片机MSP430G2553引出管脚原理图,它的部分引脚与PGA112进行SPI 通信,部分与液晶连接,将PGA112的输出作为单片机的输入对其AD 采样,将采样值转化为测量值并通过液晶实现对测量值的实时显示。
图2 msp430g2553引出管脚原理图1.ADC10和定时器ADC10 是MSP430单片机的片上模数转换器,根据其命名大家知道转换位数为10比特。
ADC10的最大转换速率大于200kHz ,转换精度为10位,其转换时钟源可选择,利用软件或者TimerA 设置转换初始化,编程选择片上电压参考源(2.5V 或者1.5V )。
在MSP430 的ADC10上有12个通道,其中8 个外部输入通道,具备对内部温度传感器(通道10)、供电电压VCC 和外部参考源的转换通道。
ADC10有多种采样模式,分别为单通道采样、重复单通道采样、顺序采样和重复顺序采样。
本实验ADC10设置成多次连续采样模式,基准电压2.5V,ADC10开中断,ADC10SC触发采集,采集通道0。
基于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转换器等电路)集成到一块硅片上组成的一个小而完善的微型运算机系统,在工业操纵领域普遍应用。
现今时期是一个新技术层出不穷的时期,在电子领域尤其是自动化智能操纵领域,传统的分立元件或数字逻辑电路组成的操纵系统,正在以前所未见的速度被单片机智能操纵系统所代替。
LCD1602及其控制器的基本显示方法
LCD1602及其控制器的基本显⽰⽅法LCD显⽰及键盘⽤法LCD1602及其控制器的基本显⽰⽅法向LCD输⼊的数据为ASCII码,需要通过数码扫描依次送到LCD显⽰,下⾯介绍LCD 控制器IP核LCD16X2A及其相关程序。
逻辑符号如下图:U_lcd_ctrl模块即为该控制器核在AltiumDesinger原理图中的符号表⽰。
其作⽤是接受前⾯⽤户⾃⼰的逻辑单元送来的ASCII码数据和控制信号,然后与外部的LCD显⽰器通讯,显⽰相应字符。
数据总线使⽤输⼊输出分离模式,IP核后⾯需要增加双向BUF控制单元(U8)。
L CD控制器端⼝说明如下:⽤户控制逻辑接⼝:CLK:控制器⼯作时钟,上升沿有效RST:复位信号,⾼电平有效DA TA[7..0]:ASCII码数据总线ADDR[3..0]:字符在LCD屏幕上的地址(共两⾏,每⾏16个字符)ADDR=“0000”~“1111”对应每⾏的第0~15个字符LINE:LCD1602屏幕上的⾏选择信号,LINE=0时数据在第⼀⾏显⽰,LINE=1时数据在第⼆⾏显⽰BUSY:控制器忙信号,数据未显⽰稳定时BUSY=1;反之为0STROBE:数据输⼊有效使能,⾼电平有效LCD显⽰器接⼝:LCD_E:LCD显⽰器使能LCD_RW:LCD读写⽅向控制LCD_RS:LCD命令,数据选择LCD_DA TA_TRI:LCD数据⾼阻态控制LCD_DA TAO:LCD数据输出总线LCD_DA TAI:LCD数据输⼊总线控制器⼯作原理如下:A 控制器复位当RST信号有效时(⾼电平),控制器进⼊LCD复位与初始化操作,此时,BUSY信号持续⾼电平,表⽰控制器忙,LCD不能进⾏⽤户请求的操作。
RST信号由⾼变低后的⼤约80us之后,LCD控制器初始化完成,可以响应⽤户的操作请求,此时,BUSY信号变低。
LCD处于显⽰模式。
B 字符显⽰上电后的LCD必须初始化⼀次,之后LCD控制器停留于“WAIT FOR DA TA”状态。
基于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”的不亮。
单片机驱动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);
单片机代码-AD转换电压在1602中显示
#include<reg52.h>#include<intrins.h>//为了使用这个头文件中的_nop_()延时函数sbit sda=P2^0;//SDA线sbit scl=P2^1;//SCL线sbit rst=P2^4; //关掉时钟芯片输出sbit hc573_sg_le=P2^6; //对用于锁存段数据的573锁存LE端进行定义sbit hc573_bit_le=P2^7;//对用于锁存位选通数据的573锁存LE端进行定义sbit lcd_rs=P1^0; //1602数据/命令选择端,高电平执行数据操作,低电平执行命令操作sbit lcd_rw=P1^1;//1602读/写控制端高电平读,低电平写sbit lcd_en=P2^5;//1602读写控制使能信号,它为高脉冲信号才可执行读写操作sbit sta7=P0^7;//1602忙信号检测位,为1则忙,需等待,为0表示空闲void delay_ms(unsigned int t) //tms的延时函数{unsigned int a,b;for(a=0;a<t;a++){for(b=0;b<113;b++){;}}}void _nop5_()//5个机器周期的延时,大约延时5us{_nop_();_nop_();_nop_();_nop_();_nop_();}void iic_start()//主机发送开始信号的函数{scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//SDA线拉高,准备产生开始信号scl=1;//SCL线拉高_nop5_(); //SDA线高电平持续5us,以符合开始信号定义的要求(>4.7us)sda=0;//SDA线拉低,产生开始信号_nop5_();//SDA线低电平持续5us,以符合开始信号定义的要求(>4us)}void iic_stop()//主机发送停止信号的函数{scl=0;//SCL线拉低,以便让SDA线准备变化sda=0;//SDA线拉低,准备产生停止信号scl=1;//SCL线拉高_nop5_(); //SDA线低电平持续5us,以符合停止信号定义的要求(>4us)sda=1;//SDA线拉高,产生停止信号_nop5_(); //SDA线的高电平持续5us,以符合停止信号定义的要求(>4.7us)}void iic_ack()//检测从机应答信号的函数{unsigned char i;i=255;scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//SDA线拉高,准备检测从机的应答信号while(sda==1)//当SDA为高电平时,则等待从机的应答将SDA拉低{if(i>0)i--;else return; //如果i自减到0了,从机还没响应,则不再等待,返回}//这种情况极少发生,一般是从机器件出问题了才会发生scl=1;//从机已经应答,将SDA线拉低了_nop5_();//SDA线的低电平持续5us,以符合应答信号定义的要求(>4us)scl=0;//SCL线拉低,以便让从机把SDA线释放}void send_ack()//主机给从机发送应答信号{scl=0;//SCL线拉低,以便让SDA线准备变化sda=0;//SDA线拉低,即将发送应答信号给从机scl=1;//SCL线拉高,将应答信号发送过去_nop5_();//SDA线的低电平持续5us,以符合应答信号定义的要求(>4us)scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//释放SDA线}void iic_send_no_ack()//主机给从机发送非应答信号{scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//SDA线拉高,即将发送非应答信号给从机scl=1;//SCL线拉高,将应答信号发送过去_nop5_();//SDA线的高电平持续5us,以符合非应答信号定义的要求(>4us)}void iic_write(unsigned char dat)//主机向从机写操作函数{unsigned char i;for(i=0;i<8;i++){scl=0;//SCL线拉低,以便让SDA线准备变化sda=(bit)(0x80&dat); //取字节数据的最高位,发送到SDA线dat=dat<<1;//发送的数据都是由高位到低位顺序发送的,所以要将所//需发送的那位移到数据的最高位,以发送到SDA线上scl=1;//SCL线拉高,数据被发送过去}}unsigned char iic_read()//主机向从机读操作的函数{unsigned char i;unsigned char dat; //定义一个字节变量,用来存储读出的从机数据dat=0;for(i=0;i<8;i++){dat=dat<<1;//将位数据不断地往高位移动,将接收到的位数据转换为字节数据scl=0;//SCL线拉低,以便让SDA线准备变化dat=dat|(unsigned char)sda;//将接收到的位数据强制转换成字节数据,并存到dat 中scl=1;//SCL线拉高,接收下一位数据}return dat;//数据接收完毕,带数据返回}void lcd_busy_check(void)//1602忙信号检测,忙则等待{P0=0xff;do{lcd_rs=0;//读状态操作,为0lcd_rw=1;//读操作为1lcd_en=0;lcd_en=1;//读状态,需为高电平}while (sta7==1);//如果为1则忙,等待...直到为0lcd_en=0;}void lcd_write_cmd(unsigned char cmd) //液晶写命令函数{lcd_busy_check(); //每次操作之前都要进行忙信号检测lcd_rs=0;//执行命令操作,为0lcd_rw=0;//写操作,为0P0=cmd;//送指令到液晶数据端口P0,准备执行命令_nop_();//这是一个延时函数,可延时一个机器周期,它在“intrins.h”中lcd_en=1;//高电平,指令送入液晶控制器_nop_();//保持一会儿,使指令可靠地送入液晶控制器lcd_en=0;//低电平,执行命令}void lcd_write_data(unsigned char dat) //液晶写数据函数{lcd_busy_check();//每次操作之前都要进行忙信号检测lcd_rs=1;//执行数据操作,为1lcd_rw=0;//写操作,为0P0=dat;//送数据到液晶数据端口P0,准备执行数据操作_nop_();lcd_en=1;//高电平,数据送入液晶液晶数据RAM_nop_();//保持一会儿,使显示数据可靠地送入液晶数据RAMlcd_en=0;//低电平,显示数据}void lcd1602_init()//液晶显示初始化操作{P0=0x00;hc573_sg_le=0;//关闭HC573使数码管不显示hc573_bit_le=0;lcd_en=0;//为0,为实现高脉冲作准备lcd_write_cmd(0x38);//设置为5x7显示lcd_write_cmd(0x0c);// 打开显示-显示光标-光标闪烁lcd_write_cmd(0x6);//地址加一,光标右移,整屏显示不移动lcd_write_cmd(0x01);//清屏}/*--这个函数的作用是:将读到的8591中的数据换算为电压值的个位值,----并转换为对应的ASCII码,用以在液晶中显示*/unsigned char data1_convert(unsigned char dat_temp){unsigned char data1;data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值data1=data1+48; //转换为对应的ASCII码,因为0对应ASCII码的48,以此类推return data1;}/*--这个函数的作用是:将读到的8591中的数据换算为电压值的小数点后第一位的值,----并转换为对应的ASCII码,用以以在液晶中显示*/unsigned char data0_convert(unsigned char dat_temp){unsigned char data0,data1;data1=(unsigned char)(((float)dat_temp/255)*5);//换算为电压值的个位值data0=(unsigned char)((((float)dat_temp/255)*5-data1)*10);//换算为为电压值的小--//--数点后第一位的那个值data0=data0+48;return data0;//转换为对应的ASCII码}void main(){unsigned char dat;//用于接收从8591中读到的数据lcd1602_init();rst=0;//关闭DS1302时钟芯片,避免引起干扰hc573_sg_le=0;hc573_bit_le=0;lcd_write_cmd(0x80);lcd_write_data('C');lcd_write_data('H');lcd_write_data('1');lcd_write_data(':');lcd_write_cmd(0x85);lcd_write_data('.');lcd_write_cmd(0x87);lcd_write_data('V');//上面的这些都是为了在1602中显示"CH1: : V"while(1){iic_start();iic_write(0x90);//对8591进行写操作iic_ack();iic_write(0x01);//设置为4路独立信号输入,并关闭通道自动加1,只用通道1iic_ack();iic_start();//重新开始,为读数据作准备iic_ack();iic_write(0x91);//对8591进行读操作iic_ack();dat=iic_read();//这还只是一个8位的数据(需进一步转换为实际电压值)iic_send_no_ack();iic_stop();lcd_write_cmd(0x84); //将要显示的字符显示在此地址处lcd_write_data(data1_convert(dat));//显示电压的整数部分lcd_write_cmd(0x86);//将要显示的字符显示在此地址处lcd_write_data(data0_convert(dat)); //显示电压的小数部分}}。
毕业设计基于单片机的家用防盗报警器的设计
常州机电职业技术学院毕业设计(论文)系部:电气工程系专业:应用电子技术题目:基于单片机的家用防盗报警器的设计毕业设计(论文)中文摘要目录1. 引言 (1)1.1 课题的背景及意义 (1)1.2 课题设计要求及任务 (1)2 整体设计方案 (2)方案一 (2)2.2 方案二 (2)3. 分电路设计 (3)电源电路设计 (3)利用LM7805设计供电电源电路 (3)利用外接电器做电源 (4)单片机模块的设计 (4)MCS-51系列单片机 (5)MSP430G2系列单片机 (6)传感器模块的选择与设计 (8)传感器信号处置器BISS0001 (8)传感器RE200B (10)3.4继电器模块的设计 (12)3. 4. 1继电器模块(5V,未采纳光耦} (12)光耦继电器模块(12V) (13)4 软件设计 (14)4.1 软件程序 (14)4.2 软件程序流程图 (16)5软硬件系统的调试 (17)6 附录 (25)附录一:电路图、PCB图 (25)6.2 附录二:元件清单 (26)结论 (27)致谢 (28)参考文献 (30)1. 引言随着此刻社会的进展,时期进步,高新技术的快速融入,人们的生活发生了庞大的改变,人们置购了大量高新技术的产品,许多高科技产品的利用愈来愈成为家庭生活的主旋律,因这人们对自己所处环境的平安要求就愈来愈高,专门是家居平安,不能不时刻留意不速之客的光顾。
此刻许多小区都有着保安看管,但在一些农村就没有这些设施了,于是,许多家庭都安装了报警系统,这有效的爱惜了大伙儿的财产平安。
在本文中,介绍一种利用热释电红别传感器进行监控,并进行报警的系统的设计。
1.1 课题的背景及意义该报警器要紧由热释电红别传感器及继电器模块,报警电路组成[1]。
热释电红别传感器是报警器设计中的核心器件,它可把人体的红外信号转换为电信号以供信号处置部份利用。
检测电路主若是把传感器输出的微弱电信号进行放大、滤波、延迟、比较,从而实现报警功能。
单片机LCD1602显示AD转换值
目录1.硬件设计任务1.1设计题目 (2)1.2设计背景及发展 (2)1.3设计内容 (2)1.3.1设计内容 (2)1.3.2设计目的 (2)1.4 使用说明 (2)2.设计原理2.1基本原理 (3)3.设计步骤3.1硬件设计 (3)3.1.1 确定所用的硬件 (3)3.1.2 熟悉所用的硬件 (3)(1) 8051单片机(2) 74LS138(3) ADC0809(4) 8255A(5)1602LCD3.1.3 硬件框图 (9)3.1.4 最小系统图 (10)(1)连线说明(2)配套地址3.2 软件设计 (11)3.2.1 流程框图 (12)3.2.2 程序清单 (16)3.3 调试过程与结果 (21)3.3.1 调试过程 (21)3.3.2 调试结果 (21)4. 设计心得4.1 设计心得 (22)5. 参考文献5.1 参考文献出处 (22)1.硬件设计任务1.1设计题目LCD显示设计(显示A/D转换值)1.2设计背景液晶显示器,简称LCD(Liquid Crystal Display)。
世界上第一台液晶显示设备出现在20世纪70年代初,被称之为TN-LCD(扭曲向列)液晶显示器。
尽管是单色显示,它仍被推广到了电子表、计算器等领域。
80年代,STN-LCD(超扭曲向列)液晶显示器出现,同时TFT-LCD(薄膜晶体管)液晶显示器技术被研发出来,但液晶技术仍未成熟,难以普及。
80年代末90年代初,日本掌握了STN-LCD及TFT-LCD 生产技术,LCD工业开始高速发展。
LCD发展过程:1888~1968年为液晶材料性能和应用研究时期。
1973~1985年为TN-LCD获得广泛应用时期。
1985~1993年为STN-LCD推广应用时期。
1993~2000年是TFT-LCD大发展时期,这个时期TFT-LCD的性能已可以与CRT 媲美。
LCD发展大大扩展了显示器的应用范围,使个人使用移动型手持显示器成为可能,因此,2000年以后将进入LCD与CRT争夺显示器主流市场的时代。
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_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、设计思路描述:1.1设计思路本自动增益控制放大器系统以MSP430G2553为控制核心。
利用单片机内部ADC10对末级输出信号采样,可由按键控制也可根据采样得到的末级输出信号幅度大小自动控制DAC7811作为TLC085反馈电阻网络实现对末级自动增益控制。
根据利用单片机内部ADC10对输出信号采样幅度大小自动控制CD4051选择OPA 2227反馈电阻,控制前级是否衰减。
使用LP2950-33稳压管转+3.3V 给单片机MSP430G2553 Launchpad 供电。
1.2系统原理框图系统原理框图2、硬件电路图:2.1 前级信号衰减电路利用单片机内部ADC10对输出信号经过OPA2340绝对值整形后的波形进行采样,根据幅值控制CD4051选择OPA2227反馈电阻,进而控制衰减10倍或1倍。
具体电路原理见附件1。
2.2 次级电压跟随器在前级衰减和末级自动增益控制放大之间加入射随器,可以起到缓冲,稳定系统的作用。
次级电压跟随器2.3 末级DAC7811增益自动控制电路采用单片机控制12位ADC7811,利用其内部R-2R 电阻网络,可根据公式codeV V in out 4096⨯-=ADC10Signal outSignal inOPA2227 DAC7811MSP430G2553TLC085Key and displayCD4051OPA 2340TLC085对输出信号幅度大小进行控制。
7811增益自动控制电路2.4 键盘显示模块为节约单片机I/O 资源,利用74HC164移位寄存器作为串转并实现I/O 口的扩展,仅用4个I/O 口就实现2×8键盘。
采用串行方式控制LCD12864显示。
3、算法数学描述交流信号幅值的判断:在程序中,每隔1607个时钟周期对输入的交流进行一次AD 采样,因为1607是一个质数,所以基本可以保证采样在不同的正弦相位,通过10000次取点计算出峰峰值。
MSP430学习笔记10-ADC采集1602显示
MSP430学习笔记10-ADC采集1602显示MSP430学习笔记10-ADC采集1602显示收藏同样是开发板中的例程,对关键的地方做了说明,程序如下:view plaincopy to clipboardprint?/********************************************************* 程序注意点:首先可以选择是否开启内部参考电压还是使用外部参考电压每个通道可以独立选择参考电压如果连接了外部参考电压应该注意关闭内部参考电压防止损坏单片机程序功能:MCU的片内ADC对P6.0端口的电压进行转换将模拟电压值显示在1602液晶上。
---------------------------------------------------------- 拨码开关设置:将LCD位拨至ON,其余位拨至OFF测试说明:调节电位器W1的旋钮观察液晶显示数字变化。
*********************************************************/ #include <msp430x14x.h>#include "cry1602.h"#include "cry1602.c"//typedef unsigned char uchar;//typedef unsigned int uint;#define Num_of_Results 32uchar shuzi[] = {"0123456789."};uchar tishi[] = {"The volt is:"};static uint results[Num_of_Results]; //保存ADC转换结果的数组void Trans_val(uint Hex_Val);/************************主函数****************************/ void main(void){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; //关闭电平转换LcdReset(); //复位1602液晶DispNChar(2,0,12,tishi); //显示提示信息Disp1Char(11,1,'V'); //显示电压单位P6SEL |= BIT0; // 使能ADC通道ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间// 上面的配置中并没有打开内部的参考电压// ADC12MCTLx用来选择通道和参考电压,这里面没有对此寄存器进行配置为默认值// 默认值是参考电压选择AVCC(3.3V),通道是A0,所以测量范围是0-3.3VADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器//上面的寄存器配置采样保持触发源选择时ADC12SC,采集信号使用采样时序电路产生的信号// 转换模式为单路重复转换上面的设置必须在ENC=0的情况下设置ADC12IE = BIT0; // 使能ADC中断ADC12CTL0 |= ENC; // 使能转换ADC12CTL0 |= ADC12SC; // 开始转换_EINT(); //开启全局中断LPM0;}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6.0口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uint index = 0;results[index++] = ADC12MEM0; // 将转换的结果存入数组if(index == Num_of_Results) //如果数组存满{uchar i;unsigned long sum = 0;index = 0; //在从头开始存,会覆盖原有的数据for(i = 0; i < Num_of_Results; i++) //计算和{sum += results[i];}sum >>= 5; //除以32Trans_val(sum);}}/*******************************************函数名称:Trans_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_Val--16进制数据n--变换时的分母等于2的n次方返回值:无********************************************/void Trans_val(uint Hex_Val){unsigned long caltmp;uint Curr_Volt;uchar t1,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n // 参考电压为3.3V,所以计算公式应该为Hex_val*3.3/2^n // 乘除计算通过移位来进行可以有效的提高程序运行效率ptr[0] = Curr_Volt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[2] = t1 / 10;ptr[3] = t1 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((6 + i),1,shuzi[ptr[i]]);。
用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);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/***********************内部基准电压2.5V*****************************/
#include "msp430g2553.h"
char a[6] ="";
int da;
int j ;
double c,data;
void delay(int t)
{
int s=500;
for(;t>0;t--)
{
for(;s>0;s--)
{
;;
}
}
}
void write_com(char com)
{
P1OUT&=~(1<<3);//rS=0;
P1OUT&=~(1<<4);//RW=0;
P1OUT&=~(1<<5);//en=0;
P1OUT&=~(1<<1);//
delay(8);
P2OUT=com;
delay(8);
P1OUT|=(1<<5);//en=1;
delay(8);
P1OUT&=~(1<<5);//en=0;
}
void write_data(char dt)
{
P1OUT|=(1<<3);//rs=1;
P1OUT&=~(1<<4);//rw=0;
P1OUT&=~(1<<5);//en=0;
delay(8);
P2OUT=dt;
delay(8);
P1OUT|=(1<<5);//en=1;
delay(8);
P1OUT&=~(1<<5);//en=0;
}
void initial_lcd(void)
{
delay(20);
write_com(0x38);
delay(15);
write_com(0x0c);
delay(15);
write_com(0x06);
delay(15);
write_com(0x01) ;
}
void LCD_Disp(char x,char y,char *character)
{
char xtemp;
switch(x)
{
case 0:xtemp=0x80+y;break;
case 1:xtemp=0xc0+y;break;
default:break;
}
write_com(xtemp);
while(*character!=0)
{
write_data(*character);
character++;
}
}
void main(void)
{
char *pa;
pa=a;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P2SEL=0x00;
P2DIR |= 0xff; // Set P1.0 to output direction P1DIR |= 0x38;
initial_lcd(); //LCD初始化
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v
__enable_interrupt(); // Enable interrupts.
TACCR0 = 30; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.
LPM0; // Wait for delay.
TACCTL0 &= ~CCIE; // Disable timer Interrupt
__disable_interrupt();
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= 0x02; // PA.1 ADC option select
for (;;)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exi
da = ADC10MEM;
data = ((double)da/1024)*2.5;
c =data;
a[0]=((int)c%10+0x30);
a[1]=0x2e;
a[2]=((int)(c*10)%10+0x30);
a[3]=((int)(c*100)%10+0x30);
a[4]=((int)(c*1000)%10+0x30);
a[5]='\0';
for(j = 0;j <= 5000;j++) //延时显示
LCD_Disp(0,0,pa);
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
}
/****************************内部基准电压 2.5V版**************************************/。