TLC1549数字电压表程序数字电压表1602液晶显示
1602数字显示及采样
1//1602液晶显示程序, TX-1B实验板上的1602LCD的R/W读写端接地, 即始终只写, 不读数据2//使用1602LCD显示DS18B20转换的温度值3#include <reg52.H>4#include <intrins.H>5#include <math.H>67#define uchar unsigned char8#define uint unsigned int9sbit dula = P2^6;10sbit wela = P2^7;11sbit RS = P3^5; //数据/命令选择端(H/L)13sbit LCDEN = P3^4; //使能端14void delayUs()16{17 _nop_();18}1920void delayMs(uint a)21{22uint i, j;23for(i = a; i > 0; i--)24for(j = 100; j > 0; j--);25}2627//第一行开始地址为0x80, 第二行开始地址为0xc0;28//写命令:RS=0, RW=0;29void writeComm(uchar comm)30{31 RS = 0;32 P0 = comm;33 LCDEN = 1;34 delayUs();35 LCDEN = 0;36 delayMs(1);37}3839//写数据:RS=1, RW=0;40void writeData(uchar dat)41{42 RS = 1;43 P0 = dat;44 LCDEN = 1;45 delayUs();46 LCDEN = 0;47 delayMs(1);48}4950//初始化51//显示模式, 固定指令为00111000=0x38, 16*2显示, 5*7点阵,8位数据接口52//显示开/关及光标设置53//指令1: 00001DCB : D:开显示/关显示(H/L); C:显示光标/不显示(H/L), B:光标闪烁/不闪烁(H/L)54//指令2: 000001NS :55//N=1, 当读/写一个字符后地址指针加1, 且光标也加1; N=0则相反56//S=1, 当写一个字符, 整屏显示左移(N=1)或右移(N=0), 但光标不移动; S=0, 整屏不移动57void init()58{59//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LC D正常工作60 dula = wela = 0;61 writeComm(0x38); //显示模式62 writeComm(0x0c); //开显示, 关光标63 writeComm(0x06); //写字符后地址加1, 光标加164 writeComm(0x01); //清屏65}6667void writeString(uchar * str, uchar length)68{69 uchar i;70for(i = 0; i < length; i++)71 {72 writeData(str[i]);73 }74}7576/*****************************DS18B20*********************** ********/77sbit ds = P2^2;78//初始化DS18B2079//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动80void dsInit()81{82//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us83 unsigned int i;84 ds = 0;85 i = 100; //拉低约800us, 符合协议要求的480us以上86while(i>0) i--;87 ds = 1; //产生一个上升沿, 进入等待应答状态88 i = 4;89while(i>0) i--;90}9192void dsWait()93{94 unsigned int i;95while(ds);96while(~ds); //检测到应答脉冲97 i = 4;98while(i > 0) i--;99}100101//向DS18B20读取一位数据102//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,103//之后DS18B20则会输出持续一段时间的一位数据104bit readBit()105{106 unsigned int i;107 bit b;108 ds = 0;109 i++; //延时约8us, 符合协议要求至少保持1us111 i++; i++; //延时约16us, 符合协议要求的至少延时15us以上112 b = ds;113 i = 8;114while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求115return b;116}117118//读取一字节数据, 通过调用readBit()来实现119unsigned char readByte()120{121 unsigned int i;122 unsigned char j, dat;123 dat = 0;124for(i=0; i<8; i++)125 {126 j = readBit();127//最先读出的是最低位数据128 dat = (j << 7) | (dat >> 1);129 }130return dat;131}132133//向DS18B20写入一字节数据134void writeByte(unsigned char dat)135{136 unsigned int i;137 unsigned char j;139for(j = 0; j < 8; j++)140 {141 b = dat & 0x01;142 dat >>= 1;143//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1144if(b)145 {146 ds = 0;147 i++; i++; //拉低约16us, 符号要求15~60us内148 ds = 1;149 i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求150 }151else//写"0", 将DQ拉低60us~120us152 {153 ds = 0;154 i = 8; while(i>0) i--; //拉低约64us, 符号要求155 ds = 1;156 i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了157 }158 }159}160161//向DS18B20发送温度转换命令162void sendChangeCmd()163{164 dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化165 dsWait(); //等待DS18B20应答166 delayMs(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号167 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom168 writeByte(0x44); //写入温度转换命令字 Convert T169}170171//向DS18B20发送读取数据命令172void sendReadCmd()173{174 dsInit();175 dsWait();176 delayMs(1);177 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom178 writeByte(0xbe); //写入读取数据令字 Read Scratchpad179}180181//获取当前温度值182int getTmpValue()183{184 unsigned int tmpvalue;185int value; //存放温度数值186float t;187 unsigned char low, high;188 sendReadCmd();189//连续读取两个字节数据190 low = readByte();191 high = readByte();192//将高低两个字节合成一个整形变量193 //计算机中对于负数是利用补码来表示的194 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value195 tmpvalue = high;196 tmpvalue <<= 8;197 tmpvalue |= low;198 value = tmpvalue;199200//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度201 t = value * 0.0625;202//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入203 //如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度204 //如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度205 value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5206return value;207}208209void display(int v)210{211 unsigned char count;212 unsigned char datas[] = {0, 0, 0, 0, 0};213 unsigned int tmp = abs(v);214 datas[0] = tmp / 10000;215 datas[1] = tmp % 10000 / 1000;216 datas[2] = tmp % 1000 / 100;217 datas[3] = tmp % 100 / 10;218 datas[4] = tmp % 10;219 writeComm(0xc0+3);220if(v < 0)221 {222 writeString("- ", 2);223 }224else225 {226 writeString("+ ", 2);227 }228if(datas[0] != 0)229 {230 writeData('0'+datas[0]);231 }232for(count = 1; count != 5; count++)233 {234 writeData('0'+datas[count]);235if(count == 2)236 {237 writeData('.');238 }239 }240}241/*****************************DS18B20********************** *********/242243void main()244{245 uchar table[] = "Now Temperature:";246 sendChangeCmd();247 init(); 248 writeComm(0x80); 249 writeString(table, 16); 250 while (1) 251 { 252 delayMs(1000); //温度转换时间需要750ms 以上 253 writeComm(0xc0);254 display(getTmpValue());255 sendChangeCmd();256 } 257}OptionsDisableWhat is new with Snap Shots?1 23456789101112博客园首页新文章新随笔订阅管理posts - 101, comments - 110, trackbacks - 1单片机练习- DS18B20温度转换与显示最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
基于51单片机的1602液晶显示温度和时间的C程序
//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
LCD1602和TLC1543单片机频率计程序
{unsigned int i;
for(i=0;i<n;i++);}
void delay (unsigned int n)
{unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++);}
unsigned char keystop_flag,/*ad_temp[20],*/xiaosd=15,xiaosd_flag;
unsigned char vpp_flag,vppstop_flag,xiangyi_flag,xianyistop_flag;
unsigned char xs_add,ye_add,xianshu,xianshu2,xxd_add;
sbit L_CS1 = P0^5;
sbit L_CS2 = P0^6;
sbit EST = P0^7;
sbit sda=P0^4;sbit clk=P0^3;
////////////////////////////////////////////////////////
/*sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;
sbit P23=P2^3;sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;sbit P27=P2^7;*/
sbit P32=P3^2;sbit P33=P3^3;
/////////////////////////////////////////////////////////
1602液晶初始化程序(汇编)
〔原创〕1602液晶初始化程序(2007-12-22 18:10:40)标签:1602液晶it/科技汇编语言液晶初始化,显示数字,按秒计数RS EQU P2.0RW EQU P2.1E EQU P2.2IN_0 EQU P0SECL EQU 40H ;秒低位SECH EQU 41H ;秒高位MH1 EQU 42H ;冒号MINL EQU 43H ;分低位MINH EQU 44H ;分高位MH2 EQU 45H ;冒号HOURL EQU 46H ;时低位HOURH EQU 47H ;时高位;*********************************ORG 0000HAJMP STARTORG 000BHAJMP INTT_0START:MOV SP,#70HMOV R2,#20ACALL INIT_LCD ;初始化液晶MOV R5,#00HMOV IN_0,#84H ;写入显示起始地址(第一行第五个位置ACALL ENABLEMOV TH0,#3fH ;50MSMOV TL0,#0b0HMOV TMOD,#01HACALL SJCZSTART1:SETB EASETB ET0SETB TR0LCALL WDATAAJMP START1;*****时间初值*******SJCZ: MOV 40H,#8 ;显示初值是 08:08:08MOV 41H,#0MOV 42H,#10MOV 43H,#8MOV 44H,#0MOV 45H,#10MOV 46H,#8MOV 47H,#0RET;****T0定时器中断****INTT_0: PUSH ACCMOV TL0,#0b0H ;送定时初值MOV TH0,#3fHDJNZ R2,TTMOV R2,#20INC SECL ;秒记数,到60S就清0MOV A,SECLCJNE A,#0AH,TTINC SECHMOV SECL,#0MOV A,SECHCJNE A,#06H,TTMOV SECH,#0INC MINL ;分记数,到60分请0MOV A,MINLCJNE A,#0AH,TTMOV MINL,#0INC MINHMOV A,MINHCJNE A,#06H,TTMOV MINH,#0INC HOURL ;时记数,到24时清0MOV A,HOURLCJNE A,#04H,TT2MOV A,HOURHCJNE A,#02H,TT1MOV HOURL,#0MOV HOURH,#0AJMP TTTT2: CJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT1: MOV A,HOURLCJNE A,#0AH,TTMOV HOURL ,#0INC HOURHAJMP TTTT: POP ACCRETI;*******液晶初始化*****INIT_LCD:CALL DELAYL ;延时20ms,等待LCD完成电源的启动MOV IN_0,#01H ;清屏并光标复位ACALL ENABLEMOV IN_0,#38H ;设置显示模式:8位2行5x7点阵ACALL ENABLEMOV IN_0,#0FH ;显示器开、光标开、光标允许闪烁ACALL ENABLEMOV IN_0,#06H ;文字不动,光标自动右移ACALL ENABLEMOV IN_0,#0C0H ;写入显示起始地址(第二行第一个位置)ACALL ENABLERET;******写数据程序***WDATA: MOV IN_0,#84H ;写入显示起始地址(第一行第五个位置ACALL ENABLEMOV R1,#8MOV R0,#47HWDATA1: MOV A,@R0MOV DPTR,#TABLEMOVC A,@A+DPTRMOV IN_0,A ;写入数据SETB RSCLR RWCLR EACALL CHECKBUSYSETB E ; 忙检测DEC R0DJNZ R1,WDATA1MOV R1,#8RET;*******显示字母表********TABLE: DB 30H,31H,32H,33H,34H,35H ;0 1 2 3 4 5DB 36H,37H,38H,39H,3AH,80H,2EH ;6 7 8 9 : 空格 .;*********写指令*****ENABLE: CLR RS ;写入控制命令的子程序CLR RWCLR EACALL CHECKBUSYSETB ERET;*******程序忙检测***CHECKBUSY:MOV IN_0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOPSETB EJB P0.7,CHECKBUSY ;如果P1.7为高电平表示忙就循环等待RET;******延时程序****DELAY: MOV R6,#50DEL: MOV R7,#48DJNZ R7,$DJNZ R6,DELRETDELAYL: MOV R7,#100 ;长延时20msD1: MOV R6,#98DJNZ R6,$DJNZ R7,D1RETEND51单片机的1602没做过,只做过其他的控制。
1602液晶显示器基本操作时序
1602液晶显示器基本操作时序标题:1602液晶显示器基本操作时序简介:本文将介绍1602液晶显示器的基本操作时序,帮助读者了解如何正确使用该显示器。
正文:1602液晶显示器是一种常用的显示设备,广泛应用于各种电子产品中。
为了正确使用该显示器,了解其基本操作时序是非常重要的。
第一步是连接显示器。
首先,将显示器的VSS引脚连接到地,VDD 引脚连接到电源正极。
接着,将V0引脚连接到可变电阻器的中间引脚,两侧引脚分别连接到地和电源正极。
然后,将RS引脚连接到控制器的某个I/O口,RW引脚连接到地,E引脚连接到控制器的另一个I/O口。
最后,将D4-D7引脚分别连接到控制器的其他四个I/O 口。
第二步是初始化显示器。
在连接完成后,需发送一系列指令来初始化显示器。
首先,将RS引脚置低电平,表示发送的是指令。
然后,发送0x33指令,接着发送0x32指令。
这两个指令用于设置显示模式。
接下来,发送0x28指令,用于设置显示器的行数和字体大小。
最后,发送0x0C指令,用于开启显示器并关闭光标。
第三步是写入数据。
在初始化完成后,可以向显示器写入数据进行显示。
将RS引脚置高电平,表示发送的是数据。
然后,发送0x80指令,将光标定位到第一行第一列。
接着,通过发送ASCII码来显示相应的字符或数字。
发送完一个字符后,将光标右移一位,直到显示完所有内容。
第四步是清屏和光标复位。
如果需要清除屏幕上的内容,只需发送0x01指令即可。
同时,可以将光标复位到第一行第一列,发送0x80指令即可。
在使用1602液晶显示器时,需要注意以上基本操作步骤和时序。
确保连接正确,并按照指令发送数据,才能正常显示内容。
同时,注意避免触碰显示器的其他部分,以免损坏设备。
总结:本文介绍了1602液晶显示器的基本操作时序,包括连接显示器、初始化显示器、写入数据以及清屏和光标复位。
正确操作显示器,能够实现准确的显示效果,提升用户体验。
希望本文能为读者在使用1602液晶显示器时提供一些帮助。
1602液晶测试程序.c
1602液晶测试程序.c/******************************************************************************** * 文件名:main.c* 描述:1602液晶与按键* 版本号:v1.0.0* 备注:* 1602液晶显示按键输入的数值******************************************************************************* */#include <reg52.h>#define LCD1602_DB P0sbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_E = P1^5;void InitLcd1602();void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);extern void ys();void main(){unsigned char str[] = "zuan zhu";InitLcd1602();LcdShowStr(0, 0, str);LcdShowStr(8, 0,":");LcdShowStr(0, 1, "youwen");LcdShowStr(8, 1,":");while (1);}/* 等待液晶准备好*/void LcdWaitReady(){unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;do {LCD1602_E = 1;sta = LCD1602_DB; //读取状态字LCD1602_E = 0;} while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止}/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值*/void LcdWriteCmd(unsigned char cmd){LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;}/* 向LCD1602液晶写入一字节数据,dat-待写入数据值*/void LcdWriteDat(unsigned char dat){LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0;}/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标*/ void LcdSetCursor(unsigned char x, unsigned char y){unsigned char addr;if (y == 0) //由输入的屏幕坐标计算显示RAM的地址addr = 0x00 + x; //第一行字符地址从0x00起始elseaddr = 0x40 + x; //第二行字符地址从0x40起始LcdWriteCmd(addr | 0x80); //设置RAM地址}/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针*/void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str){LcdSetCursor(x, y); //设置起始地址while (*str != '\0') //连续写入字符串数据,直到检测到结束符{LcdWriteDat(*str++); //先取str指向的数据,然后str自加1 }}/* 初始化1602液晶*/void InitLcd1602(){LcdWriteCmd(0x38); //16*2显示,5*7点阵,8位数据接口LcdWriteCmd(0x0C); //显示器开,光标关闭LcdWriteCmd(0x06); //文字不动,地址自动+1LcdWriteCmd(0x01); //清屏}。
液晶显示控制(1602)c语言实例
DB1 低4位三态、 双向数据总线 1位
9
DB2 低4位三态、 双向数据总线 2位
10 DB3 低4位三态、 双向数据总线 3位
11 DB4 高4位三态、 双向数据总线 4位
12 DB5 高4位三态、 双向数据总线 5位
13 DB6 高4位三态、 双向数据总线 6位
14 DB7 高4位三态、 双向数据总线 7位 (最高位)(也是busy flag)
4 可视角度
➢大多数光都是从屏幕中垂直射出来的,所以从某一个 较大的角度观看液晶显示器时,便不能看到原本的颜 色,甚至只能看到全白或全黑。为了解决这个问题, 到目前为止有三种比较流行的技术,分别是: TN+FILM、IPS(IN-PLANE -SWITCHING)和 MVA(MULTI-DOMAIN VERTICAL align MENT)。
(8)写指令38H:显示模式设置; (9)写指令08H:显示关闭;
(10)写指令01H:显示清屏; (11)写指令06H:显示光标移动设置; (12)写指令0CH:显示开及光标设置;
2011年春
LCD 1602初始化函数实例
void Initialize_LCD( )
{
Write_LCD_Command(0x38);
4 RS RS为寄存器选择,高电平1时选择数据寄 存器、低电平0时选择指令寄存器。
5 R/W R/W为读写信号线,高电平时进行读操作, 低电平时进行写操作。
6E
E(或EN)端为使能(enable)端,下降沿使 能。
2011年春
引脚 符号
功能说明
7
DB0 低4位三态、 双向数据总线 0位
(最低位)
8
(2)写指令: 输入:RS=L;RW=L; D0~D7=指令码;E=高脉冲
1602液晶显示屏模块资料--附程序
1602液晶显⽰屏模块资料--附程序液晶显⽰屏模块说明⼀.功能说明:该模块可以通过单⽚机控制并⾏⼝数据16字×2⾏的字符型液晶模块的显⽰。
⼆.硬件设计:核⼼控制:Freescale MC9S12D64 单⽚机系统板执⾏部分:16字X2⾏的字符型液晶模块操作部分:通过USBDM将已写好的程序刷⼊单⽚机指⽰部分:单⽚机上的发光⼆极管电源部分:提供给电机5V的直流稳压电源硬件说明:⼀.液晶显⽰屏引脚的定义:1602采⽤标准的16脚接⼝,其中:(模块背⾯有标注)。
1脚VSS:接地;2脚Vdd:接+5V电源;3脚VO:对⽐度调整端,LCD驱动电压范围为Vdd~VO。
当VO接地时,对⽐度最强;4脚RS:寄存器选择端,RS为0时,选择命令寄存器IR;RS为1时,选择数据寄存器DR;5脚:读写控制端,为1时,选择读出;为0时,则选择写⼊;6脚Enable:使能控制端,Enable为1时,使能;Enable 为0,禁⽌;7脚~14脚D0~D7:数据总线;15脚LED+:背景光源,接+5V;16脚LED-:背景光源,接地。
1602液晶模块内部的字符发⽣存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英⽂字母的⼤⼩写、常⽤的符号、和⽇⽂假名等,每⼀个字符都有⼀个固定的代码,其中数字与字母同ASCII码兼容。
其内部还有⾃定义字符(CGRAM),可⽤业存储⾃已定义的字符。
指令1:清显⽰屏;指令2:光标复位;指令3:光标和显⽰模式设置 I/D:光标移动⽅向,⾼电平右移,低电平左移,S:屏幕上所有⽂字是否左移或者右移。
⾼电平表⽰有效,低电平则⽆效。
指令4:显⽰开关控制。
D:控制整体显⽰的开与关,⾼电平表⽰开显⽰,低电平表⽰关显⽰ C:控制光标的开与关,⾼电平表⽰有光标,低电平表⽰⽆光标 B:控制光标是否闪烁,⾼电平闪烁,低电平不闪烁。
指令5:光标或显⽰移位 S/C:⾼电平时移动显⽰的⽂字,低电平时移动光标。
【免费下载】1602液晶显示器资料 一看即会 附程序
2.光标归位指令
功能:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为 0; <3> 保持 DDRAM 的内容不变。
3.进入模式设置指令
功能:设定每次定入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。 参数设定的
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
1602液晶显示计算器电路图及程序
#include 〈reg51.h>#include 〈intrins。
h〉#include <stdio。
h〉#include 〈stdlib。
h〉unsigned char code Error[]={”error”};unsigned char code Systemerror[]={”system error”};unsigned char code Lcd[]={"lcd calculate”};char str[16];sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit BF=P0^7;/***********************函数功能:延时1ms***********************/void delay1ms(){unsigned char i,j;for (i=0;i〈10;i++)for (j=0;j<33;j++);}/************************函数功能:延时n毫秒入口参数:n************************/void delaynms(unsigned char n){unsigned char i;for (i=0;i〈n;i++)delay1ms();}/************************************函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙。
************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平、RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读/写_nop_();_nop_();_nop_();_nop_();result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate**************************************/void WriteInstruction(unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0;//根据规定,RS和R/W同为低电平时,可以写入指令RW=0;E=0;_nop_();_nop_();P0=dictate;//将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_();E=1; //E置高电平_nop_();_nop_();_nop_();_nop_();E=0;}/*****************************************函数功能:指定字符显示的实际地址入口参数:x,y*****************************************/void WriteAddress(unsigned char x,unsigned char y){unsigned char temp;if(x==0){switch(y){case 0:temp=0x00; break;case 1:temp=0x01;break;case 2:temp=0x02;break;case 3:temp=0x03;break;case 4:temp=0x04;break;case 5:temp=0x05;break;case 6:temp=0x06;break;case 7:temp=0x07;break;case 8:temp=0x08;break;case 9:temp=0x09;break;case 10:temp=0x0a;break;case 11:temp=0x0b;break;case 12:temp=0x0c;break;case 13:temp=0x0d;break;case 14:temp=0x0e;break;case 15:temp=0x0f;break;}}if(x==1){switch(y){case 0:temp=0x40;break;case 1:temp=0x41;break;case 2:temp=0x42;break;case 3:temp=0x43;break;case 4:temp=0x44;break;case 5:temp=0x45;break;case 6:temp=0x46;break;case 7:temp=0x47;break;case 8:temp=0x48;break;case 9:temp=0x49;break;case 10:temp=0x4a;break;case 11:temp=0x4b;break;case 12:temp=0x4c;break;case 13:temp=0x4d;break;case 14:temp=0x4e;break;case 15:temp=0x4f;break;}}WriteInstruction(temp|0x80); //显示位置的确定方法规定为“80H+地址码x”}/*****************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y*****************************************/void WriteData (unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;P0=y;//将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0;//当E由高电平跳变成低电平时,液晶模块开始执行指令}/*****************************************函数功能:对LCD的显示模式进行初始化设置*****************************************/void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x0c);//显示模式设置:显示开,无光标,光标不闪烁delaynms(5);WriteInstruction(0x06);//显示模式设置:光标右移,字符不移delaynms(5);WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除delaynms(5);}/***************************************函数功能:显示字符串***************************************/void display_error(){unsigned char i;WriteAddress(0,0);i=0;while(Error[i]!='\0'){WriteData(Error[i]);i++;delaynms(100);}}void display_systemerror(){unsigned char i;WriteAddress(0,0);i=0;while(Systemerror[i]!='\0’){WriteData(Systemerror[i]);i++;delaynms(100);}}void display_lcd(){unsigned char i;WriteAddress(0,0);i=0;while(Lcd[i]!='\0'){WriteData(Lcd[i]);i++;delaynms(100);}}/*************************** 函数功能:按键判断**************************/ bit judge(){unsigned char keycode;P1=0x0f;keycode=P1;if(keycode==0x0f)return(0);elsereturn(1);}/*****************************函数功能:键盘扫描*****************************/unsigned char scan(){unsigned char keycode,keyscan;keyscan=0xef;while(keyscan!=0xff){P1=keyscan;keycode=P1;if((keycode&0x0f)!=0x0f)break;keyscan=(keycode〈<1)|0x0f;}keycode=~keycode;return(keycode);}/*******************************函数功能:扫描键盘返回值******************************/ unsigned char Key_Num(){unsigned char keycode;unsigned char yong;if(judge()){delaynms(20);if(judge()){keycode=scan();while(judge());switch(keycode){case 0x11:yong='7';break;case 0x12:yong='4’;break;case 0x14:yong=’1';break;case 0x18:yong=0;break;case 0x21:yong=’8’;break;case 0x22:yong=’5’;break;case 0x24:yong='2';break;case 0x28:yong='0’;break;case 0x41:yong=’9';break;case 0x42:yong='6';break;case 0x44:yong='3’;break;case 0x48:yong='=';break;case 0x81:yong=’/';break;case 0x82:yong=’*’;break;case 0x84:yong=’-';break;case 0x88:yong=’+’;break;default:display_systemerror();}return(yong);}}elsereturn(0xff);}/**************************************itoa函数定义*********************************/unsigned char itoa(long int num){unsigned char i,j,L;unsigned char temp[16];for(i=0;num!=0;i++){temp[i]=num%10+48;num=num/10;}L=i;if(i>16){display_systemerror();}for(j=0;j〈=L;j++){str[j]=temp[i];i——;}return(L);}/*****************************************函数功能:主函数****************************************/void main(){long int a;long int b;unsigned char flag;unsigned char sign;unsigned char i,j,s,x;unsigned char num;unsigned char fgh;unsigned char temp[16];LcdInitiate();display_lcd();delaynms(20);WriteInstruction(0x01);flag=1;while(1){num=Key_Num();if(num!=0xff){if(fgh==1){WriteInstruction(0x01);fgh=0;}if((num!=’+')&&(num!='—')&&(num!='*’)&&(num!='/')&&(num!='。
1602液晶显示程序
ListLength = 0; Y &= 0x1; X &= 0xF; //限制 X 不能大于 15,Y 不能大于 1 while (DData[ListLength]>0x20) //若到达字串尾则退出 { if (X <= 0xF) //X 坐标应小于 0xF { DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++; } } } //5ms 延时 void Delay5Ms(void) { unsigned int TempCyc = 5552; whilehar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void); unsigned char code csdn[] = {"csdn"}; unsigned char code net[] = {}; void main(void) { LCMInit(); //LCM 初始化 Delay5Ms(); //延时片刻(可不要) DisplayListChar(0, 5, csdn); DisplayListChar(1, 0, net); ReadDataLCM();//测试用句无意义 while(1); } //写数据 void WriteDataLCM(unsigned char WDLCM) { ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1; } //写指令 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC 为 0 时忽略忙检测 { if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; } //读数据 unsigned char ReadDataLCM(void) { LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0;
基于51单片机的电压监测+液晶LCD1602显示程序源代码
基于51单片机的电压监测+液晶LCD1602显示程序源代码/*******************电压监测+液晶LCD1602显示程序源代码********************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:电压监测+液晶LCD1602显示功能测试。
操作说明:监测电池电压,并将电池电压值显示在液晶LCD1602上。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define ADC_POWER 0x80 //将0x80宏定义成ADC_POWER #define ADC_FLAG 0x10 //将0x10宏定义成ADC_FLAG#define ADC_START 0x08 //将0x08宏定义成ADC_START #define ADC_SPEEDLL 0x00 //将0x00宏定义成ADC_SPEEDLL #define ADC_SPEEDL 0x20 //将0x20宏定义成ADC_SPEEDL #define ADC_SPEEDH 0x40 //将0x40宏定义成ADC_SPEEDH #define ADC_SPEEDHH 0x60 //将0x60宏定义成ADC_SPEEDHH#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); //LCD显示一个字符串void DY_INIT(void); //AD初始化unsigned char GetDYResult(unsigned char ch); //获取AD值unsigned char code welcome[] = {"DY JIANCE"};unsigned char code Voltage[] = {"Voltage: . V"}; //LCD显示内容V:void delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--) delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void DY_INIT(void) //AD初始化{P1ASF = 0x20; //P1.5作为ADADC_RES = 0;ADC_CONTR = ADC_POWER|ADC_SPEEDLL;}unsigned char GetDYResult(unsigned char ch) //获取AD值{ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ch|ADC_START;delay(4);while(!(ADC_CONTR&ADC_FLAG));ADC_CONTR&=~ADC_FLAG;return ADC_RES;}void DY_JianCe(void) //电压监测函数{u8 AD_RESULT;float temp;unsigned int tempA;unsigned char disbuff[4]={0,0,0,0};AD_RESULT = GetDYResult(0x05); //读取电压值temp =((float)AD_RESULT/256)*5*2; //数值转换tempA = temp*1000;disbuff[3]=tempA/10000;disbuff[2]=tempA/1000%10;disbuff[1]=tempA/100%10;disbuff[0]=tempA/10%10;DisplayOneChar(8,1,(0x30+disbuff[3])); //显示电压值delay_ms(10); //延时DisplayOneChar(9,1,(0x30+disbuff[2])); //显示电压值delay_ms(10); //延时DisplayOneChar(11,1,(0x30+disbuff[1])); //显示电压值delay_ms(10); //延时DisplayOneChar(12,1,(0x30+disbuff[0])); //显示电压值delay_ms(10); //延时}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平 LCD_RW = 1; //LCD管脚RW设置成高电平 LCD_EN = 0; //LCD管脚E设置成低电平 LCD_EN = 0; //LCD管脚E设置成低电平 LCD_EN = 1; //LCD管脚E设置成高电平 while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平 _nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平 LCD_RW = 0; //LCD管脚RW设置成低电平 _nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平 _nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平 LCD_RW = 0; //LCD管脚RW设置成低电平 P0 = WDLCD; //将数据送入P0口_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(3,0,welcome); //LCD1602显示Hello My Friendsdelay_ms(10); //延时DisplayListChar(0,1,Voltage);delay_ms(10); //延时DY_INIT(); //AD初始化delay_ms(10);while(1){DY_JianCe(); //电压监测函数delay_ms(200);}}程序源代码是编译通过的电压监测接口电路图该程序的实际运行效果。
单片机课程设计 数字电压表 程序和电路图
功能:电压报警5V直流测量0.02V 误差LCD显示名字程序COM EQU 50H ;指令寄存器DAT EQU 51H ;数据寄存器RS EQU P2.1 ;LCD寄存器选择信号RW EQU P2.2 ;LCD读/写选择信号E EQU P2.3 ;LCD使能信号ORG 0000HLJMP MAIN ;主程序入口地址ORG 000BHLJMP BT0 ;T0中断入口ORG 0030H ;主程序,初始化MAIN:MOV SP,#60HLCALL INTMOV 30H,#30H ;电压整数位MOV 31H,#0A5H ;小数点位MOV 32H,#30H ;小数个位MOV 33H,#30H ;小数十位MOV 34H,#30H ;小数百位MOV 35H,#56H ;字符"V"MOV R7,#30HLCALL STR0 ;显示字符串0LCALL DELAYLCALL STR1 ;显示字符串1LCALL DELAYLCALL N2 ;显示V oltage=0.000V;***********定时器初始化程序***********MOV TMOD,#00H ;定时器T0设为方式0MOV TH0,#00H ;装入定时常数定时100usMOV TL0,#00HSETB TR0 ;启动T0MOV 24H,#08H;装入T0中断次数MOV IE,#82H ;开中断LP:MOV R7,#30H ;显示缓冲区首地址LCALL DISPL YSJMP LP ;循环显示LED1:CLR P3.0RET;********************************************************************;定时器T0中断服务子程序,读取ADC0809第0通道的A/D转换结果并化为显示值* ;********************************************************************BT0:PUSH ACCPUSH PSWMOV PSW,#08HCLR TR0MOV TH0,#00H ;重新装入初值MOV TL0,#00HDEC 24HMOV A,24HJNZ RTN1MOV 24H,#08HLCALL ADCRTN1: SETB TR0POP PSWPOP ACCRETIADC:MOV DPTR,#0F6FFHMOV A,#0 ;选择通道0MOVX @DPTR,A ;启动AD转换MOV A,#40HDJNZ ACC,$MOVX A,@DPTRMOV 22H,AMOV 21H,#0CCHCJNE A,21H,BJ0BJ0:JNC LEDSJMP LL0LL0:SETB P3.0SJMP LLLED:LCALL LED1LL: MOV A,22HMOV B,#05H ;A/D转换结果化为显示值MUL AB ;(AD*5)/256MOV 30H,B ;AD*5的高字节为整数部分MOV B,#0AHMUL AB ;AD*5的低字节为/256的结果,为小数部分MOV 32H,B ;二进制小数换为10进制数MOV B,#0AHMUL ABMOV 33H,BMOV B,#0AHMUL ABMOV 34H,BMOV A,30HMOV DPTR,#TABMOVC A,@A+DPTRMOV 30H,AMOV A,32HMOVC A,@A+DPTRMOV 32H,AMOV A,33HMOVC A,@A+DPTRMOV 33H,AMOV A,34HMOVC A,@A+DPTRMOV 34H,ARETDISPL Y: ;LCD显示子程序MOV COM,#0CAHLCALL PR1MOV DAT,30HLCALL PR2MOV DAT,31HLCALL PR2MOV DAT,32HLCALL PR2MOV DAT,33HLCALL PR2MOV DAT,34HLCALL PR2MOV DAT,35HLCALL PR2RETSTR0:MOV COM,#01HLCALL PR1MOV COM,#06HLCALL PR1MOV COM,#090H ;设置DDRAM地址LCALL PR1 ;调写指令代码子程序MOV DPTR,#TAB4MOV R2,#16MOV R3,#00HWRIN0:MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,WRIN0MOV COM,#0D0HLCALL PR1MOV DPTR,#TAB5MOV R2,#16MOV R3,#00HWRIN1:MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,WRIN1MOV R3,#10HZUOYI:MOV COM,#18HLCALL PR0DJNZ R3,ZUOYILCALL DELAY00LCALL DELAY00LCALL DELAY00LCALL DELAY00RETRETSTR1:MOV COM,#01H ;LCD清0命令LCALL PR1 ;调写指令代码子程序MOV COM,#06H ;输入方式命令,光标右移LCALL PR1 ;调写指令代码子程序MOV COM,#40HLCALL PR1MOV R5,#20HMOV DPTR,#ZIMOV R4,#0LOOP1:MOV A,R4MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R4DJNZ R5,LOOP1MOV COM,#80HLCALL PR1MOV DPTR,#TAB2MOV A,#00HMOVC A,@A+DPTR MOV DAT,ALCALL PR2MOV A,#01HMOV DPTR,#TAB2 MOVC A,@A+DPTR MOV DAT,ALCALL PR2MOV A,#02HMOV DPTR,#TAB2 MOVC A,@A+DPTR MOV DAT,ALCALL PR2MOV A,#03HMOV DPTR,#TAB2 MOVC A,@A+DPTR MOV DAT,ALCALL PR2MOV R1,#00HMOV R0,#0dHMOV DPTR,#TAB3 LOOP2:MOV A,R1MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R1DJNZ R0,LOOP2RETN2: MOV COM,#0C0HLCALL PR1MOV DPTR,#TAB1MOV R2,#10MOV R3,#00HWRIN:MOV A,R3MOVC A,@A+DPTRMOV DAT,ALCALL PR2INC R3DJNZ R2,WRINRETTAB: DB "0123456789"TAB1: DB "VOLTAGE = "TAB2: DB 00HDB 01HDB 02HDB 03HDB 04HDB 05HZI: DB 01FH,008H,00EH,00AH,00AH,00AH,012H,000H DB 00EH,00EH,019H,00EH,01DH,00DH,00FH,000H DB 00FH,01EH,00EH,01DH,01DH,00EH,014H,000H;*****************************************;****LCD间接控制方式下的初始化子程序******;*****************************************INT:LCALL DELAYMOV COM,#38H ;设置工作方式LCALL PR1MOV COM,#01HLCALL PR1MOV COM,#06HLCALL PR1MOV COM,#0EHLCALL PR1RETDELAY: ;延时子程序MOV R6,#0FHMOV R7,#00HDELAY1:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RETDELAY00: ;延时子程序MOV R6,#0FFHMOV R7,#0FFHDELAY0:NOPDJNZ R7,DELAY1DJNZ R6,DELAY1RET;1 读BF和AC值PR0: PUSH ACCMOV P0,#0FFH ; P0置位, 准备读CLR RS ; RS=0SETB RW ; R/W=1SETB E ; E=1LCALL DELAYMOV COM,P0 ; 读BF和AC6-4值CLR E ; E=0POP ACCRET;********************************************* ;*******LCD间接控制方式下的驱动子程序********* ;********************************************* ;2 写指令代码子程序PR1:PUSH ACCCLR RSSETB RWPR11:MOV P0,#0FFHSETB ELCALL DELAYNOPMOV A,P0CLR EJB ACC.7,PR11CLR RWMOV P0,COMSETB ECLR EPOP ACCRET;3 写显示数据子程序PR2:PUSH ACCCLR RSSETB RWPR21:MOV P0,#0FFHSETB ELCALL DELAYMOV A,P0CLR EJB ACC.7,PR21SETB RSCLR RWMOV P0,DATSETB ECLR EPOP ACCRET;4 读显示数据子程序PR3: PUSH ACCCLR RS ; RS=0SETB RW ; R/W=1PR31: MOV P0,#0FFH ; P0置位, 准备读SETB E ; E=1LCALL DELAYMOV A,P0 ; 读BF和AC6-4值CLR E ; E=0JB ACC.7,PR31SETB RS ; E=1SETB RW ; R/W=1MOV P0,#0FFH ; 读数据SETB E ; E=1MOV DA T,P0CLR E ; E=0POP ACCRETEND。
1602液晶显示的学习
1602液晶显示的学习<一>2009-07-22 23:52昨天了解了1602液晶芯片的几个重要的引脚,各自分别的功能。
今天还是从它的说明书开始学习的。
对它的操作基本就是读状态、写指令、读数据、写数据,也就是昨天学的引脚E、R/W、RS所控制的功能。
今天学习了它具体的指令。
P0的八个位对应状态字D7、D6、D5、D4、D3、D2、D1、D0,当D7为0时允许读写操作,D7为1则是禁止,D6~D0是当前数据地址指针的数值。
指令码若是为00111000B(0x38),则是把显示模式设置为16X2显示,5X7点阵,8位数据接口。
显示开关及光标设置:控制器内部有一数据地址指针,可以通过他们来访问内部全部的80H字节的数据。
今天还用到了头文件“stdio.h”里面的一个函数sprintf(),昨天在程序里只会改几个字符,今天知道了原来这个函数是可以有三个形参的。
1602液晶显示的学习<二>2009-07-23 16:361.RAM地址映射与写入1602有80个字节的RAM缓冲区,昨天思来想去没明白既然80个字节,如何显示2排16个字符的单位,今晨茅塞顿开,原来多余的48个字节是缓冲区,正如下图所示,屏幕上一次只能显示32个字,每一个字分别存放在如下的各自单元里,上面的一排字存在00H~0FH里,也就是第0个箱子到第15个箱子里,箱子里放的是字符的ASCII码值。
例如,要在左起第十个字符的位置显示字符"S",只需要把第十个箱子里装入"S"的ASCII码值115 。
下面的一排字存在40H~4FH里,其方法同上。
2.样例程序的的研究配套的光碟上有一些样列,大同小异。
有几个比较关键的函数看明白了便知道1602显示的机理了。
void ShowChar(unsigned char pos,unsigned char c) //这是一个操作显示单个字符的函数,它有两个形参,一个是pos,是传递给写命令的控制字,一个是c,它是传递给写数据的ASCII 码值;{unsigned char p; //开辟一个无符号字符类型的数据单元,可以存放0~255;if (pos>=0x10) //如果pos大于或者等于17(00010000B),则p=pos+0xb0; //p等于pos+176,pos的值域【00010000B,11110000B】,则p的值域是【00000000B,10100000B】∪【11000000B,11110000B】;elsep=pos+0x80; //如果pos小于17(00010000B),p的值等于pos+128,p的值域是【10000000B,10001111】;WriteCommand (p); //把p的值作为实参调用写命令的函数;WriteData (c); //这个参数是个ASCII码值,告诉函数写哪个字;}3.部分状态字貌似WriteCommand (p)这个函数挺复杂,p的值域被我算得那么广泛,然而查资料得知,这个p无非就只有11个值,当然这都是设计芯片的人定的。
LCD1602液晶显示实验实验报告及程序
实验三LCD1602液晶显示实验姓名____ 专业____ 学号—成绩__________一、实验目的1.掌握Keil C51软件与proteus软件联合仿真调试的方法;2.掌握LCD1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;4.掌握用LCM1602液晶模块显示数字的C语言编程方法。
二、实验仪器与设备1.微机一台C51集成开发环境仿真软件三、实验内容1.用Proteus设计一 LCD1602液晶显示接口电路。
要求利用P0口接LCD1602 液晶的数据端,~做LCD1602液晶的控制信号输入端。
~口扩展3个功能键K1~K3参考电路见后面。
2.编写程序,实现字符的静态和动态显示。
显示字符为第一行:“ 1•姓名全拼”,第二行:“ 2.专业全拼+学号” o3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。
显示字符为:“ 1.姓名全拼2.专业全拼+学号 EXP8 DISPLAY”主程序静态显示“ My in formation ! ”四、实验原理液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。
当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。
1. LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各3.芯片时序表:4.1602LCD勺一般初始化(复位)过程(1)延时 15mso(2)写指令38H (不检测忙信号)。
(3)延时5ms(4)写指令38H (不检测忙信号)。
(5)延时5ms(6)写指令38H (不检测忙信号)。
1602显示实验报告
一、1602显示二、实验项目:1602显示三、实验地点:四、五、实验时间:2014年7月9日~2014年7月23日六、实验要求:1、在单片机最小系统中加入LCD1602显示屏。
2、能进行数字和字符的显示3、扩展功能一:将实验四中的“单片机时钟”改为1602显示。
4、用Protel99SE绘制实验原理图并完成实验报告。
七、实验具体内容:1、在单片机最小系统中加入LCD1602显示屏。
(1)实验电路图:(2)实验原理:1602显示屏采用标准的16引脚(有背光),其各个引脚接线及作用说明如下:(3)实验中遇到的问题:在电路接线工作完成以后,上电实验时LCD只有背光,无任何显示。
问题原因分析:在接线过程中,我最为关注的是RS、R/W、E三个端口的接线,忽视了D0~D7的接线顺序,从而使D7~D0的方向接反。
因此1602内部的11条指令码都会对应不上,例如清屏指令是0x01,而我则需要写成0x20。
所以按照正常程序指令,在初始化之后,屏幕会一直没有显示。
(4)实验小结:在完成电路图之后觉得本次的接线相对来说比较简单。
心想只要接好RS、R/W、E正负极不反接,就没什么问题。
结果却出乎我的意料,看是简单的D0~D7八个端口的顺序同样起着关键的作用。
因自己的忽视,使我在完成接线之后长时间找不到问题原因之所在。
这次的接线也很好的提醒了我,看似简单的工作,可千万不敢再掉意轻心。
2、能进行数字和字符的显示并将实验四中的“单片机时钟”改为1602显示。
(1) 实验原理:LCD6102的显示方式是先从DDRAM写入要显示地址,在往DDRAM写入要显示的字符码。
控制其操作的有11条LCD1602的内部指令,具体如下:指令1:清显示;指令2:光标复位,光标复位到地址00H;指令3:光标和显示模式设置;I/D:光标移动方向,高电平左移,低电平右移S:屏幕上所有文字是否左移或者右移(高电平有效,低电平无效)指令4:显示开关控制;D:控制整体显示开关,高电平表示开,低电平表示关C:控制光标的开关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标显示移位;S/C:高电平时移动显示文字,低电平时移动显示光标指令6:功能设置命令;DL:高电平时为四位总线,低电平时为八位总线N:低电平时为单行显示,高电平时为双行显示F:低电平时为5x7点阵字符,高电平时为5x10点阵字符指令7:字符发生器存储器地址:指令8:DDRAM地址设置指令9:读忙信号和光标地址BF为忙标志高电平表示忙,此时模块不能接收命令或者数据,低电平表示不忙指令10:写数据指令11:读数据时序控制:读状态:输入RS=0 R/W=1 E=1 输出:D0~D7=状态字写指令:输入RS=0 R/W=1 D0~D7=指令码E=高脉冲输出:无读数据:输入RS=1 R/W=1 E=1 输出:D0~D7=数据写数据:输入RS=1 R/W=0 D0~D7=数据E=高脉冲输出:无(2)程序流程图如下所示:(3)实验中遇到的问题按下4#键时钟显示减1,当显示为00后,继续减1,会出现ASCLL在0之后的码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京工程学院通信工程学院课程设计说明书(论文)题目数字电压表设计课程名称单片机原理及应用A专业电子信息工程班级学生姓名学号设计地点指导教师一、课程设计目的在学习《单片机原理及应用A》课程的基础上,进一步深入理解MCS-51单片机的结构、工作原理和应用技术,提高单片机控制系统设计、研发的能力;按照教学计划的要求,利用一周时间,综合应用所学知识,设计具有一定功能的小型单片机控制系统,培养学生一定的自学能力和独立分析问题、解决问题的能力,要求学生能通过独立思考、查阅工具书、参考文献,提出自己的设计方案,找出设计中遇到问题的解决途径。
二、设计任务和要求1、题目:数字电压表设计(1).整个课程设计的各个环节都要自己动手。
(2).通过TLC1549串行A/D转换芯片完成数字电压表设计,通过LED/LCD 显示测量值;(3).采用C语言编程实现;(4).其他要求参见“nKDE-51单片机实验教学系统实验指导书”;(5).基本任务为必做项目,附加任务为选做项目;(6).对课程设计进行总结,撰写课程设计说明书2、设计任务:(1).基本任务:利用nKDE-51单片机实验教学系统上的硬件资源,实现数字电压表的测量与显示功能。
(2).附加任务:通过键盘控制测量操作的启停。
在LCD上显示测量结果。
三、系统总体设计方案3.1数字电压表系统设计框图本次数字电压表系统设计框图如下图1所示:数字电压表主要由模/数转换电路、单片机控制电路、显示电路等三部分组成。
其中TLC1549等器件组成的转换电路,将输入的模拟量信号进行取样、转换、然后将转换的数字信号送进单片机。
单片机控制电路主要实现对数据进行程序处理;显示电路主要用于将单片机的信号数据转换后显示测量结果。
本实验系统中模拟量的输入有两种方法,一种方法是通过J1输入外部的模拟量,此时需要把跳线JP1的1、2短接;另外一种方法是通过滑动变阻器调节输入电压,此时需要将跳线JP1 的2、3短接。
由于TLC1549的输入参考电压为+5V,因此两种输入方法中,输入信号的电平幅度都必须限制在0~5V之间。
3.2 A/D采样部分3.2.1 TLC1549简介TLC1549系列是美国德州仪器公司生产的具有串行控制、连续逐次逼近型的模数转换器,它采用两个差分基准电压高阻输入和一个三态输出构成三线接口,其中三态输出分别为片选(CS)、输入/输出时钟(CLK)和数据输出(DO)。
TLC1549作为AD数据采样器件, 它是串行接口方式的A/D转换器,仅有8个引脚,外围接线很少。
体积小、速度快、精度高。
适用于仪器仪表、传感器、工程检测等方面。
TLC1549采用CMOS工艺,内部具有自动采样保持、可按比例量程校准转换范围、抗噪声干扰功能,开关电容设计使在满刻度时总误差最大仅为±1 LSB (4.8 mV),因此可广泛应用于模拟量和数字量的转换电路。
3.2.2 TLC1549工作原理:TLC1549内部结构框图如图2所示。
DATA OUT图2 TLC1549内部结构TLC1549具有6种串行操作时序模式,这些模式由CLK周期和C___S___定义,这里只介绍本实验所使用的10周期、C___S___控制传输数据的模式,其余模式的详细信息,请自行参考TLC1549的数据手册。
根据TLC1549的功能结构和工作时序,其工作过程可分为3个阶段:模拟量采样、模拟量转换和数字量传输。
(1) 模拟量采样在前一个采样数据输出的第3个CLK下降沿,输入模拟量开始采样,采样持续7个CLK周期,本次模拟量的采样值在第10个CLK下降沿锁存。
(2) 模拟量转换TLC1549是一种连续逐次逼近型的模数转换器,其内部的CMOS门限检测器通过检测一系列电容的充电电压来对数字输入信号进行量化,此处不做进一步介绍,更详细的内容请自行参阅TLC1549的数据手册。
(3) 数字量传输TLC1549采样数据输出的时序如图3所示。
CSCLK DO图3 TLC1549采样数据输出时序图当C ___S ___信号由低电平变为高电平时,CLK 禁止且A/D 转换结果的三态串行输出DO 处于高阻状态;当串行接口将C ___S ___拉至有效时,即C ___S ___由高变为低时,C ___S ___复位内部时钟,控制并使能DO 和CLK ,允许CLK 工作并使DO 脱离高阻状态。
串行接口把输入/输出时钟序列供给CLK 并接收上一次转换结果。
首先移出上一次转换结果数字量对应的最高位,下一个CLK 的下降沿驱动DO输出上一次转换结果数字量对应的次高位,第9个CLK 的下降沿将按次序驱动DO 输出上一次转换结果数字量的最低位,第10个CLK 的下降沿,DO 输出一个低电平,以便串行接口传输超过10个时钟;CLK 从主机串行接口接收长度在10~16个时钟的输入序列。
10位数字量通过DO 发送到主机串行接口。
第一次传输时,最少需要10个时钟脉冲,如果CLK 传送大于10个时钟,那么在第10个时钟的下降沿,内部逻辑把DO 拉至低电平以确保其余位清零。
在正常转换周期内,即规定的时间内C ___S ___端由高电平至低电平的跳变可以终止该周期,器件返回初始状态(输出数据寄存器的内容保持为上一次转换结果)。
由于可能破坏输出数据,所以在接近转换完成时要小心防止C ___S ___拉至低电平。
3.2.3 TLC1549的接口电路在实验系统中,TLC1549的接口电路如图4所示。
J7JP112J1R2471AIN1VR210K图4 TLC1549的接口电路3.3 显示部分采用LCD1602液晶显示器显示。
液晶显示功耗低,轻便防震,显示界面友好。
采用字符型液晶模块HS1602与单片机的接口和编程的方法显示测量的电压大小、极性、峰值。
其原理电路图如图5所示。
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器、RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据、D0~D7为8位双向数据线。
主单片机通过控制RS和RW,数据由D0~D7送入液晶显示。
报警由单片机控制并作出响应。
四、系统分析与运行结果测量结果:VR2调节输入电压,液晶显示屏显示电压范围0~3.720V五、收获体会单片机是一门很强调应用的学科,在这一周的设计时间里,我选择了数字电压表设计这个设计任务,以巩固课程学习。
关于这个任务,基于TLC1549的串行A/D转换实验加以改进,从而实现了对TLC1549连续逐次逼近型的模数转换器。
关于程序的设计,编程是个不断编写、不断运行、不断修改的过程,需要十足的细心与耐心。
期间也有感到瓶颈的地方,不过,因为时间比较充裕也大都解决了这些问题。
当然,也发现了所编程序些许复杂,且重复较多,有点资源浪费。
经过这次课程设计,我发觉自己在软件编程上也是可以有所发展的,希望在今后的学习中能够不断的进步,以谋求更好的发展。
六、参考文献1、《nKDE51单片机实验教学系统实验指导书》南京邮电大学,2011年2、《单片机原理与应用及C51程序设计》(第2版),谢维成等编著,清华大学出版社,2009年3、《单片机原理及应用》(第2版),李建忠,西安电子科技大学出版社,2008年七、附录实验程序:#include <reg51.h> //52系列头文件#define Disdata P0 //液晶数据端口#define uchar unsigned char //无符号字符8位#define uint unsigned int //无符号整数8位uint data dis[4]={0x00,0x00,0x00,0x00};//4个数据单元和一个uchar code table[]="VOLTAGE:+ V"; //定义初始上电液晶默认显示状态uchar code table1[]="designed by : ";uchar code table3[]=" laochang ";uchar code table2[]="SCOPE: 0-5.000 V";uchar code table4[]=" not reversed! ";sbit lcden=P2^2;//定义液晶使能端sbit lcdrs=P2^0;//定义液晶RS端sbit rw=P2^1;//定义液晶RW端sbit led=P3^1;sbit ALE=P2^3;//定义锁存地址控制位sbit cs_ad=P2^7;//片选段,低电平有效sbit dout=P2^6;//数据输出端sbit clk=P2^5; //转换结束标志位data int result;//测量变量暂存地址uchar num,num1,num2,num3,num4,num5;uchar shii=0,gei=0;//********延时函数************void delay30(void) //30us延时{ unsigned char a;for(a=13;a>0;a--);}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//*************void write_com(uchar com) //液晶写命令函数{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) //液晶写数据函数{lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_sg(uchar add,uchar date) //写整数位和小数位函数{uchar shi,ge;shi=date/10; //分解出一个2位数的十位ge=date%10;write_com(0x80+add); //设置显示位置write_data(0x30+shi); //送去液晶显示十位write_com(0x80+add+2);write_data(0x30+ge); //送去液晶显示个位}void write_sg1(uchar add,uchar date) //写整数位和小数位函数{uchar shi,ge;shi=date/10; //分解出一个2位数的十位ge=date%10;write_com(0x80+add); //设置显示位置write_data(0x30+shi); //送去液晶显示十位write_data(0x30+ge); //送去液晶显示个位}void init(){rw=0;lcden=0;shii=0;gei=0;write_com(0x38); //初始化1602液晶write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80); //设置显示初始坐标for(num2=0;num2<13;num2++){write_data(table1[num2]);delay(5);}write_com(0x80+40);for(num3;num3<16;num3++){write_data(table3[num3]);delay(5);}delay(1000); }//*******************************void scan1(){ write_com(0x80); //设置显示初始坐标for(num=0;num<16;num++){ write_data(table[num]);delay(5);}write_sg(9,shii);write_sg(12,gei);write_com(0x80+40);for(num1;num1<16;num1++){write_data(table2[num1]);delay(5);}write_sg(9,shii);write_sg(12,gei); }//****TLC1549转换处理子函数********void test(){ data uchar i,j,k=63;uint shushu=0,ress=0;for(j=0;j<63;j++){cs_ad=1; //禁止i/o clockcs_ad=0; //开启控制电路,使能data out和i/o clockress=0; //清转换变量for(i=0;i<10;i++) //采集10次,即10bit{clk=0;ress*=2;if(dout) ress++;clk=1;}shushu+=ress;delay30();}result=shushu/k;delay(590);cs_ad=1; //data out 返回到高阻状态而终止序列//****数据转换处理**********result=result*10; //结果值扩大10倍dis[2]=result/275; //计算整数位dis[3]=result%275; //余数暂存dis[3]=dis[3]*10; //计算小数第一位dis[1]=dis[3]/275;dis[3]=dis[3]%275;dis[3]=dis[3]*10; //计算小数第二位dis[0]=dis[3]/275;shii=dis[2];gei=dis[1]*10+dis[0];write_sg(9,shii);write_sg1(12,gei);write_com(0x8a);write_data(0x2e);write_com(0x8e);write_data(0x20); }//*******主函数***** void main(){cs_ad=1;cs_ad=0;init();scan1();while(1){ led=0;test();delay(1);}}。