串行口串入并出做段码的四位数码管显示控制电路
- 格式:doc
- 大小:57.57 KB
- 文档页数:4
中北大学课程设计说明书学生姓名:XXXXXX 学号:1005xxxxx学院:信息与通信工程学院专业:电子信息科学与技术题目:74HC164级联实现四位数码管显示电路设计指导教师:程耀瑜职称: 教授李文强职称:讲师2013 年 1 月 17 日中北大学课程设计任务书2012/2013 学年第一学期学院:信息与通信工程学院专业:电子信息科学与技术学生姓名:xxxxxxx 学号:100xxxxxxx 课程设计题目:74HC164级联实现四位数码管显示电路设计起迄日期:1月4日~1月15日课程设计地点:中北大学指导教师:程耀瑜,李文强系主任:程耀瑜下达任务书日期: 2010 年 1 月 3 日课程设计任务书目录一、设计目的 (6)二、设计任务 (6)三、设计条件 (6)四、设计内容和要求 (6)1、74CH164的逻辑功能、逻辑图、引脚说明、波形图 (7)2、七段显示数码管 (9)3、74164QUARTUS 2仿真 (10)4、分步设计 (10)5、电路设计图 (11)6、仿真波形图 (12)六、设计总结 (15)1、设计总结 (15)2、设计中的优点与不足 (15)3、心得体会 (15)六、计参考资料 (16)一、设计目的本课程设计主要针对模拟电子技术和数字电子技术课程要求,培养学生在查阅资料的基础上,进行实用电路设计、计算、仿真、调试等多个环节的综合能力,同时培养学生用课程中所学的理论独立地解决实际问题的能力。
另外还培养学生用专业的、简洁的文字,清晰的图表来表达自己设计思想的能力。
二、设计任务设计一个74HC164级联实现四位数码管显示电路,通过在74HC164上输入时钟信号(CP)和控制信号(D),在数码管上显现出来相应的信号。
三、设计条件本设计是基于在学习过数字电子技术基础和模拟电子技术基础且在完成电子技术实验后设计的,通过在电脑上利用各种软件设计而成,包括Quartus II 5.0,Multisim2001等设计仿真软件。
第十九篇 74HC595与数码管2011-03-08 15:07第十九篇 74HC595与数先引用一句官方语:“74HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
长话短说,它的功能是8位串行输入并行输出移位寄存器,也就是串行转并行。
下图是封装图:74HC595内部有两个寄存器:8位移位寄存器和8为存储寄存器,下面要PROTEUS做下各个引脚的调试一下可以看出:DS为串行数据输入口;SH_CP为串行时钟输入口,SH_CP每个上升沿到来时,芯片内部的移位寄存高位移出丢失,次高位成为最高位,并在Q7'体现出来(根据Q7'可以看出,74HC595也有串行输寄存器的值输出到存储寄存器,存储寄存器直接和引脚Q0~Q7相连,所以存储寄存器的值会直接反行功能;OE是输出使能,高电平时Q0~Q7为高阻态,低电平时Q0~Q7为存储寄存器的值;MR为低时无效;VCC接电源;GND接地。
好了,所有引脚介绍完了。
有的封装图引脚名字不太一样,功能下面用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),为了减少连线U1的DS),这样连续向U2的DS写两个字节(第一个是要显示的数字,第二个是位选),就可以连SH_CP,P0.6连DS,P0.7连P0.7ST_CP)就可以操作此四连共阴数码管(注意是共阴,不是上篇示的数字”和“位选”取反即可)。
如下图:这个实验测试下://*********************************************************************************** //功能:LPC2103利用两片74HC595操作四位共阴数码管//说明://用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),//为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写//两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。
四位拨动开关控制数码管显示系统设计书1.设计背景单片机具有人机对话功能,开关,键盘是实现人机对话的主要输入设备,也是最常用的设备,通过它能发出各种控制指令和数据到单片机。
而二极管,数码管,LED显示器是常用的输出设备,单片机接受一系列指令到,执行一定功能后,可通过这些设备输出。
为了更好的掌握单片机的硬件特性以及用汇编语言进行编程设计,我们运用目前所学的知识,来设计了一个单片机最小系统——用拨码开关控制数码管显示系统。
2.设计方案2.1方案一使用单片机P1口,由4位DIP开关从P1口低四位输入,高四位输出,译码部分采用74LS247译码器,送往共阳极数码管显示。
本方案编程简单,占用I/O端口少,但电路设计较复杂,硬件增多,成本增高。
2.2方案二本方案的译码部分由单片机编程实现,P1口接共阳数码管,由4位DIP开关从P0口低四位输入,经软件译码,送往P1口,在数码管显示相应的数字。
由于译码部分采用了软件实现,省去了译码电路,成本降低,电路设计简单,但编程较方案一复杂,而且占用I/O端口多,占用系统资源。
综合考虑,确定采用方案二实现。
3.方案实施3.1输入输出电路设计该设计以AT89S52单片机为核心部件,AT89S52单片机有4个双向的8位并行I/0口,分别记为P0、P1、P2和P3口。
本次设计中主要使用P0作为输入口,P1作为输出口。
P0口:P0口为一个8位漏级开路双向I/O口,每个脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。
P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。
4位数码管∙四位数码管是一种半导体发光器件,其基本单元是发光二极管。
能显示4个数码管叫四位数码管。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
目录∙4位数码管的驱动方式∙4位数码管的引脚图∙4位数码管的参数∙4位数码管区分共阴阳极的方法4位数码管的驱动方式∙1、静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
【接线说明】【输入控制设备】【输出控制设备】【NPN输人开关接线方式举例说明】【PNP输人开关接线方式举例说明】【输出举例说明】【输出举例说明】(开关量输出、干接点输出)【UART通信说明】也可以通过TTL下载【原理图】提供PDF格式/******************************************************************** 程序说明:1、P1.7口输入开关信号控制数码管开始延时。
2、当数码管延时时间达到59分99秒时继电器吸合并保持吸合状态。
********************************************************************/#include<STC12C2052AD.h> //库文件#include<intrins.h>#define uchar unsigned char //宏定义字符型变量#define uint unsigned int //宏定义整型变量/********************************************************************IO口定义********************************************************************/uint playdate;uint datef=0;uint datem=0;uint sec; //定义计数值,每过1/10 秒,sec 加一uchar biaozhi=0;//按下次数值uint tcnt; //键值判断sbit P10=P1^0;//数码管段sbit P11=P1^1;//数码管段sbit P12=P1^2;//数码管段sbit P13=P1^3;//数码管段sbit P14=P1^4;//数码管段sbit P15=P1^5;//数码管段sbit P16=P1^6;//数码管段sbit P17=P1^7;//AD信号输入sbit P30=P3^0;//按键输入sbit P31=P3^1;//按键输入sbit P32=P3^2;//数码管位sbit P33=P3^3;//数码管位sbit P34=P3^4;//数码管位sbit P35=P3^5;//数码管位sbit OUT=P3^7; //继电器输出/********************************************************************初始定义*********************************************************************/code uchar seg7code[10]={ 0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0xa0}; //显示段码数码管字跟/********************************************************************延时函数*********************************************************************/void delay1(uchar t){uchar i,j;for(i=0;i<t;i++){for(j=13;j>0;j--);{ ;}}}/********************************************************************延时函数*********************************************************************/ void delay()//延时程序0.1秒{uchar m,n,s;for(m=10;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}/********************************************************************显示函数*********************************************************************/ void Led() //显示函数{/*****************数据转换*****************************/uint z,x,c,v;z=datef%100/10;; //求分十位x=datef%10; //求分个位c=datem%100/10; //求秒十位v=datem%10; //求秒个位P1M0=0X00;P1M1=0XFF;P3M0=0X00;P3M1=0XFF;P32=0;P33=0;P34=0;P35=0;P1=seg7code[z];P32=1;P33=0;P34=0;P35=0;delay1(80);P32=0;P33=0;P34=0;P35=0;P1=seg7code[x];P32=0;P33=1;P34=0;P35=0;delay1(80);P32=0;P33=0;P34=0;P35=0;P1=seg7code[c];P32=0;P33=0;P34=0;P35=1;delay1(80);P32=0;P33=0;P34=0;P35=0;P1=seg7code[v];P32=0;P33=0;P34=1;P35=0;delay1(80);P32=0;P33=0;P34=0;P35=0;}/********************************************************************按键函数*********************************************************************/void key(){if((P17==0)&&(biaozhi==0)){ delay1(250);if(P17==0){TR0=1;sec=0; OUT=1;biaozhi=1;}} }/********************************************************************定时中断服务函数*********************************************************************/ void t0(void) interrupt 1 using 0 //定时中断服务函数{tcnt++; //每过250ust tcnt 加一if(tcnt==3694) //计满400 次(1/10 秒)时4000为秒{tcnt=0; //重新再计sec++;if(sec==3600) //单位为秒60分00秒{OUT=0;TR0=0;//sec=0;}}}/********************************************************************主函数*********************************************************************/ void main(){TMOD=0x02; //定时器工作在方式2TH0=0x06; //对TH0 TL0 赋值TL0=0x06;TR0=0; //开始定时ET0=1;EA=1;sec=0;OUT=1;biaozhi=0;while(1){key();Led();datef=sec/60;datem=sec%60;}}/********************************************************************程序结束*********************************************************************/#include<STC12C2052AD.h> //库文件#include<intrins.h>#define uchar unsigned char //宏定义字符型变量#define uint unsigned int //宏定义整型变量/*声明SFR 相关与的IAP*/sfr IAP_DATA = 0xE2;sfr IAP_ADDRH = 0xE3;sfr IAP_ADDRL = 0xE4;sfr IAP_CMD = 0xE5;sfr IAP_TRIG = 0xE6;sfr IAP_CONTR = 0xE7;/********************************************************************定义ISP/IAP/EEPROM 命令*********************************************************************/ #define CMD_IDLE 0#define CMD_READ 1#define CMD_PROGRAM 2#define CMD_ERASE 3#define ENABLE_IAP 0x83//SYSCLK<12MH#define IAP_ADDRESS 0x0000 //存储地址/********************************************************************IO口定义********************************************************************/ bit write=0;uchar biaozhi=6;//按下次数值uint tcnt,sec; //键值判断uint datA,datB; //接通和断开存储值uchar tg,ts,tb; //接通个十百标志uchar dg,ds,db; //断开个十百标志uchar TDbz=0;//通断标志bit bz1=0;//输入标志sbit P10=P1^0;//数码管段sbit P11=P1^1;//数码管段sbit P12=P1^2;//数码管段sbit P13=P1^3;//数码管段sbit P14=P1^4;//数码管段sbit P15=P1^5;//数码管段sbit P16=P1^6;//数码管段sbit P17=P1^7;//AD信号输入sbit P30=P3^0;//按键输入sbit P31=P3^1;//按键输入sbit P32=P3^2;//数码管位sbit P33=P3^3;//数码管位sbit P34=P3^4;//数码管位sbit P35=P3^5;//数码管位sbit OUT=P3^7; //继电器输出/********************************************************************初始定义*********************************************************************/code uchar seg7code[10]={0xfB,0x89,0xf5,0xDD,0x8F,0xdE,0xfE,0xc9,0xfF,0xdF}; //显示段码数码管字跟/********************************************************************延时函数*********************************************************************/void delay1(uchar t){uchar i,j;for(i=0;i<t;i++){for(j=13;j>0;j--);{ ;}}}/********************************************************************延时函数*********************************************************************/ void delay()//延时程序0.1秒{uchar m,n,s;for(m=10;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}/********************************************************************接通显示函数*********************************************************************/ void LedT() //显示函数{/*****************数据转换*****************************/uint x,c,v;x=datA/100; //求百位c=datA%100/10; //求十位v=datA%10; //求个位P32=1;P33=1;P34=1;P35=1;P1=0Xef; //显示字母AP32=0;P33=1;P34=1;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;P1=seg7code[x];P32=1;P33=0;P34=1;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;P1=seg7code[c];P32=1;P33=1;P34=1;P35=0;delay1(80);P32=1;P33=1;P34=1;P35=1;P1=seg7code[v];P32=1;P33=1;P34=0;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;}/********************************************************************断开显示函数*********************************************************************/ void LedD() //显示函数{/*****************数据转换*****************************/uint x,c,v;x=datB/100; //求百位c=datB%100/10; //求十位v=datB%10; //求个位P32=1;P33=1;P34=1;P35=1;P1=0Xbe; //显示字母BP32=0;P33=1;P34=1;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;P1=seg7code[x];P32=1;P33=0;P34=1;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;P1=seg7code[c];P32=1;P33=1;P34=1;P35=0;delay1(80);P32=1;P33=1;P34=1;P35=1;P1=seg7code[v];P32=1;P33=1;P34=0;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;}/********************************************************************显示A函数*********************************************************************/ void LedA() //显示函数{/*****************数据转换*****************************/P32=1;P33=1;P34=1;P35=1;P1=0Xef; //显示字母BP32=0;P33=1;P34=1;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;}/********************************************************************显示B函数*********************************************************************/ void LedB() //显示函数{/*****************数据转换*****************************/P32=1;P33=1;P34=1;P35=1;P1=0Xbe; //显示字母BP32=0;P33=1;P34=1;P35=1;delay1(80);P32=1;P33=1;P34=1;P35=1;}/********************************************************************按键函数*********************************************************************/void key(){if(P30==0){delay();if(P30==0){TR0=0;biaozhi++;if(biaozhi>6){biaozhi=0;}datA=tb*100+ts*10+tg;datB=db*1 00+ds*10+dg;while(!P30);write=1;}}if(biaozhi==0){LedA();P1=seg7code[tb];P32=1;P33=0;P34=1;P35=1;delay1(80);if(P31==0){delay();if(P 31==0){tb++; if(tb>9)tb=0;}while(!P31);}}if(biaozhi==1){LedA();P1=seg7code[ts];P32=1;P33=1;P34=1;P35=0;delay1(80);if(P31==0){delay();if(P 31==0){ts++; if(ts>9)ts=0;}while(!P31);}}if(biaozhi==2){LedA();P1=seg7code[tg];P32=1;P33=1;P34=0;P35=1;delay1(80);if(P31==0){delay();if(P 31==0){tg++; if(tg>9)tg=0;}while(!P31);}}if(biaozhi==3){LedB();P1=seg7code[db];P32=1;P33=0;P34=1;P35=1;delay1(80);if(P31==0){delay();if( P31==0){db++; if(db>9)db=0;}while(!P31);}}if(biaozhi==4){LedB();P1=seg7code[ds];P32=1;P33=1;P34=1;P35=0;delay1(80);if(P31==0){delay();if(P 31==0){ds++; if(ds>9)ds=0;}while(!P31);}}if(biaozhi==5){LedB();P1=seg7code[dg];P32=1;P33=1;P34=0;P35=1;delay1(80);if(P31==0){delay();if( P31==0){dg++; if(dg>9)dg=0;}while(!P31);datA=tb*100+ts*10+tg;datB=db*100+ds*10+dg;}}if(biaozhi==6){if(TDbz==0){LedT();}if(TDbz==1){LedD();}}/********************************************************************定时中断服务函数*********************************************************************/ void t0(void) interrupt 1 using 0 //定时中断服务函数{tcnt++; //每过250ust tcnt 加一if(tcnt==3810) //计满400 次(1/10 秒)时4000为秒{tcnt=0; //重新再计if(TDbz==0){datA--;if(datA==0){TDbz=1;OUT=0;}}if(TDbz==1){datB--;if(datB==0){TDbz=0;OUT=1;TR0=0;}}}}/******************************************************************** 禁用ISP/IAP/EEPROM functionmake 单片机在一安全状态*********************************************************************/ void IapIdle(){IAP_CONTR = 0; //IAP_CMD = 0; //IAP_TRIG = 0; //IAP_ADDRH = 0x80; //IAP_ADDRL = 0; //}/********************************************************************读数据*********************************************************************/uchar IapReadByte(uint addr){uchar dat;IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_READ;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_TRIG = 0x46;IAP_TRIG = 0xb9;_nop_();dat = IAP_DATA;IapIdle();return dat;}/********************************************************************写数据*********************************************************************/void IapProgramByte(uint addr, uchar dat){IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_PROGRAM;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_DATA = dat;IAP_TRIG = 0x46;IAP_TRIG = 0xb9;_nop_();IapIdle();}/********************************************************************擦除数据*********************************************************************/void IapEraseSector(uint addr){IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_ERASE;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_TRIG = 0x46;IAP_TRIG = 0xb9;_nop_();IapIdle();}/********************************************************************主函数*********************************************************************/ void main(){TMOD=0x02; //定时器工作在方式2TH0=0x06; //对TH0 TL0 赋值TL0=0x06;TR0=0; //定时开关ET0=1;EA=1;sec=0;OUT=1;P1M0=0X00;P1M1=0X7F;P3M0=0X00;P3M1=0XFF;tb = IapReadByte(0x01); //读取0x01中的数据ts = IapReadByte(0x02); //读取0x02中的数据tg = IapReadByte(0x03); //读取0x03中的数据db = IapReadByte(0x04); //读取0x02中的数据ds = IapReadByte(0x05); //读取0x03中的数据dg = IapReadByte(0x06); //读取0x03中的数据datA=tb*100+ts*10+tg;datB=db*100+ds*10+dg;P17=1;while(1){if((P17==0)&&(bz1==0)){delay1(180);if(P17==0){bz1=1;TR0=1;OUT=1;tcnt=0;datA=tb*100+ts*10+tg;datB=db*100+ds*10+dg;}}if((P17==1)&&(bz1==1)){bz1=0;}key();if(write==1){write=0;IapEraseSector(0); //擦除扇区IapProgramByte(0x01,tb);//写入数据IapProgramByte(0x02,ts);//写入数据IapProgramByte(0x03,tg);//写入数据IapProgramByte(0x04,db);//写入数据IapProgramByte(0x05,ds);//写入数据IapProgramByte(0x06,dg);//写入数据}}}/********************************************************************程序结束*********************************************************************/ #include<STC12C2052AD.h>#include<intrins.h>#include<math.h>#include "INTRINS.H"#define uchar unsigned char //宏定义字符型变量#define uint unsigned int //宏定义整型变量sfr IAP_DATA = 0xE2;sfr IAP_ADDRH = 0xE3;sfr IAP_ADDRL = 0xE4;sfr IAP_CMD = 0xE5;sfr IAP_TRIG = 0xE6;sfr IAP_CONTR = 0xE7;#define CMD_IDLE 0#define CMD_READ 1#define CMD_PROGRAM 2#define CMD_ERASE 3#define ENABLE_IAP 0x83//SYSCLK<12MH#define IAP_ADDRESS 0x0000 //存储地址void IapEraseSector(uint addr);//擦除数据void IapProgramByte(uint addr, uchar dat);//写数据uchar IapReadByte(uint addr);//读数据void IapIdle();//禁用ISP/IAP/EEPROM functionmake 单片机在一安全状态bit flag_eeprom1=0;//掉电存储的标志位sbit P32=P3^2;//数码管位sbit P33=P3^3;//数码管位sbit P34=P3^4;//数码管位sbit P35=P3^5;//数码管位sbit pa = P1^6;sbit pb = P1^0;sbit pc = P1^3;sbit pd = P1^4;sbit pe = P1^5;sbit pf = P1^1;sbit pg = P1^2;uint tcnt1=0;//用于刷新数码管uint g_uistopwatch1=0;//全局变量,在数码管上显示的一个变量uint qiannum1,bainum1,shinum1,genum1;unsigned int qiannum11,bainum11=0,shinum11=0,genum11=0;//用于传到数码管上显示sbit key1=P3^0;//key1sbit key2=P3^1;//key2sbit in=P1^7;//insbit out=P3^7;//outunsigned int innum=0;void seg7code(unsigned char num);void P3t1();void timer0_1init(void);//定时配置static unsigned char presstime=0;//时间值按键用到的unsigned int kf0=1;//按键用的标志位unsigned int kt0=0;//按键用的标志位void keyflag();//按键结束调用unsigned int if0=1,if1=1;unsigned int keynum=0;//数码管的位unsigned int inum1=0;unsigned char inum11=0,inum12=0,innum1=0,innum2=0;void displaynums(){//将数字传到数码管上显示if(if0==1){g_uistopwatch1=innum;if(innum>=inum1){out=0;}else{out=1;}}else{inum1=qiannum11*1000+bainum11*100+shinum11*10+genum11; //将num1三个数码管的值付给inumg_uistopwatch1=inum1;}}void keycan(){//按键if(key1==0){//当按键1按下if(kf0){//当标志位kf0=1的时候进行if(presstime>80){//当时间值大于一百的时候kf0=0;//标志位kf0=0kt0=1;//标志位kt0=0presstime=0;//时间清零,重新进行if0=0;if1=1;keynum++;//数码管的位if(keynum==5){//当位到4则置位0keynum=0;if0=1;}}}}else{//当按键松开keyflag();}//按键1结束if(key2==0){if(kf0){if(presstime>80){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;if(keynum==0){if1++;if(if1==2){if0=0;}if(if1==3){innum=0;if1=1;if0=1;}}else{switch(keynum){case 1:qiannum11++;//数码管一加加if(qiannum11>9){//当数码管一加加到9时置为1qiannum11=0;}break;case 2:bainum11++;if(bainum11>9){bainum11=0;}break;case 3:shinum11++;if(shinum11>9){shinum11=0;}break;case 4:genum11++;if(genum11>9){genum11=0;}break;default:break;}}}}}else{keyflag();}//松开按键进行显示}void main(){P1M0=0X00;P1M1=0XFF;timer0_1init();inum11 = IapReadByte(0x01); //读取0x01中的数据inum12 = IapReadByte(0x02); //读取0x01中的数据innum1 = IapReadByte(0x03); //读取0x01中的数据innum2 = IapReadByte(0x04); //读取0x01中的数据inum1=inum11*100+inum12;innum=innum1*100+innum2;g_uistopwatch1=innum;qiannum11=inum1/1000;bainum11=inum1/100%10;shinum11=inum1/10%10;genum11=inum1%10;while(1){keycan();//按键displaynums();if(in==0){//in按下if(kf0){//当标志位kf0=1的时候进行if(presstime>80){//当时间值大于一百的时候kf0=0;//标志位kf0=0kt0=1;//标志位kt0=0presstime=0;//时间清零,重新进行flag_eeprom1=1;innum++;}}}else{//当按键松开keyflag();}//in结束if(flag_eeprom1==1){//加掉电存储,必需加到这,不然有一些小问题flag_eeprom1=0;inum11=inum1/100;//把int型的值拆分到char型inum12=inum1%100;innum1=innum/100;//把int型的值拆分到char型innum2=innum%100;IapEraseSector(0); //擦除扇区IapProgramByte(0x01,inum11);//写入数据IapProgramByte(0x02,inum12);//写入数据IapProgramByte(0x03,innum1);//写入数据IapProgramByte(0x04,innum2);//写入数据}}}void timer0(void)interrupt 1 {//500等于1秒TL0 = 0xCD; //重新设置定时器0时间为2msTH0 = 0xF8; //重新设置定时器0的初始值tcnt1++;presstime++;genum1=g_uistopwatch1%10;//个位shinum1=g_uistopwatch1%100/10;//十位bainum1=g_uistopwatch1%1000/100;//百位qiannum1=g_uistopwatch1/1000;//qian位switch(tcnt1){case 1:P3t1();seg7code(qiannum1);if(keynum==1 || keynum==0){P32=0;}break;case 2:P3t1();seg7code(bainum1); if(keynum==2 || keynum==0){P33=0;}break;case 3:P3t1();seg7code(shinum1); if(keynum==3 || keynum==0){P35=0;}break;case 4:P3t1();seg7code(genum1); if(keynum==4 || keynum==0){P34=0;}break;default:tcnt1=0;break;}}void timer0_1init(void){//定时配置TMOD=0x11;//将定时器0,1都设置为模式1TL0 = 0xCD;//设置定时器0时间为2msTH0 = 0xF8;//设置定时器0的初始值TR0=1;//开启定时器0TR1=1;//开启定时器1EA=1;//开总中断ET0=1;//开定时器0的中断}void s0(){pa = 1;pb = 1;pc = 1;pd = 1;pe = 1;pf = 1;pg = 0;} void s1(){pb = 1;pc = 1;pa = 0;pg = 0;pd = 0;pe = 0;pf = 0;} void s2(){pa = 1;pb = 1;pg = 1;pe = 1;pd = 1;pf = 0;pc = 0;} void s3(){pa = 1;pb = 1;pg = 1;pc = 1;pd = 1;pf = 0;pe = 0;} void s4(){pb = 1;pg = 1;pc = 1;pf = 1;pa = 0;pd = 0;pe = 0;} void s5(){pa = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 0;pb = 0;} void s6(){pa = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 1;pb = 0;} void s7(){pa = 1;pb = 1;pc = 1;pf = 0;pe = 0;pd = 0;pg = 0;} void s8(){pa = 1;pb = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 1;} void s9(){pa = 1;pb = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 0;} void s10(){pa =0;pb = 0;pc = 0;pf = 0;pe = 0;pd = 0;pg = 0;} void seg7code(unsigned char num){if(num == 0){s0();}else if(num == 1){s1();}else if(num == 2){s2();}else if(num == 3){s3();}else if(num == 4){s4();}else if(num == 5){s5();}else if(num == 6){s6();}else if(num == 7){s7();}else if(num == 8){s8();}else if(num == 9){s9();}}void P3t1(){P32=1;P33=1;P34=1;P35=1;}void keyflag(){//按键结束调用,按键的建议使用,这样可以减小code,但是触发的不建议if(kt0){//当标志位kt0=1的时候进行if(presstime>50){//当时间值大于一百的时候kf0=1;//标志位kf0=1kt0=0;//标志位kt0=0presstime=0;//时间清零,重新进行}}}/********************************************************************禁用ISP/IAP/EEPROM functionmake 单片机在一安全状态*********************************************************************/void IapIdle(){IAP_CONTR = 0; //IAP_CMD = 0; //IAP_TRIG = 0; //IAP_ADDRH = 0x80; //IAP_ADDRL = 0; //}/********************************************************************读数据*********************************************************************/uchar IapReadByte(uint addr){uchar dat;IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_READ;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_TRIG = 0x46;IAP_TRIG = 0xb9;_nop_();dat = IAP_DATA;IapIdle();return dat;}/********************************************************************写数据*********************************************************************/void IapProgramByte(uint addr, uchar dat){IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_PROGRAM;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_DATA = dat;IAP_TRIG = 0x46;IAP_TRIG = 0xb9;_nop_();IapIdle();}/********************************************************************擦除数据*********************************************************************/void IapEraseSector(uint addr){IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_ERASE;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_TRIG = 0x46;IAP_TRIG = 0xb9;_nop_();IapIdle();}【尺寸图】【图片展示】【加装配套外壳效果】。
四位一体共阳数码管
四位一体共阳数码管是一种常用的显示设备,它由四个独立的数码管组成,每个数码管由7段条形发光二极管和一个圆点发光二极管组成。
通过控制ABCDEFG发光二极管的亮灭,可以显示0-F字符以及其他特殊字符,控制DP发光二极管的亮灭能控制是否显示小数点。
在使用时,12、9、8、6引脚需要分时接高电平,11、7、4、3、1、10、5、3引脚对应于数码的A-G、DP发光管,控制A-G、DP发光管的高低电平能控制对应发光管的灭亮。
四位一体数码管的动态扫描原理是利用人的视觉暂留原理,快速循环显示各个数码管的字符,形成连续的字符串。
在数码管显示“1234”字符的流程如下:
1. 第1位数码管显示“1”,第234位数码管不显示;
2. 经过时间t后,第2位数码管显示“2”,第134位数码管不显示;
3. 又经过时间t后,第3位数码管显示“3”,第124位数码管不显示;
4. 又经过时间t后,第4位数码管显示“4”,第123位数码管不显示;
5. 又经过时间t后,返回第1步显示第1位数码管,依次循环。
其中,扫描显示间隔t是很关键的参数,t太长将会导致数码管闪烁,一般选择5ms或者更短的时间为宜。
四位一体共阳数码管在各种电子设备中得到了广泛的应用,例如在单片机系统中,单片机P2脚接数码管A-G、DP引脚,P1.2-P1.5接数码管12、9、8、6引脚,用于控制数码管的显示。
4位共阴数码管显示代码共阴数码管是一种常见的数码显示器件,它由4位7段数码管组成,每个数码管由7个LED组成,可以显示0-9的数字以及一些字母。
在控制4位共阴数码管显示数字的代码中,通常会使用单片机或者其他微控制器来实现。
下面是一个简单的示例代码,使用Arduino来控制4位共阴数码管显示数字:c.int digitPins[] = {2, 3, 4, 5}; // 数码管的位选引脚。
int segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; // 数码管的段选引脚。
// 数码管显示的数字0-9的编码。
int numbers[10][7] = {。
{1, 1, 1, 1, 1, 1, 0}, // 0。
{0, 1, 1, 0, 0, 0, 0}, // 1。
{1, 1, 0, 1, 1, 0, 1}, // 2。
{1, 1, 1, 1, 0, 0, 1}, // 3。
{0, 1, 1, 0, 0, 1, 1}, // 4。
{1, 0, 1, 1, 0, 1, 1}, // 5。
{1, 0, 1, 1, 1, 1, 1}, // 6。
{1, 1, 1, 0, 0, 0, 0}, // 7。
{1, 1, 1, 1, 1, 1, 1}, // 8。
{1, 1, 1, 1, 0, 1, 1} // 9。
};void setup() {。
for (int i = 0; i < 4; i++) {。
pinMode(digitPins[i], OUTPUT); }。
for (int i = 0; i < 7; i++) {。
pinMode(segmentPins[i], OUTPUT); }。
}。
void loop() {。
for (int i = 0; i < 10; i++) {。
displayNumber(i);delay(1000);}。
设计一个4位数码管时钟电路了解什么是4位数码管;四位数码管是一种半导体发光器件,其基本单元是发光二极管。
能显示4个数码管叫四位数码管。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
什么是时钟电路;1.就是产生像时钟一样准确的振荡电路;2.任何工作都按时间顺序。
(时钟电路一般由晶体震荡器,晶震控制芯片和电容组成)四位数码管怎么显示;利用单片机调节开关的高低电平的变化,然后显示在数码管上;四位数码管怎样驱动;1、静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O 端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O 端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
3.6显示电路及其相关元件介绍
3.6.1 7段数码管及74LS164介绍
数码管是由发光二极管组成的显示器[13],有7段和“米”字段之分,如图3-9所示的段数码管有共阴极和共阳极接法两种。
共阳极数码管的发光二极管的阳极连接在一起,通常此公共阳极接+5V,当某个发光二极管的阴极为低电平时,发光二极管电亮,相应的端被显示。
图3-9 七段数码管结构
74LS164是8位串入/并出的移位寄存器[14],无并行输出控制端,在串行输入过程中,其输出状态会不断的变换。
其真值表如表3-3所示。
表3-3 74LS164真值表
Q A0、Q B0和Q H0是在稳态输入状态输入条件建立之前Q A、Q B和Q H相应的电平; Q An和Q Bn是最近时钟脉冲在上升沿转换之前Q An和Q Bn的电平,表示移一位。
图3-10 显示电路
3.6.2数码管显示电路介绍
显示电路有静态和动态两种。
所谓动态显示就是在执行相应的显示指令时才会点亮相应的数码管,相关指令执行完后就会熄灭,依靠人的视觉暂留给人一种数码管被一直点亮的感觉,而实际上数码管是闪烁的,应用于程序不大的系统中;而静态显示是是当数码管显示某一个字符时,相应的发光二极管恒定地导通或截止。
考虑到本设计程序并不庞大,所以选用四位7段数码管组成动态显示电路。
如图3-10所示。
单片机的串行口工作于模式0[15],即同步移位寄存器模式。
数据由RXD端发送,同步移位脉冲由TXD端输出。
通过74LS164转换为并行输出,构成4位7段数码管的段选。
数码管的位选分别由单片机的P3.3、P3.4、P3.5和P3.7 口构成。
图中的四个PNP型三极管用于控制四个数码管的选通,反相器7404是为了
防止+5V直接与单片机I/O口导通导致单片机I/O口烧毁。
当P3.3、P3.4、P3.5和P3.7中有一个输出高电平时,经过反向器7404变为低电平后导通相应的三极管从而将+5V加到该路数码管的共阳极上。
当74LS164发出的段码全为0时,则该路数码管的发光二极管全亮。
通过以上可以得到数码管字形与段码的关系如表3-4所示
表3-4 数码管字形与段码对照表
字形Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
编码a b c d e f g h
0 0 0 0 0 0 0 1 1 03
1 1 0 0 1 1 1 1 1 9F
2 0 0 1 0 0 1 0 1 25
3 0 0 0 0 1 1 0 1 0D
4 1 0 0 1 1 0 0 1 99
5 0 1 0 0 1 0 0 1 49
6 0 1 0 0 0 0 0 1 41
7 0 0 0 1 1 1 1 1 1F
8 0 0 0 0 0 0 0 1 01
9 0 0 0 0 1 0 0 1 09
A 0 0 0 1 0 0 0 1 11
B 1 1 0 0 0 0 0 1 C1
C 0 1 1 0 0 0 1 1 63
D 1 0 0 0 0 1 0 1 85
E 0 1 1 0 0 0 0 1 61
F 0 1 1 1 0 0 0 1 71。