74LS164动态扫描数码管与proteus传真及C程序
- 格式:doc
- 大小:282.00 KB
- 文档页数:5
74LS164在单片机中的使用在单片机系统中,如果并行口的IO资源不够,那么我们可以使用74LS164来扩展并行IO口,节约单片机IO资源。
74LS164是一个串行输入并行输出的移位寄存器,并带有清除端。
74LS164的引脚可以查看数据手册。
proteus仿真图和代码附上。
#include;#define HIGH1#define LOW#define SEG_PORTP0sbit DATA = P0^4;sbit CLK = P0^5;unsigned char Timer0IRQEvent = 0;unsigned char Time1SecEvent = 0;unsigned int TimeCount = 0;unsigned char SegCurPosition = 0;code unsigned char SegCode[10] ={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07, ~0x7F,~0x6F};code unsigned char SegPosition[4] = {0xFE,0xFD,0xFB,0xF7};unsigned char SegBuf[4] = {0};void LS164_DATA(unsigned char x) {if(x){DATA = 1;}else{DATA = 0;}}void LS164_CLK(unsigned char x){if(x){CLK = 1;else{CLK = 0;}}/************************************************ ***********函数名称:LS164Send*输入:byte单个字节*输出:无*功能:74LS164发送单个字节************************************************* **********/void LS164Send(unsigned char byte){unsigned char j;for(j=0;j;= 4)SegCurPosition = 0;}}/************************************************ ***********函数名称:TimerInit*输入:无*输出:无*功能:定时器初始化************************************************* **********/void TimerInit(void){TH0 = (65536 - 5000)/256;TL0 = (65536 - 5000)%256;TMOD = 0x01;}/************************************************ ***********函数名称:Timer0Start*输入:无*输出:无*功能:定时器启动************************************************* **********/void Timer0Start(void){TR0 = 1;ET0 = 1;}/************************************************ ***********函数名称:PortInit*输入:无*输出:无*功能:I/O初始化************************************************* **********/void PortInit(void){P0 = P1 = P2 = P3 = 0xFF;}/************************************************ ***********函数名称:main*输入:无*输出:无*功能:函数主题************************************************* **********/void main(void){PortInit();TimerInit();Timer0Start();SegRefreshDisplayBuf(); EA = 1;while(1){if(Timer0IRQEvent){Timer0IRQEvent = 0;if(Time1SecEvent){Time1SecEvent = 0;if(++TimeCount >;= 9999){TimeCount = 0;}SegRefreshDisplayBuf();}SegDisplay();}}}/************************************************ ***********函数名称:Timer0IRQ*输入:无*输出:无*功能:定时器中断函数************************************************* **********/void Timer0IRQ(void) interrupt 1{static unsigned int cnt = 0;TH0 = (65536 - 5000)/256;TL0 = (65536 - 5000)%256;Timer0IRQEvent = 1;if(++cnt >;= 200){cnt = 0;Time1SecEvent = 1;}}。
数码管的动态扫描与驱动数码管的基本原理 关于数码管,⼀个单个的数码管可以看做是多个led灯的集合,如下图所⽰其中的8和。
都是LED组成的,通过引脚上电即可点亮不同的LED然后组成不同的数字,这个过程在数码管的设计中叫做段选。
在多个数码管的情况下,需要选择哪个数码管点亮,这个在数码管设计中称作位选,多个数码管可以通过位选和段选完成电⼦时钟设计等功能。
下⾯通过项⽬对于多个数码管进⾏点亮,让其在开发板上显⽰不同的数据。
预计实验现象: 在quartus的in system source and probes editor ⼯具,输⼊需要显⽰在数码管上的数据,则数码管显⽰对应数据。
相关知识点: 数码管动态扫描的实现、in system source and probes editor调试⼯具的使⽤。
设计过程: 1、数码管动态扫描实现。
2、In system sources and probes edit (ISSP)调试⼯具的使⽤ 3、4输⼊查找表,6位输出。
4、分频模块,从系统时钟分频得到1KHz的扫描时钟 5、6选⼀多路选择器,选择为当前数码管的位置。
驱动模块逻辑电路图:下⾯就是照着逻辑电路图来编写程序了。
创建⼯程,添加⽂件module segment(disp_data,rst_n,clk,en ,sel,seg);input clk;//50Minput rst_n;input en;input [23:0]disp_data;output [5:0]sel;//位选(控制哪个数码管亮)output reg [6:0]seg;//段选(控制数码管显⽰什么数据)//分频器的代码,这⾥为了完整,不做多个⽂件来写模块了reg[14:0] diviter_cnt; //25000-1reg clk_1k;reg [5:0]sel_r;reg [3:0]data_temp;//待显⽰数据缓存//⽣成⼀个分频计数器计数always@(posedge clk or negedge rst_n)if (!rst_n)diviter_cnt<=15'd0;else if (!en)diviter_cnt<=15'd0;else if (diviter_cnt==24999)diviter_cnt<=15'd0;elsediviter_cnt<=diviter_cnt+1'b1;//1k扫描时钟⽣成always@(posedge clk or negedge rst_n)if (!rst_n)clk_1k<=1'b0;else if (diviter_cnt==24999)clk_1k<=~clk_1k; //⼤型设计中,这种产⽣分频器的⽅法是不可以的//位选移位寄存器always@(posedge clk_1k or negedge rst_n)if (!rst_n)sel_r<=6'b000_001;else if(sel_r==6'b100_000)sel_r<=6'b000_001;elsesel_r<=sel_r<<1;//设计⼀个6选⼀多路器always@(*)case(sel_r)6'b000_001:data_temp=disp_data[3:0];6'b000_010:data_temp = disp_data[7:4];6'b000_100:data_temp=disp_data[11:8];6'b001_000:data_temp=disp_data[15:12];6'b010_000:data_temp=disp_data[19:16];6'b100_000:data_temp=disp_data[23:20];defaultdata_temp<=4'b0000;endcase//译码器always@(*)case (data_temp)4'h0:seg=7'b1000000;//这⾥按数码管码表来4'h1:seg=7'b1111001;4'h2:seg=7'b0100100;4'h3:seg=7'b0110000;4'h4:seg=7'b0011001;4'h5:seg=7'b0010010;4'h6:seg=7'b0000010;4'h7:seg=7'b1111000;4'h8:seg=7'b0000000;4'h9:seg=7'b0010000;4'ha:seg=7'b0001000;4'hb:seg=7'b0000011;4'hc:seg=7'b1000110;4'hd:seg=7'b0100001;4'he:seg=7'b0000110;4'hf:seg=7'b0001110;endcase//⼆选⼀多路器assign sel=(en)?sel_r:6'b000_000;endmodule编写testbench⽂件来进⾏仿真`timescale 1ns/1ns`define clk_period 20module HXE_tb;reg Clk; //50Mreg Rst_n;reg En; //数码管显⽰使能,1使能,0关闭reg [31:0]disp_data;wire [7:0] sel;//数码管位选(选择当前要显⽰的数码管)wire [6:0] seg;//数码管段选(当前要显⽰的内容)HXE8 HXE8(.Clk(Clk),.Rst_n(Rst_n),.En(En),.disp_data(disp_data),.sel(sel),.seg(seg));initial Clk = 1;always#(`clk_period/2) Clk = ~Clk;initial beginRst_n = 1'b0;En = 1;disp_data = 32'h12345678;#(`clk_period*20);Rst_n = 1;#(`clk_period*20);#20000000;disp_data = 32'h87654321;#20000000;disp_data = 32'h89abcdef;#20000000;$stop;endendmodule点击仿真运⾏,可以看到sel和seg的输出与我们期望的是⼀样的,即位选进⾏移位操作,段选显⽰123456和abcdef。
目录1. 题目设计要求..................................................................2.系统的硬件设计..................................................................2.1系统采用的元器件..........................................................2.2器件选择..................................................................2.2.1 AT89C51概述及引脚功能..............................................2.2.2 74164的技术指标及工作原理..........................................3.系统硬件电路图设计..............................................................3.1振荡电路及复位电路设计....................................................3.2电路原理图................................................................ 4.系统的软件设计.................................................................4.1编程语言选择..............................................................4.2发送字符串模块设计........................................................4.4源代码....................................................................4.5编译结果..................................................................5.系统仿真调试 ...................................................................5.1仿真调试的过程............................................................5.2仿真调试的结果............................................................6.总结 ........................................................................... 7参考文献........................................................................1.题目设计要求用8051单片机的串行口外接串入并出的芯片74164扩展并行输出口,控制一组发光二极管,使发光二极管从下至上延时轮流显示。
74LS164和74LS165工作原理及其在单片机中的应用基于Proteus仿真前言:本文详细介绍了74LS164和74LS165工作原理,并分别举例它们在单片机中的应用,所举例子包含proteus仿真电路图,源程序,程序注释详细清楚。
1、74LS164在单片机中应用举例本例在单片机串行口外接一片8位串入并出移位寄存器74LS164芯片,构成单片机输出接口电路,控制8只LED滚动显示。
(1)74LS164芯片如右图所示,它是8位串入并出移位寄存器,串行输入数据,然后并行输出。
各引脚功能如下:A、B(1、2引脚):数据输入端,数据通过这两个输入端之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
当其中任意一个为低电平,则禁止新数据输入;当其中有一个为高电平,则另一个就允许输入数据。
因此两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
Q0~Q7(3~6,10~13引脚):数据输出端CP(8号引脚):时钟输入端。
CP每次由低变高时,数据右移一位,输入到Q0,Q0 是两个数据输入端的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
MR:复位清除端,当MR为低电平时,其它所有输入端都无效,同时所有输出端均为低电平。
GND(7号引脚,在proteus中已隐藏):接地端VCC(14号引脚,在proteus中已隐藏):电源端,接+5V电源74LS164 内部逻辑图(2)如下图所示,本例单片机串行口工作于方式0,即移位寄存器输入/输出模式。
串行数据通过RXD输出,TXD则用于输出移位时钟脉冲。
数据输入端1接高电平,数据输入端2接单片机RXD引脚。
时钟输入端接TXD引脚,复位端悬空。
数据输出端通过限流电阻接8只LED灯。
C程序如下:#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint x){uchar i;while(x--)for(i=0;i<120;i++);}void main(){uchar c=0x80;SCON=0x00; //串行口工作在方式0while(1){c=_crol_(c,1);SBUF=c;while(TI==0); //等待发送结束TI=0; //发送结束,TI置0delay(400);}}Proteus仿真运行结果如下:2、74LS165在单片机中的应用举例本例在单片机串行口外接一片8位并入串出移位寄存器74LS165,连接移位寄存器并行输入端的是8位拨码开关,其开关动作对应的8位二进制序列将通过移位寄存器串行输入到单片机串口,并通过单片机P0端口的8只LED显示出来。
4HC164应用实例:驱动数码管两例(电路图和源程序)文章编号:8文章分类:电路>电子元件点击:... 关键词:74HC164文章来源:百合电子工作室收集整理摘要:74HC164应用实例:驱动数码管的两个实例分别提供了汇编源程序和C源程序...实例174HC164是串行输入,并行输出接口器件,可用在单向的并行输出/并行地址锁存等. 74HC164因为价格便宜,容易使用特别适合使用在在需要用到数码管显示IO口又比较紧张的电子产品中,下面浅谈使用方法:1. 首先先了解他的引脚功能和逻辑图,如下图:图1 引脚名称和用途图2 真值表通过真值表我们可以了解到,A,B两个输入端是互锁的,CLK上升沿时数据移入移位寄存器中,CLEAR为清零用的,接低电平时所有端口都输出低电平,了解了真值表之后开始运用了,先给出如下原理图:图3 原理图图中,采用义隆的EM78P153作为控制芯片,P50作为CLK时钟信号,注意平时数据不传输时,时钟信号是不发送的应一直保持低电平或者高电平,数据需要传输的时候才输出时钟信号^_^ ,继续P51作为移位数据输出端,接到74HC164的B端,A端接高电平,当然也可以AB端短路,然后连接到DATA移位数据端,P52作为数码管的选通信号(也可以叫消隐^_^), 作用是使数据传输过程暂时关闭显示,以免显示出不需要的数据,原因是应为164不带锁存功能,数据传输过程是一位一位的向高位移位输出的,所以要等数据全部移入后才打开始点亮数码管.注意了哦,通过查看164的规格书发现,164输出高电平电流比输出低电平电流要小,亦称灌电流大,扇出电流弱,所以适合选用共阳数码管,如图,本人偷懒没有画出那个数码管的8字该介绍的介绍的差不多了,废话少说,该开始干活了,任务是: 显示0-9 每秒+1 ,到9后又返回0,一直循环显示,根据任务得到如下流程图:1. 显示部分:将需要显示的数值送入A ==>查表求得显示段码==>将段码逐位移入164==>8位移完后点亮数码管==>延时==>返回第一步执行2. 中断部分:进入中断==>保存现场(以备调查取证,送你入狱^_^)==>重置TCC==>够1秒钟将需要显示的数据+1,并重置,不够就退出;根据以上要求就开始写代码调试了,要注意一点,数据移位时一定要记得高位在前哦,否则显示错误别怪我没有说清楚,我当年实验时就因为这个数据移位方向反了排查了半天,甚至以为是时钟频率不对,又以为时许不对.....搞了半天,NND后来重看DATASHEET才发现,原来是低级错误啊,呜呼哀哉.......,希望你不要重蹈我覆辙,哎哟!! 谁! 谁! 谁扔砖头上来? 啥? 你扔的? 我废话太多.........,那俺少来两句,继续上菜, 咦好像没啥可说的了,上源程序吧1.;中断部分:2.3.;;;;;;;;;;中断;;;;;;;;4.INTPUT:5.MOV TEMPA, A;6.MOV A,@130;7.MOV TCC,A;255-130=1258.CLR RF;9.;;;;;此处填写250Us处理程序10. BS WKREG,T500US11.;;;;;;;;;;;;;;;;;;;;;;;;;12. DJZ R1MS13.JMP INTEXT;14.MOV A,@415.MOV R1MS,A;重置16. BS WKREG,T1MS17.;;;;;;;此处填写1ms处理程序18.19.;;;;;;;;;;;;;;;;;;;;;;;;;;20. DJZ R20MS21.JMP INTEXT;22.MOV A,@2023.MOV R20MS,A;重置24.;;;此处填写1秒处理程序25. BS WKREG,T20MS26.;;;;;;;;;;;;;;27. DJZ R1S28.JMP INTEXT;29.MOV A,@5030.MOV R1S,A;31.;;;;;;;;;32.INC NUMBER33.MOV A,NUMBER34. SUB A,@1035. JBS SR,236.JMP INTEXT37.MOV A,@038.MOV NUMBER,A39.40.41. INTEXT:42.MOV A,TEMPA;43.RETI;;;;;;;;;;;;;;;;;;;;;44.45.46.47.48.49.;显示部分:50.51.;==============TXDATA==============52.TXDATA:53. BS P5,CC154.MOV A,@855.MOV DATALOP,A;56.TXLOP:57. BC WKREG,T500US58. BS P5,CLK;clk=高59.NOP;60.NOP61. JBS DATA_BUF,762.JMP $+363. BS P5,DATA;64.JMP $+265. BC P5,DATA66.DD1MS: JBS WKREG,T500US67.JMP $-168. BC P5,CLK69. BC WKREG,T500US70. JBS WKREG,T500US71.JMP $-1;72.RLC DATA_BUF73. DJZ DATALOP74.JMP TXLOP75.;;;;;;;;;;76. BC WKREG,T500US77. BS P5,CLK;clk=高78. BC WKREG,T500US79. JBS WKREG,T500US80.JMP $-1;81. BC P5,CLK82.;;;;;;;;83. BC P5,CC184.85.RET;;;;;;;86.87.;数据查表88.;===============DSPTBL============89.DSPTBL: ADD PC,A90. RETL @0B;091. RETL @0B;192. RETL @0B;293. RETL @0B;394. RETL @0B;495. RETL @0B;596. RETL @0B;697. RETL @0B;798. RETL @0B;899. RETL @0B;9100.101.102.;循环体部分;103.104.;;;;;;;;;;主程序;;;;;;;;;;;105.MLOOP:106.MOV A,NUMBER107.CALL DSPTBL108.MOV DATA_BUF,A109.CALL TXDATA110. BC WKREG,T1MS111. JBS WKREG,T1MS112.JMP $-1113.NOP;114.115.JMP MLOOP;;;;;;;;;;;;;;;;;;;;实例2在实际应用中驱动数码管常用的方式分动态扫描和静态驱动。
89c2051总共才有20个引脚所以在实现复杂功能的单片机应用中节约针脚的使用显得尤为重要我最近在做单片机项目时已开始客户要求的功能少所以采用89c2051的p1口直接驱动两个led数码管(外加两个扫描控制脚p3_3 p3_4)这样光显示部分就占用了9个脚开始的几个控制系统还可以满足需要可是后来客户要一次加三个功能1.水平开关输入2.缺水开关输入 3.状态报警输出因为之前做的程序20个脚正好全部用上所以这次再加功能再不更换单片机芯片的情况下就只能把显示电路改为其他方式考虑到成本问题采用常用的74ls164驱动led比较实用(74LS164 是TTL 八位串行入/并行输出移位寄存器)经过两天的研究现在终于完成了该项目的程序编写工作再此次编写过程中我发现网上讲的大多数都是74ls164 汇编程序的例子c语言的几乎没有所以在此奉上74ls164的c语言的源代码其中驱动共阴数码管和驱动共阳数码管时程序是不同的这一点其他地方还有书上并未明确说明所以在这要重点提一下。
c51源码和Proteus仿真程序下载请点击下面链接(压缩包包括共阴、共阳源文件及仿真文件)#include "reg52.h"#define uint unsigned int#define uchar unsigned charsbit DAT=P1^1;sbit CLK=P1^2;uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0xe7f,0xff,0x00};//0-9,-,全灭void sendbyte(uchar byte){uchar num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x01;CLK=1;num>>=1;}}void delay_50ms(unsigned int t){unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}main(){unsigned char h; while(1){for(h=0;h<10;h++){ delay_50ms(1); sendbyte(h); delay_50ms(10);}h=0;}。
74ls164 为8 位移位寄存器,其主要电特性的典型值如下:当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。
串行数据输入端(A,B)可控制数据。
当A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0 为低电平。
当A、B 有一个为高电平,则另一个就允许输入数据,并在CLOCK 上升沿作用下决定Q0 的状态。
引脚功能:CLOCK :时钟输入端CLEAR:同步清除输入端(低电平有效)A,B :串行数据输入端QA-QH:输出端极限值电源电压7V输入电压…… 5.5V工作环境温度74164….. -55~125℃74164…… -0~70℃储存温度….. -65℃~150真值表:时序图:建议操作条件:应用实例:C程序:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DAT=P2^3;//A,B端接一块后接入DATsbit CLK=P2^2;sbit WA1=P2^4;sbit WA2=P2^5;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; //共阴数码管无小数点void delayms(uint time){uchar i,k;for(k=time;k>0;k--)for(i=110;i>0;i--);}void sendchar(ch)uchar i;for(i=0;i<8;i++){CLK=0;DAT=ch&0x01;CLK=1;ch>>=1;}}void display(uint temp) {uint shi,ge;shi=temp/10;ge=temp%10;sendchar(table[shi]);WA1=0;W A2=1;delayms(1);WA1=1;sendchar(table[ge]);WA1=1;W A2=0;delayms(1);WA2=1; }void main(){while(1){display(12);}}。
中北大学课程设计说明书学生姓名: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等设计仿真软件。
74ls164 为8 位移位寄存器,其主要电特性的典型值如下:
当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。
串行数据输入端(A,B)可控制数据。
当A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0 为低电平。
当A、B 有一个为高电平,则另一个就允许输入数据,并在CLOCK 上升沿作用下决定Q0 的状态。
引脚功能:
CLOCK :时钟输入端
CLEAR:同步清除输入端(低电平有效)
A,B :串行数据输入端
QA-QH:输出端
极限值
电源电压7V
输入电压…… 5.5V
工作环境温度74164….. -55~125℃74164…… -0~70℃储存温度….. -65℃~150
真值表:
时序图:
建议操作条件:
应用实例:
C程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DAT=P2^3;//A,B端接一块后接入DAT
sbit CLK=P2^2;
sbit WA1=P2^4;
sbit WA2=P2^5;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; //共阴数码管无小数点void delayms(uint time)
{
uchar i,k;
for(k=time;k>0;k--)
for(i=110;i>0;i--);
}
void sendchar(ch)
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DAT=ch&0x01;
CLK=1;
ch>>=1;
}
}
void display(uint temp) {
uint shi,ge;
shi=temp/10;
ge=temp%10;
sendchar(table[shi]);
WA1=0;W A2=1;
delayms(1);WA1=1;
sendchar(table[ge]);
WA1=1;W A2=0;
delayms(1);WA2=1; }
void main()
{
while(1)
{
display(12);
}
}。