标签:单片机LCD
基于51单片机的1602LCD显示
基于51单片机的1602LCD显示
LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计
采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。在器件选择按钮
中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只
瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只
电阻RES 10K 一只排阻RESPAC-8 10K 一只
1602液晶显示器LM016L 一只
若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计
用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"
#include
#include
sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚
sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚
sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚
unsigned char code string[ ]={"Welcome to China"};
unsigned char code string1[ ]={"Hi!Good morning!"};
/*************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
*************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************
函数功能:延时若干毫秒
入口参数:n
******************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i delay1ms(); } /******************************************* 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌; result=0,不忙 *******************************************/ unsigned char BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate **************************************************/ void WriteInstruction (unsigned char dictate) { while(BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平 _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 P0=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平(正跳变) _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /************************************************** 函数功能:将数据(字符的标准ASCII码)写入液晶模块 入口参数:y(为字符常量) **************************************************/ void WriteData(unsigned char y) { while(BusyTest()==1); RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; //E置低电平 P0=y; //将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平(正跳变) _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /****************************************** 函数功能:对LCD的显示模式进行初始化设置 ******************************************/ void LcdInitiate(void) { delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38); //显示模式设置:8位数据,16×2显示,5×7点阵,delay(5); //延时5ms WriteInstruction(0x38); delay(5); WriteInstruction(0x38); delay(5); WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁 delay(5); WriteInstruction(0x06); //显示模式设置:光标右移,字符不移 delay(5); WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除 delay(5); } void main(void) //主函数 { unsigned char i; LcdInitiate(); //调用LCD初始化函数 delay(10); while(1) { WriteInstruction(0x01); //清显示:清屏幕指令 WriteInstruction(0x80); //第一行显示地址 i = 0; while(string[i] != '\0') { // 显示字符 WriteData(string[i]); i++; delay(150); } for(i=0;i<4;i++) delay(250); WriteInstruction(0xc0); //第二行显示地址 i = 0; while(string1[i] != '\0') { // 显示字符 WriteData(string1[i]); i++; delay(150); } for(i=0;i<4;i++) delay(250); } } 打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“LCD”项目,并选择单片机型号为AT89C51。执行菜单命令“文件”→“新建”创建文件,输入C语言源程序,保存为“LCD.C”。在Project Workspace窗口中右击源代码组1,选择“添加文件到组‘源代码组l’”将源程序“LCD.C”添加到项目中。 在Keil中执行执行菜单命令“工程”→“创建目标”(或点击“创建目标”快捷按钮),编译源程序。如果编译成功,则在“Output Window”的“创建”窗口中显示没有错误,并创建了“LCD.HEX”文件。 3 仿真与调试 关于Proteus与Keil的联合仿真调试,可参见我以前所写的博文或其它参考资料。 启动Proteus的ISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动Keil的μVision3,并将其放在屏幕的左下角。 在Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标 ,进入Keil调试环境。同时,在Proteus ISIS的窗口中可看出Proteus也进 入了程序调试状态。 在Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。 在Keil中按F5键(或点击“运行”快捷按钮)运行程序。1602LCD循环显示“Welcom to China”和“Hi!Good morning!”,如下图所示。 或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。 . //使用AT89c51单片机控制四个数码管动态显示0-9999 ,12MHz #include 实验一八段数码管显示 1、实验目的: (1)了解数码管动态显示的原理。 (2)了解74LS164扩展端口的方法。 2、实验要求: 利用实验仪提供的显示电路,动态显示一行数据. 3、实验电路图 LED1LED2LED3LED4LED5LED6 4、实验器材: (1)超想-3000TB综合实验仪 1 台 (2)超想3000仿真器 1 台 (3)计算机 1 台 5、实验连线 无 6、实验说明: (1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。 74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。向显示位选通地址输出高电平就可以点亮相应的显示位。 本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。 (2)七段数码管的字型代码表 显示字形 g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h 2 1 0 1 1 0 1 1 6bh 3 1 0 0 1 1 1 1 4fh 4 1 1 0 0 1 1 0 66h 5 1 1 0 1 1 0 1 6dh 6 1 1 1 1 1 0 1 7dh 7 0 0 0 0 1 1 1 07h 8 1 1 1 1 1 1 1 7fh 9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 0 5eh E 1 1 1 1 0 0 1 79h F 1 1 1 1 71h a b c d e f g dp 基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。 1 硬件设计 利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。在器件选择按钮中单击 “P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 一片 晶体CRYSTAL 12MHz 一只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF 一只 电阻RES 10K 一只 电阻RES 4.7K 四只 双列电阻网络Rx8 300R(Ω) 一只 四位七段数码管7SEG-MPX4-CA 一只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。 2 软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X(N-1)),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。 LED数码管动态显示的流程如下所示。 51单片机(四位数码管的显示)程序 基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。 最佳答案 下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你! #include 51单片机数码管显示实验 实验内容: 1)编写程序让8只数码管初始显示0,每隔大约1s加1显示(可以用延时函数实现),到数码管显示9后,再从0开始显示,如此循环反复。 2)C语言程序 #include 3)汇编语言: ORG 0000H LJMP MAIN ORG 0100H ;P2连接段选,P1节位选 MAIN: MOV P1,#00H ;所有的数码管都显示 MOV R2,#00H ;从0开始显示 LOOP: MOV A,R2 ;为下面的基址加变址寄存器寻址方式做准备MOV DPTR,#TAB1 ;把数组的首地址赋给DPTR MOVC A,@A+DPTR ;取数组中的数字 MOV P2,A ;把取得的值送给P0口显示 ACALL DELAY ;延时一会 INC R2 ;为取下一个数加一 CJNE R2,#10,LOOP ;只要数小于10就继续循环显示 MOV R2,#00H ;如果加到10后重新从0开始 LJMP LOOP ;进入循环函数 ;****************************************** TAB1: DB 0C0H,0F9H,0A4H,0B0H,99H; 数组 DB 92H,82H,0F8H,80H,90H RET ;****************************************** DELAY: MOV R3,#3 ;延时函数 DE1: MOV R4,#0FFH DE2: MOV R5,#0FFH DJNZ R5,$ DJNZ R4,DE2 DJNZ R3,DE1 RET ;************************************************* END 一看就会,适合初学者参考 T0,T1同时开中断,和别人的有点不一样 源程序如下 //数码管设计的可调电子钟 //K1,K2分别调整小时和分钟 #include<> #include<> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99, //共阳段码 0x92,0x82,0xF8,0x80,0x90,0xFF}; uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0}; //显示缓存uchar Scan_BIT; //扫描位,选择要显示的数码管 uchar DSY_IDX; //显示缓存索引 uchar Key_State; //P1端口按键状态 uchar h,m,s,s100; //十分秒,1/100s void DelayMS(uchar x) //延时 { uchar i; while(x--) for(i=0;i<120;i++); } void Increase_Hour() //小时处理函数 { if(++h>23)h=0; DSY_BUFFER[0]=DSY_CODE[h/10]; DSY_BUFFER[1]=DSY_CODE[h%10]; } void Increase_Minute()//分钟处理函数 { if(++m>59) { m=0;Increase_Hour(); } DSY_BUFFER[3]=DSY_CODE[m/10]; DSY_BUFFER[4]=DSY_CODE[m%10]; } #include delays(500); du=1; P0=table[3]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xf7; we=0; delays(500); du=1; P0=table[4]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xef; we=0; delays(500); du=1; P0=table[5]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xdf; we=0; delays(500); du=1; P0=table[6]; du=0; P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位选锁存器造成混乱 we=1; P0=0xfe; we=0; delays(500); du=1; P0=table[7]; 期 中 大 作 业 学院:物理与电子信息工程学院 课题: 【利用8255和51单片机实现数码管显示按键数值的程序】要求: 【4*4矩阵键盘,按0到15,数码管上分别显示0~9,A~F】 芯片资料: 8255: 8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。 8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。 8255特性: 1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。 2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC 口。它们又可分为两组12位的I/O口:A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定. 引脚说明 RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。 CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。RD:读信号线,当这个输入引脚为低电平时,即CS=0且RD=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。WR:写入信号,当这个输入引脚为低电平时,即CS=0且WR=0时,允许CPU将数据或控制字写入8255。 D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。 PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。 PB0~PB7:端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。 PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。 A1,A0:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器。 当A1=0, A0=0时,PA口被选择; 当A1=0, A0=1时,PB口被选择; 当A1=1, A0=0时,PC口被选择; 当A1=1. A0=1时,控制寄存器被选择。 74ls373芯片资料: 74ls373是常用的地址锁存器芯片,它实质是一个是带三态缓冲输出的8D 触发器,在单片机系统中为了扩展外部存储器,通常需要一块74ls373芯片.本 //使用AT89c51单片机控制四个数码管动态显示0-9999 ,12MHz #include<> void jiayi();//加1函数 void chufa();//除法函数 void xianshi();//显示函数 void delay();//延时函数 sbit P2_0=P2^0;//个位位码 sbit P2_1=P2^1;//十位位码 sbit P2_2=P2^2;//百位位码 sbit P2_3=P2^3;//千位位码 unsigned char qianwei,baiwei,shiwei,gewei; unsigned int count=0; unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极0-9 void main() { while(1) { jiayi(); chufa(); xianshi(); } } void chufa()//将数字的各个位拆开 { qianwei=count/1000;//千位数 baiwei=count%1000/100; //百位数 shiwei=count%100/10; //十位数 gewei=count%10; //个位数 } void jiayi() { count=count+1; if(count==10000) count=0; } void delay()//延时 { unsigned int i,j; for(i=0;i<10;i++) { for(j=0;j<200;j++); } } ;该程序库为4位显示,可以设置3个小数点的位置,数据在R2中,LED_DATA EQU P0 ;数码管数据口定义 SHOW1 EQU 30H ;个位 SHOW2 EQU 31H ;十位 SHOW3 EQU 32H ;百位 SHOW4 EQU 33H ;千位 SHOW5 EQU 34H ;万位 XSDW EQU 50H ;小数点位数 ORG 0000H AJMP LOOP ORG 0030H LOOP: MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH MOV SP,#60H MOV XSDW,#00H LOOP0: CALL CONVT CALL PLAY JB P3.7,LOOP0 CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS CALL DELAY2MS JB P3.7,LOOP0 JNB P3.7, LOOP1 NOP LOOP1: CALL PLAY JNB P3.7, LOOP1 MOV A,XSDW CJNE A,#3,LOOP2 MOV XSDW,#00H AJMP LOOP0 LOOP2: INC XSDW AJMP LOOP0 ;--------------------------------------------------------- ;代码变换(HEX TO BCD) ;--------------------------------------------------------- CONVT: CLR EA 实现的功能:按下key1键数字加1,按下key2键数字减1,按下key3键数字归零。并且满足,在不松开按键时,数字会按一定时间间隔持续递增或递减。 数码管显示程序: void display(uchar shu) { uchar bai,shi,ge; bai=shu/100; shi=shu/10%10; Ge=shu%10; P2=0x7f; P0=table[ge]; delay(5); P2=0xbf; P0=table[shi]; delay(5); P2=0xdf; P0=table[bai]; delay(5); } 这里是利用传送函数,在传送过程中我们传送的是一个值,这个值的百、十、个位,我们在子函数中进行分解。再通过数组将段码、位码,传送到相应的I/O。 此外还要注意的一点是:这里是动态扫描,不能忘了原理,是一位一位的显示,只是太快了,看不出来,所以在每一个数码管亮之间一定要有10毫秒的延时!!! 键盘子程序: void keyscan() { P1=0xff; // P1口赋初值, key_code=P1;//将P1口的状态赋予一个变量,便于以后的检测。 if(key_code!=0xff)//如果条件满足说明有按键被按下。 { for(i=0;i<30;i++) display(shu);//这小段子程序有两个 作用:1、不断的扫描显示子程序。这样就会避免一种现象:按键被按下时,所有的数码管会闪烁,加了这小段程序后给人的感觉是各个数码管是独立的,互不影响,它加他的,我前面几位该不变就不变。 2、还起到延时作用。 switch(key_code)//利用switch可以是程序事半功倍,又好读,应该借鉴。 { case 0xfe://注意格式的书写 if(shu<255) shu++; break;//不要忘了 case 0xfd: if(shu>0) shu--; break; case 0xfb: shu=0; } key_code=0xff;//这句程序得格 NDM XTW2 potm 畑 PO^.I P0v.l m\ JO.TAI 啊 P2.W 細 iSEiT ALE ER卩2訥 92辄 MJ 儿1辽帽 112w S13阳F m PR #15P35/ MJ 基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段 时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共 端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O 口。 1 硬件设计 利用51单片机的P0 口输出段码,P2 口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开 ISIS 7 Professional窗口(本人使用的是 v7.4 SP3中文版)。单击菜单命令“文件新建设计”,选择DEFAULT模板,保存文件名为“ DT.DSN ”。在器件选择按钮中单击“P”按钮,或执行菜单命令“库”7“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 —片 晶体 CRYSTAL 12MHz —只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF —只 电阻RES 10K 一只 电阻RES 4.7K四只 双列电阻网络 Rx8 300R( Q ) 一只 四位七段数码管 7SEG-MPX4-CA —只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是 默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。2软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X( N-1 )),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。 单片机原理课程设计论文 班级: 电气1136班 学号: 1 姓名: 朱焯华 指导老师: 瑛 目录 一、前言。。。。。。。。。。。。。。。。。。。。。。。。。 3 二、选题要求。。。。。。。。。。。。。。。。。。。。。。。 3 三、硬件电路设计。。。。。。。。。。。。。。。。。。。。。。 4 3.1 主控芯片。。。。。。。。。。。。。。。。。。。。4 3.2 矩阵键盘电路。。。。。。。。。。。。。。。。。。5 3.3 数码管电路。。。。。。。。。。。。。。。。。。。6 3.4 138译码器位选电路。。。。。。。。。。。。。。。6 3.5 晶振和复位电路。。。。。。。。。。。。。。。。。7 3.6 蜂鸣器电路。。。。。。。。。。。。。。。。。。。8 四、软件设计。。。。。。。。。。。。。。。。。。。。。。。。8 五、调试结果。。。。。。。。。。。。。。。。。。。。。。。。10 六、总结。。。。。。。。。。。。。。。。。。。。。。。。。。12 前言 随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤为突出。在 科学技术不断发展的今天,电子密码防盗锁作为防盗卫士的作用显得日趋重 要。本文从经济实用的角度出发,系统由STC89C51作为主控芯片与数据存储 器单元,结合外围的键盘输入、数码管显示、报警、开锁等电路模块。它能完 成以下功能:正确输入密码前提下,开锁,数码管显示“open”;错误输入密码 情况下,报警,数码管显示“err”;密码可以根据用户需要在程序中更改。用C 语言编写的主控芯片控制程序,并用Keil4软件进行编译,设计了一款可以更改 密码的系统,本密码锁具有设计方法合理,简单易行,成本低,安全实用,性 强,灵活性高等特点,具有一定的推广价值。 关键词:电子密码锁、报警、数码管显示 二、选题要求 本文从经济实用的角度出发,设计采用51单片机为主控芯片,结合外围电路,组成电子密码控制系统,密码锁共4位密码(可增加),每位的取值围为0~9,外加“确认”键和“取消”键。用户可以通过修改程序来修改密码,想要打开锁,必先通过提供的键盘输入正确的密码才可以,密码输入错误有提示并报警。4位密码同时输入正确,锁才能打开。性强、灵活性高。其特点: 1) 性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。 2) 密码可变,用户可以更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。 3) 当输入密码错误时,报警系统自动启动。 4) 无活动零件,不会磨损,寿命长。 //以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 静态数码管实验 * 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3 * 实验效果: 按下K1键,显示0,按下K2键,显示9,按下K3键,显示减1,按下K4键, *显示加1。 * 注意:由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验 *效果,最好把红外线先取下来。 ******************************************************************************* / #include #include<> //#include#include<> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit beep=P2^3; unsigned code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c, 0x39 , 0x5e , 0x79 , 0x71 }; uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi; uchar ns,ns1,nf,nf1,numns,numnf; void delay(uint z); void keyscan (); void keyscan1 (); void alram(); void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1); void main() { TMOD=0x01;//设定定时器0工作方式1 TH0=(65536-46080)/256 ; T L0=(65536-46080)%256 ; E A=1;//开总中断 E T0=1;//开定时器0中断 T R0=1;//启动定时器0中断 n umns=12; n umnf=0; while(1) { if(dingshi==0) { keyscan (); display(m,m1,f,f1,s,s1); alram(); } #include51单片机控制4个数码管显示
51单片机-八段数码管显示
基于51单片机的LED数码管动态显示
51单片机(四位数码管的显示)程序
51单片机数码管显示实验报告
数码管动态显示的51单片机时钟设计
51单片机数码管0到F动态显示
51单片机键盘数码管显示(带程序)
51单片机控制4个数码管显示09999
51单片机数码管显示程序
51单片机数码管加减
基于51单片机的LED数码管动态显示
基于某51单片机地数码管显示4位密码锁
51单片机静态数码管显示数字程序
51单片机数码管显示时钟程序
51单片机数码管显示时钟程序