四位数码管模块原理图
Verilog HDL语言 四位数字频率计 课程设计
![Verilog HDL语言 四位数字频率计 课程设计](https://img.taocdn.com/s3/m/dd771375770bf78a652954e4.png)
1、设计目的和要求1、设计一个4位十进制数字频率计。
2、测量范围1~9999Hz,采用4位数码管显示,有溢出指示。
3、量程有1KHz,1MHz两档,用LED灯指示。
4、读数大于9999时,频率计处于超量程状态,发出溢出指示,下次量程,量程自动增大一档。
5、读数小时,频率计处于前量程状态,下次测量,量程自动减小一档。
6、采用记忆显示方式,在计数与显示电路中间加以锁存电路,每次计数结束,将计数结果送锁存器锁存,并保持到下一个计数结束。
2、设计原理1、基本原理频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
这就要求sysclk 能产生一个1s脉宽的周期信号,并对频率计的每一个计数器cntp的使能端进行同步控制。
当clK_cnt高电平时允许计数,并保持其所计的数。
在停止计数期间,首先需要一个锁存信号将计数器在前1s的计数值锁存进锁存器reg中,并由外部的7段译码器译出并稳定显示。
原理图如图1-1图1-12、模块原理根据数字频率计的基本原理,本文设计方案的基本思想是分为五个模块来实现其功能,即整个数字频率计系统分为分频模块、控制模块、计数模块、译码模块和量程自动切换模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。
3、设计内容1、分频模块由于晶体振荡器提供的为50MHz的时钟,而在整个频率计里将用到周期为2s,半个周期为1s的闸门信号,所以我们在此模块先分频产生0.5Hz的分频信号。
always@(posedge sysclk)beginif(cnt==26’b10_1111_1010_1111_0000_1000_0000)begin clk_cnt<=~clk_cnt;cnt<=0;endelsebegin cnt<=cnt+1;endend二进制的26’b10_1111_1010_1111_0000_1000_0000,即为十进制的50x10^7,由程序中的clk_cnt<=~clk_cnt;cnt<=0;得知会产生我们想要的周期为2s的clk_int信号。
ADC0804的详细控制程序和仿真(595芯片和四位一体数码管)图
![ADC0804的详细控制程序和仿真(595芯片和四位一体数码管)图](https://img.taocdn.com/s3/m/1c9c3221a5e9856a561260ac.png)
仿真电路图,经过测试,没问题下面是上个图的分解图模拟电路:设计模拟电路的原因主要有以下两点1.由于外界信号的复杂性,使得传感器直接输出的电信号可能会存在一些问题(如不稳定),这些不稳定信号如果直接送到A/D 芯片进行采样,则最终结果可能使得最后的显示值来回乱跳,而无法确定待测的外界信号到底是多少。
因此,可能需要设计一套模拟电路对传感器输出的不稳定电信号进行滤波等处理,去除干扰,使得进入A/D 转换芯片的电压值为一个稳定的信号。
2.每一个A/D 转换芯片都有一个参考电压,只有输入的模拟电压值在这个参考电压的范围内才能进行正确的转换,例如:本试验将ADC0804芯片的参考电压设置成0V ~5V ,因此如果输入的电压值大于5V ,则转换出的结果永远为0xFF,若输入的电压值小于0V,则转换出的结果永远为0,这样便无法正确的还原出被测信号的大小。
基于上述原因,我们可能需要设计一套模拟电路,传感器的输出电压值进行一些变换(放大,缩小),使得送到A/D转换芯片的电压值在转换芯片的参考电压范围内。
A/D转换芯片:即模拟/数字转换芯片,它将输入的模拟电压信号转换成单片机等控制处理器能够识别的数字二进制形式。
处理器芯片:处理器芯片有很多中(比如51单片机,ARM或者是PC上的奔腾处理器,AMD处理器)这些处理器虽然架构不一样,但是有个共同的特点,就是它们能够运行程序,因此它们能通过程序对A/D芯片送入的二进制形式的电压值进行处理,通过运算将其还原成待测的外界信号值,控制显示部件(如LCD,八段数码管)将这个值显示出来。
例如:假如ADC0804输出的二进制值0x80,则根据A/D转换公式可以推出ADC0804的输入电压大小为(0x80/0x100)*5V=2.5V。
假设信号经过模拟电路缩小了8倍,则可以推出传感器的输出电压为2.5V*8=20V,再根据传感器的转换公式(一般手册会给出)即可得到输入的外界信号的值。
显示:显示的作用是将计算出的待测外界信号的值展示给测量人员,显示的形式有很多种,如LCD,八段数码管,上位机软件等。
《FPGA设计与应用》数码管显示实验一
![《FPGA设计与应用》数码管显示实验一](https://img.taocdn.com/s3/m/d4769a5c571252d380eb6294dd88d0d233d43c84.png)
《FPGA设计与应用》数码管显示实验一、实验目的和要求
1.学习动态数码管的工作原理;
2.实现对EGO1开发板四位动态数码管的控制;
二、实验内容
实现对EGO1开发板四位动态数码管的控制,使其能够正常工作;
三、实验要求
在EGO1开发板上显示想要的数字。
四、操作方法与实验步骤
1、八段数码管的动态显示原理:
2、数码管显示的设计共分3个模块:
(1)数码管封装模块
(2)数码管设计模块
(3)顶层模块
数码管动态显示的MODULE实现:
模块顶层设计——显示4个(位)十进制数
逻辑实现:
确定当前显示的位
确定当前“位”需要显示的“数”:
将“数”翻译成相应的“段码”
仿真测试台代码编写与仿真测试定义时间标尺:
定义测试Moudle
实例化被测Moudle
定义激励信号与响应信号
构造激励信号:
五、实验数据记录和处理实验代码如下:
设计文件:(部分)
仿真文件:
约束文件:
六、实验结果与分析网表结构:
仿真图像:
实物图:
七、讨论和心得
通过这次实验,我学会了数码管的动态显示,每一个数码管共用一套电路,显示时只需控制哪一个数码管进行显示。
虽然一次只能控制单独一个数码管进行显示,但可以快速切换数码管显示,利用人眼的”视觉暂留"来“同步”进行显示。
最后我明白了我们不要遇到一点困难就退缩,就去向老师同学寻求帮助,自己是自己最好的老师,只有我们靠自己的不断修改出正确结果,才会对这个知识掌握的更加透彻。
4位简易秒表的设计与制作
![4位简易秒表的设计与制作](https://img.taocdn.com/s3/m/6f03f63d77c66137ee06eff9aef8941ea66e4b73.png)
4位秒表的设计与制作一、任务要求该任务要求设计并制作一个4位秒表,秒表有启动、停止和清零功能,显示时间为0到9999秒。
该任务是综合应用数码管动态显示、单片机定时计数器和中断系统设计一个具有启动、停止、清零和校时功能的,能显示0到9999秒的4位秒表。
二、设计方案提示4位秒表的设计与1位秒表设计基本相似,所不同的是4位秒表要显示4位数据,而且要有校时功能,所以它只是综合了键盘、定时器、中断系统和动态显示的应用。
多位数显示器是用数码管显示4位十进制数,如果采用数码管静态显示方法,4个数码管要占用4个I/O端口,将占用单片机的所有I/O口而无法实现其他功能,因此不能用静态显示方法实现多位数据的显示。
如何用单片机控制数码管实现多位数据的现实,而又不占用太多的I/O口呢?这就要用到--------数码管的动态显示。
4位秒表设计与1位秒表的设计在原理上是一样的,不同的是:4位秒表要显示4位数,利用前面的数码管显示方法需要4个并行I/0口,而启动停止和清零要占用2个I/O线,89C52单片机只有4个并行I/O口,因此这种显示方法不能满足4位秒表的功能。
那么,如何实现4位秒表的设计呢?这就是该任务的关键------数码管动态显示技术三、系统硬件设计参考:4位秒表电路原理图如图3-21所示,有启动停止、清零和校时电路;数码管的位选端分别接P2口的P2.0~P2.3,段选端接P0口,74LS245是驱动电路。
图3-21 4位秒表电路原理图硬件电路设计图3-17 4位数据显示器的硬件原理图图3-17是4位数据显示器的硬件原理图,数码管是共阳连接,P2口输出显示段码,74LS245驱动数码管显示,CE是片选端,低电平有效;4位数码管的公共端分别由P3.0、P3.1、P3.2、P3.3控制。
四、系统软件设计参考程序//功能:4位数码管动态显示“1234”//函数名:delay50ms//函数功能:采用定时器1、工作方式1实现50ms延时,晶振频率12MHz//形式参数:无//返回值:无void delay50ms(){ TH1=0x3c; // 置定时器初值TL1=0xb0;TR1=1; // 启动定时器1while(!TF1); // 查询计数是否溢出,即定时到,TF1=1TF1=0; // 50ms定时时间到,将定时器溢出标志位TF1清零}void main() //主函数{unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92}; //设置数字0~5字型码unsigned char i,w;TMOD=0x10; //设置定时器1工作方式1while(1) {w=0x01; //位选码初值为01Hfor(i=0;i<4;i++){P2=~w; //位选码取反后送位控制口P2口w<<=1; //位选码左移一位,选中下一位LEDP1=led[i]; //显示字型码送P1口delay50ms(); //延时50ms}}}4位秒表流程图如图3-22所示:包括主函数流程、定时器中断函数和显示函数流程图。
GYJ-0057 STC12C2052AD四位数码管显示可编程单路输入输出继电器工控板
![GYJ-0057 STC12C2052AD四位数码管显示可编程单路输入输出继电器工控板](https://img.taocdn.com/s3/m/d7979721284ac850ad0242d5.png)
【接线说明】【输入控制设备】【输出控制设备】【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();}【尺寸图】【图片展示】【加装配套外壳效果】。
四位数码管动态显示
![四位数码管动态显示](https://img.taocdn.com/s3/m/cb53f51549649b6649d7479e.png)
实验名称:实验名称四位数码管动态显示一、实验目的1.通过AT89C52单片机控制四位数码管动态显示数字“3210”。
2.用Protues设计、仿真以AT89C52为核心的四位数码管动态显示实验装置。
3.掌握四位数码管的控制方法。
二、实验任务P1端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,接通电源时,显示“”字样;三、实验设备微机1台、Proteus软件1套、GL10型51单片机学习开发板1台。
四、实验电路绘制五、汇编语言程序设计1.设计原理动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。
在进行数码显示的时候,要对显示单元开辟4个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。
对于显示的字形码数据我们采用查表方法来完成。
2.程序框图3.汇编程序ORG 0000H ;初始化START:MOV R0,#0FFH ;控制段选,给R0传递一个初值1111 1111MOV DPTR,#TABLE ;将表头的地址传递给数据指针NEXT:MOV A,R0 ;R0的值传给累加器AMOVC A,@A+DPTR ;查表指令,将TABLE的值按底标给AMOV P2,A ;A的值传给P2接口,显示数字0LCALL DELAY ;调用延时函数,延时INC R0 ;R0加一,MOV A,R0 ;R0的值再次传给A,控制位选移动MOV P1,A ;A的值传给P1口,CJNE R0,#04,NEXT ;判断R0是否等于4,若不等于,转NEXT继续执行,若等于,继续执行下一条程序SJMP START,相当于将值初始化,重新开始。
SJMP START ;跳转到START,R0,R1初始化,重新执行一轮。
DELAY:MOV R6,#4 ;延时程序DL2:MOV R7,#248DL1:DJNZ R7,$DJNZ R6,DL2RETTABLE:DB 3FH,06H,5BH,4FH ;以table为表头地址,依次存入二进制的0.1.2.3END六、Proteus软件模拟仿真七、GL10单片机仿真系统1.实验板连线2.实验操作步骤先把“单片机系统”区域中的P1.0/AD0-P1.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;再把“单片机系统”区域中的P2.0/A8-P2.3/A15用4芯排线连接到“动态数码显示”区域中的0-N端口上。
实验四 数码管显示控制
![实验四 数码管显示控制](https://img.taocdn.com/s3/m/78cd1f56a200a6c30c22590102020740be1ecdbe.png)
实验四数码管显示控制一、实验目的1、熟悉Keil uVision2软件的使用;2、掌握LED数码管显示接口技术;3、理解单片机定时器、中断技术。
二、实验设备及仪器Keil μVision2软件;单片机开发板;PC机一台三、实验原理及内容1、开发板上使用的LED 数码管是四位八段共阴数码管(将公共端COM接地GND),其内部结构原理图,如图4.1所示。
图4.1共阴四位八段LED数码管的原理图图4.1表明共阴四位八段数码管的“位选端”低电平有效,“段选端”高电平有效,即当数码管的位为低电平,且数码管的段为高电平时,相应的段才会被点亮。
实验开发板中LED数码管模块的电路原理图,如图4.2所示。
SP1a~hP0.4~P0.7SP2P0.0~P0.3图4.2 LED数码管模块电路原理图图中,当P1.0“段控制”有效时,P0.0~P0.7分别对应到数码管的a~h段。
当P1.1“位控制”有效时,P0.0~P0.7分别对应到DIG1~DIG8。
训练内容一:轮流点亮数码管来检测数码管是否正常。
参考程序:ORG 00HAJMP MAINMAIN:SETB P1.2;LED流水灯模块锁存器的控制位MOV P0,#0FFH;关闭LED灯CLR P1.2SETB P1.3 ;点阵模块的行控制锁存器MOV P0,#0 ;关闭点阵行CLR P1.3MOV A,#11111110B;数码管“位选信号”初值,低电平有效LOOP:SETB P1.1;数码管位控制锁存器有效MOV P0,ACLR P1.1RL A ;形成新的“位选信号”,为选择下一位数码管做准备SETB P1.0;数码管段控制锁存器有效MOV P0,#0FFH ;数码管的所有段点亮,显示“8”CLR P1.0CALL DELAYSJMP LOOPDELAY:MOV R5,#0;延时子程序D1: MOV R6,#0D2:NOPDJNZ R6,D2DJNZ R5,D1RETEND训练内容二:静态显示,0~9计数。
51单片机原理图
![51单片机原理图](https://img.taocdn.com/s3/m/7d0d231f79563c1ec5da71c9.png)
2.3 51单片机增强型学习系统各组成部份原理图及功能简介2.3.1 共阴极数码管动态扫描控制图2.2 51单片机增强型学习系统的四位共阴极数码管动态扫描硬件连接原理图AT89S51单片机P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。
作为输出口用时,每位能驱动8个TTL 逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上接电阻。
AT89S51单片机P2口是一个带有内部上拉电阻的8位双向I/O 口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL 逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX @Ri 指令)时,P2口线上的内容(也即特殊功能寄存器SFR 区中P2寄存器的内容),在整个访问期间不改变。
Flash 编程或校验时,P2亦接收高位地址和其它控制信号。
在上面的硬件连接原理图里,我们用到的是P0和P2口控制四位数码管显示的。
四位数码管显示的方式是动态扫描显示,动态扫描显示是单片机中应用最为广泛的一种显示方式之一。
其接口电路如上图是把所有显示器的8个笔划段a-h同名端连在一起由单51单片机增强型学习系统片机的P0.0~P0.7控制,而每一个数码管的公共极(阴极)是各自独立地受单片机P2.7~P2.4控制。
CPU向字段输出口P0口送出字形码时,所有数码管接收到相同的字形码,但究竟是那个数码管亮则取决于P2.7~P2.4的输入结果,所以我们就可以自行决定何时显示哪一位了。
用单片机控制可测方波100~1000Hz,并显示脉宽
![用单片机控制可测方波100~1000Hz,并显示脉宽](https://img.taocdn.com/s3/m/4a7d7f5a77232f60ddcca125.png)
脉宽(Pulse-Width)是脉冲宽度的缩写,脉冲宽度就是高电平持续的时间,常用来作为采样信号或者晶闸管等元件的触发信号。
脉宽由信号的周期和占空比确定,其计算公式是脉宽W=T×P(T:周期,P:占空比)。
4.2.1 AT89S51具有如下特点:
40个引脚,8k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
AT89S51有PDIP、PLCC、TQFP三种封装方式,其中最常见的就是采用40Pin封装的双列直接PDIP封装,外形结构图2。
芯片共有40个引脚,引脚的排列顺序为从靠芯片的缺口(见右图)左边那列引脚逆时针数起,依次为1、2、3、4......40,其中芯片的1脚顶上有个凹点。在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。
计算方法:脉冲宽度=计数值*0.001s,再将表示脉冲宽度的十六进制转换为压缩BCD码,再将压缩BCD码转为非压缩BCD码用来显示,数码管显示的数据即为要测量的脉宽。
3.4脉冲宽度测量
利用定时器的门控信号GATE进行控制可以实现脉冲宽度的测量。对定时器T1来讲,,被测脉冲信号从INT1端引入,其上升沿启动T1计数,下降沿停止T1计数。定时器的计数值乘以机器周期即为脉冲宽度。下图中给出了脉冲宽度测量的原理图。
意义:
1、通过单片机的综合设计,能够将所学的知识融会贯通,锻炼独立设计、制作和调试单片机的应用系统能力,领会单片机应用系统的软件、硬件调试方法和系统的研制开发过程,为进一步的科研实践活动打下一定的基础。
4位拨动开关控制数码管显示系统设计 (3)
![4位拨动开关控制数码管显示系统设计 (3)](https://img.taocdn.com/s3/m/c7173a8e71fe910ef12df889.png)
课程设计任务书4位DIP开关控制数码管显示系统设计摘要:以单片机AT89S52芯片为核心,用7805、桥堆、拨动开关等器件设计一个控制电路,实现由4位拨动开关控制共阳极数码管显示系统的设计。
电路由电源模块、复位模块、时钟模块、显示模块等。
它由5V直流电源供电,用拨动开关的低四位为输入,控制输出端数码管显示器的输出。
用编程语言编写程序,系统能够实现如下功能:上电后数码管默认显示为“8”,调整4位拨动开关按二进制输入,按确定键后数码管显示对应的数字或字母“0”-“F”。
关键词:4位拨动开关;单片机;共阳极数码管;编程语言目录1. 设计背景 (1)1.1单片机设计背景 (1)1.2设计目的 (1)2.设计方案 (2)2.1方案一 (2)2.2方案二 (2)2.3方案三 (3)3.方案实施 (3)3.1系统组成框图 (4)3.2输入输出电路设计 (4)3.3时钟电路与复位电路设计 (5)3.4电源电路设计 (6)3.5程序设计 (6)3.6仿真结果 (7)4.结果与结论 (9)4.1结果 (9)4.2结论 (9)5. 收获与致谢 (10)6. 参考文献 (10)7.附件 (11)7.1电路硬件原理图 (11)7.2实物图 (15)7.3软件程序 (16)7.4元器件清单 (17)1. 设计背景1.1单片机设计背景目前单片机渗透到我们生活的各个领域。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
1.2设计目的在理论学习的基础上,通过完成一个单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,能够增强我们理论联系实际的能力,进一步熟练相关专业基础知识的综合应用,提高实际动手能力和设计能力。
4位拨动开关控制数码管显示系统设计
![4位拨动开关控制数码管显示系统设计](https://img.taocdn.com/s3/m/4e4514ce4028915f804dc289.png)
务书设计题目4位拨动开关控制数码管显示系统设计学生姓名设计要求:1.电源电路具有电源开关及指示灯,有复位按键;2.高4位开关屏蔽;3.用4位拨码开关为输入,控制数码管显示器的输出;4.实现功能:通电复位后数码管全显即显“8”,数码管对应4位DIP开关的二进制输入显示十六进制全部字符即从“0”到“F”。
学生应完成的工作:1.了解单片机系统的设计方法,设计步骤;2.查找并收集相关资料书籍;3.完成硬件原理图设计;4.完成软件和流程图的设计;5.对系统进行仿真;6.焊接电路板,调试系统;7.认真撰写课程设计报告。
8.孙晓界同学主要负责软件设计参考文献阅读:[1] 张毅刚,彭喜元,彭宇. 单片机原理及应用[M]. 北京:高等教育出版社,2009.[2] 杜树春. 单片机C语言和汇编语言混合编程实例详解[M]. 北京:北京航空航天大学出版社,2006.[3] 童诗白,华成英. 模拟电子技术基础(第四版)[M]. 北京:高等教育出版社,2006.[4] 林志琦. 基于Proteus的单片机可视化软硬件仿真[M]. 北京:北京航空航天大学出版社,2006. 工作计划:5月6日:查阅相关资料,拟定方案;5月7日:进行方案论证,完善设计方案;5月8日:完成硬件设计;5月9日:设计程序流程图;5月10日:完成软件设计,并进行仿真和调试;5月13日:进行焊接;5月14日:烧写程序;5月15日:调试电路;5月16日:与辅导老师交流,写课程设计报告;5月17日:上交课程设计报告及实物。
任务下达日期:2013 年5月 6 日任务完成日期:2013 年5月17 日指导教师(签名):学生(签名):4位拨动开关控制数码管显示系统设计摘要:用AT89S52单片机作为核心,利用晶振,共阳极数码管,7805,桥堆2w10等器件进行设计,由电源电路、复位电路、时钟电路、输入输出电路等设计一个控制电路。
利用汇编编写控制程序,程序使用查表法进行编写。
4位DIP开关控制数码管显示系统设计
![4位DIP开关控制数码管显示系统设计](https://img.taocdn.com/s3/m/fb79ff1f90c69ec3d5bb75db.png)
4位DIP开关控制数码管显示系统设计摘要:本次课程设计以AT89S52单片机为电路的核心,通过7805、桥堆2W10、四位DIP开关、时钟晶振12M、四脚按键等元件组成直流稳压电源和显示控制电路。
然后用汇编语言编写数码管控制程序,通过写入单片机实现四位DIP控制共阳极数码管显示。
在本次设计中,控制系统由+5V直流电源供电,而+5V直流电由直流稳压电源提供。
利用拨动开关的低四位输入控制信号,每一位拨码开关接通时为“1”,断开时为“0”,以四位二进制的方式控制数码管显示器的输出,拨码范围为“0000”-“1111”,对应数字分别为“0”-“F”,而按下复位按键后,程序复位到初始状态,此时数码管全亮,即显示数字“8”的字样。
关键词:AT89S52芯片;四位DIP开关;共阳极数码管;复位按键。
目录1.设计背景 (1)1.1单片机设计背景 (1)1.2设计目的 (1)2. 设计方案 (1)2.1方案一 (1)2.2方案二 (1)3. 方案实施 (2)3.1单片机基本结构 (2)3.2硬件模块电路 (3)3.3软件程序设计 (5)3.4 软件模拟 (5)3.5 PCB制作 (6)3.6 安装与调试 (7)4. 结果与结论 (7)4.1 结果 (7)4.2 结论 (8)5. 收获与致谢 (9)6. 参考文献 (9)7. 附件 (10)7.1 程序 (10)7.2 电路原理图 (12)7.3 PCB布线图 (14)7.4 元器件清单 (15)7.5实物图 (16)1.设计背景1.1单片机设计背景单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能,可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路,集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
四位数字密码锁课程设计
![四位数字密码锁课程设计](https://img.taocdn.com/s3/m/d198c28dbceb19e8b8f6ba5f.png)
74LS147D
真值表:
输出 1 2 3 4 7 8 9 ▁ ▁ ▁ ▁ D C B A 1 1 1 1 1 1 1 1 1 1 1 1 1 ※ ※ ※ ※ ※ ※ ※ ※ 0 0 1 1 0 ※ ※ ※ ※ ※ ※ ※ 0 0 1 1 1 ※ ※ ※ ※ ※ ※ 0 1 1 1 0 0 0 ※ ※ ※ ※ ※ 0 1 1 1 1 0 0 1 ※ ※ ※ ※ 0 1 1 1 1 1 0 1 0 ※ ※ ※ 0 1 1 1 1 1 1 0 1 1 ※ ※ 0 1 1 1 1 1 1 1 1 0 0 ※ 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 74LS147 优先编码器有 9 个输入端和 4 个输出端。某个输入端为 0,代表输入 某一个十进制数。当 9 个输入端全为 1 时,代表输入的是十进制数 0。4 个输出 端反映输入十进制数的 BCD 码编码输出。 74LS147 优先编码器的输入端和输出端都是低电平有效,即当某一个输入端低电 平 0 时,4 个输出端就以低电平 0 的输出其对应的 8421 BCD 编码。当 9 个输入 全为 1 时,4 个输入出也全为 1,代表输入十进制数 0 的 8421 BCD 编码输出。
此图为存储电路的一块芯片,共有 8 块 74LS194 用来存储。
3.密码输入控制电路
如仿真图,左面为加法计数器,中间为 74LS138 作为选片储存功能。开关是控制 电路的设置密码和输入密码功能的,右面总共有八个 74LS194,分为两组(现为 方便,简略了) 。74LS138 的 G1 端输入为 1,实现数据选择功能。当开关拨到上 方时, 74LS138 的输入端 C 端就会置 0, 这时候实现密码输入功能, 此时 74LS138 的输出端只在 Y0 到 Y3 之间工作。当开关闭合时,74LS138 输出端在 Y4 到 Y7 工
实验四 数码管的动态显示实验
![实验四 数码管的动态显示实验](https://img.taocdn.com/s3/m/787359523b3567ec102d8a4d.png)
实验四数码管的动态显示实验班级通信1102 姓名谢剑辉学号20110803223 指导老师袁文澹一、实验目的熟悉掌握数码管动态显示的基本方法;根据已知电路和设计要求在实验板上实现数码管动态显示。
根据已知电路和设计要求在PROTEUS平台仿真实现控制系统。
二、实验内容1、在STC89C52实验平台的4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容。
2、思考:如何实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣。
三、实验原理实验要求“4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容”。
动态扫描可以实现要求。
简单地说,动态扫描就是选通一位,送一位数据。
原理图中的P10~P13是位选信号,即选择哪个数码管显示数字;P00~P07是段码,即要显示的数字。
可以通过依次选通一位7段数码管并通过P0端口送出显示数据。
由于人眼的视觉残留原理,如果这种依次唯一选通每一位7段数码管的动作在0.1s内完成,就会造成多位数码管同时点亮显示各自数字的假象。
本实验使用中断,实现每2s更新一次数字。
四、实验方法与步骤设计思路和方法:1、根据电路图,分析数码管动态显示的设计思路,使用中断实现每2秒更新一次数字的设计思路,以及实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣的设计思路。
(1)数码管动态显示的原理如“实验原理”里所述,不赘述;(2)使用中断实现每2s更新一次数字的设计思路:本次实验使用Timer0中断,由于其定时时间最大为65536us,不能实现2s的长延时,那么可以使用多次中断来实现,并且在中断到来时,不断地死循环显示数字,即根据动态显示原理“选通一位,来一位数据”。
由于最大的数字为9,则(x%10),(x+1)%10,(x+2)%10,(x+3)%10分别是千位,百位,十位,个位上的数字。
实验四 八位七段数码管动态显示电路的设计
![实验四 八位七段数码管动态显示电路的设计](https://img.taocdn.com/s3/m/9af50bbb83c4bb4cf7ecd1e1.png)
八位七段数码管动态显示电路的设计一、实验目的1、了解数码管的工作原理。
2、学习七段数码管显示译码器的设计。
3、学习VHDL的CASE语句及多层次设计方法。
二、实验原理七段数码管是电子开发过程中常用的输出显示设备。
在实验系统中使用的是两个四位一体、共阴极型七段数码管。
其单个静态数码管如下图4-4-1所示。
图4-1 静态七段数码管由于七段数码管公共端连接到GND(共阴极型),当数码管的中的那一个段被输入高电平,则相应的这一段被点亮。
反之则不亮。
共阳极性的数码管与之相么。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
三、实验内容本实验要求完成的任务是在时钟信号的作用下,通过输入的键值在数码管上显示相应的键值。
在实验中时,数字时钟选择1024HZ作为扫描时钟,用四个拨动开关做为输入,当四个拨动开关置为一个二进制数时,在数码管上显示其十六进制的值。
四、实验步骤1、打开QUARTUSII软件,新建一个工程。
2、建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘中提供的示例程序。
4、编写完VHDL程序后,保存起来。
方法同实验一。
5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
6、编译仿真无误后,根据用户自己的要求进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
7、根据实验内容用实验导线将上面管脚分配的FPGA管脚与对应的模块连接起来。
如果是调用的本书提供的VHDL代码,则实验连线如下:CLK:FPGA时钟信号,接数字时钟CLOCK3,并将这组时钟设为1024HZ。
KEY[3..0]:数码管显示输入信号,分别接拨动开关的S4,S3,S2,S1。
EDA四位数字频率计(
![EDA四位数字频率计(](https://img.taocdn.com/s3/m/80f6cd3d5f0e7cd185253614.png)
第一章作业要求1、四位数字频率计(结果用四位数码管显示)注:1以上题目仅供参考,可自行选题,若选择以上题目,每班只能同时两人选择相同题目,但内容不能相同。
2 报告中应包含以下内容:(1)总体设计说明(2)各模块的设计实现(3)各模块的仿真结果(4)整个设计的仿真或实际结果。
3 设计若包含FPGA以外的电路,应在报告中体现。
4 严禁班与班之间抄袭,所有雷同者均不及格。
5 大作业封面每班要统一格式。
(姓名学号班级不能缺少)。
6 仿真用quartus,不接受maxplus。
1.1根据要求制定设计方案:(1)4位十进制数字显示的数字式频率计的测量范围为1k~9999KHZ,测量单位为KHZ;(2)要求量程能够自动转换,即几十KHZ显示小数点后两位,而几百KHZ则显示小数点后一位;(3)当输入信号小于1KHZ时,输出全0,当输入大于9999KHZ 时,输出显示全H。
1.2方案总体思路采用FPGA/CPLD芯片作为控制核心单元,完成各功能模块。
首先将被测信号与控制信号加在FPGA/CPLD芯片上,通过在芯片内部进行各逻辑操作,完成分频、计数及扫描显示等功能操作,最后通过数码管显示结果。
其原理框架图如下图。
第二章频率计原理及测量方法数字频率计是直接用十进制数字显示被测信号频率的一种测量装置。
它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
若在一定时间间隔T内测得的这个周期性信号的重复变化次数N,则其频率可表示为f=N/T;只要知道了N和T就可以求得频率。
若设置闸门信号的时间为1S,则被测频率就是NHz。
M法是在给定的闸门时间内测量被测信号的脉冲个数,进行换算得出被测信号的频率。
当频率计正常工作时,频率为0.5Hz的闸门信号作为计数器的时钟信号,而被测信号则作为计数器的时钟输入。
当闸门信号为高电平是允许计数;而为低电平时,计数器停止计数,则所计的数值即为被测信号的频率。