历史上的今天
返回首页

历史上的今天

今天是:2025年12月07日(星期日)

正在发生

2022年12月07日 | Proteus入门单片机(3)例程分析

2022-12-07 来源:zhihu

74HC573详解:

/*

调试环境:Proteus 7.8  AT89S52单片机  8位共阴数码管

功能为:实现数码管1秒~99秒倒计时,    12M晶振

*/


#include

#define uchar unsigned char

sbit LED1=P1^1;                           //连的是LED1

#define MAX_NUM     13                //最大倒计时数1~99可设

#define SEGPORT         P0           //定义数码管连接端口

sbit LE_DUAN         = P2^0;           //定义573锁存使能端口 段锁存

sbit LE_WEI         = P2^1;           //定义573锁存使能端口 位锁存


unsigned char code Seg_Duan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管显示段码值 0~9

unsigned char code Seg_Wei[]  = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                 //数码管的位码,低电平有效。


static uchar second=MAX_NUM,count;    //99只是一个数,可以任意改,因为这里只学习怎样实现倒计时


uchar shiwei;

uchar gewei;


void delay(unsigned int cnt)

{

        while(--cnt);

}


void main()

{

        TMOD|=0x01;       //定时器设置 16位

        TH0=(65536-50000)/256;  //定时时间   50ms

        TL0=(65536-50000)%256;

        EA=1;

        ET0=1;

        TR0=1;

        SEGPORT = 0;//P0等于0,段码位码均为零

        LE_DUAN = 0;//74HC573锁

        LE_WEI = 0;//74HC573锁

        while(1)

        {

                shiwei=second/10;  //数码管10位

                gewei=second%10;   //数码管个位

                       //下面四句送段码,

                SEGPORT=0;    //清空数据,防止有交替重影

                LE_DUAN=1;      //段锁存

                LE_DUAN=0;

                delay(30);


                SEGPORT = Seg_Wei[1];     //先送位码值

                LE_WEI = 1;           //573高电平锁存

                LE_WEI = 0;

                SEGPORT = Seg_Duan[shiwei];    //再送段码值,这里为 2~9

                LE_DUAN = 1;                //573高电平锁存

                LE_DUAN = 0;

                delay(300);



                SEGPORT = Seg_Wei[0];           //先送位码值

                LE_WEI = 1;           //573高电平锁存

                LE_WEI = 0;

                SEGPORT = Seg_Duan[gewei]; //再送段码值,这里为 2~9

                LE_DUAN = 1;                //573高电平锁存

                LE_DUAN = 0;

                delay(300);

        }

}


void tim(void) interrupt 1    //定时器0中断    

{

        TH0=(65536-50000)/256;     //定时时间   50ms

        TL0=(65536-50000)%256;

        count++;

    if(count==20)     //50毫秒定时,50*20=1000(毫秒)=1秒

    {

       count=0;

       second--;

       if(second==0xff)/*无符号char型数值,-1为:0xff,0之后,显示最大倒计数。*/

       {

         LED1=~LED1;      //这里让LED1反转一下,表现倒计时一周。

         second=MAX_NUM;   //回到最大倒计数值,再次倒计,当然,可以加入其他的控制

       }

         

    }

}


分析:在死循环里,一直重复着以下三个操作

第一:分离second的十位和个位,消隐

第二:十位送到十位

第三:个位送到个位


什么导致second的变化?

答:通过定时器与中断,在定时时间到在中断子程序中改变计数值。


实验有什么问题?

首先硬件连接了8颗LED,这里只用了一颗,动态数码管也没有发挥他的功能,然后在进中断时程序的位置无法确定,不能做到精准倒计时。


如何改进?

使用38译码器可以进一步节省代码,将led改为静态数码管可以记录倒计时次数。


学到了什么?

74HC573可以用来控制动态数码管,38译码器可以节省引脚。


推荐阅读

史海拾趣

ETI Systems公司的发展小趣事

ETI Systems一直将产品品质视为企业的生命线。公司严格把控从原材料采购到产品生产的每一个环节,确保每一件产品都符合高标准的质量要求。正是这种对品质的执着追求,让ETI Systems的产品在市场上赢得了良好的口碑和广泛的认可。同时,公司也建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。

ABECO公司的发展小趣事

在1950年代的英国,ABECO的创始人凭借对电子行业的热爱和对手工工具的独特见解,开始了他的创业之路。初创时期,资金匮乏,人员稀少,但创始人凭借着对品质的执着和对创新的追求,不断研发出满足市场需求的高质量工具。他亲自走访客户,了解需求,不断完善产品,逐渐在电子行业中树立起了良好的口碑。

Free2Move公司的发展小趣事

在1950年代的英国,ABECO的创始人凭借对电子行业的热爱和对手工工具的独特见解,开始了他的创业之路。初创时期,资金匮乏,人员稀少,但创始人凭借着对品质的执着和对创新的追求,不断研发出满足市场需求的高质量工具。他亲自走访客户,了解需求,不断完善产品,逐渐在电子行业中树立起了良好的口碑。

BETA Transformer Technology Corp公司的发展小趣事

BETA Transformer Technology Corp公司在成立初期就凭借其创新性的变压器技术,在电子行业中崭露头角。公司研发团队不断突破传统变压器的设计局限,推出了一系列高效、稳定的变压器产品,赢得了客户的广泛认可。随着市场需求的不断增长,BETA公司逐渐扩大了生产规模,提高了产能,成为行业内的领军企业。

Edsun Laboratories Inc公司的发展小趣事

面对日益严重的环境问题,ECM Electronics Limited.积极响应国家节能减排的号召,将绿色发展和可持续发展作为企业的重要战略。公司采用环保材料和节能技术,降低产品能耗和排放。同时,公司还积极参与环保公益活动,推动行业绿色发展。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

Helium_Systems__Inc.公司的发展小趣事

在20世纪90年代初,一家名为“海曼电子”(虚构名称,类似HEIMANN发音)的初创公司在德国慕尼黑成立。创始人海曼博士凭借其在半导体材料领域的深厚研究背景,带领团队成功研发出了一种新型高效能传感器芯片。这种芯片在温度测量领域表现出色,迅速获得了市场的认可。随着技术的不断迭代,海曼电子逐渐在传感器市场占据了一席之地,并通过持续的技术创新,将产品线扩展至光电子、汽车电子等多个领域。

问答坊 | AI 解惑

开关稳压电源(2007电子设计竞赛 E题)(内附论文和PCB图)

本帖最后由 paulhyde 于 2014-9-15 03:28 编辑 这是我去年作的,还请多多指教~!    …

查看全部问答>

硬件汉字库使用原理

硬件汉字库使用原理…

查看全部问答>

我在写辞职,被老板拒绝

本信息来自合作QQ群:AVR单片机学习与交流群(17727270) 群管理员在坛子里的ID:铜河 我在写辞职,被老板拒绝…

查看全部问答>

见笑了,愚笨的问题。

低碳,环保等理念,加速了LED的发展,那么它表现在哪些方面呢?国内外LED的发展将带动哪些行业的发展?…

查看全部问答>

基于ARM的DIS采集系统设计

0 引言   数字化信息系统实验室(Digital Information System,DIS)是新一代的中小学实验教学系统,是先进的数字技术应用到实验教学的产物,也是探究、创新的实验教学新理念注入传统实验教学后的必然结果。2006年,教育部将DIS纳入了中小学实验仪 ...…

查看全部问答>

关于WinCE Flash播放器

有没有开源的解码器,或者比较好的实现方法?各位大侠指导一下。…

查看全部问答>

Flash与S3C44B0X连接时地址线为什么要偏移一位,对应的代码也不甚清楚,劳烦各位大侠给看看。小弟先在此谢过了。

Flash与S3C44B0X连接时地址线为什么要偏移一位,对应的代码也不甚清楚,劳烦各位大侠给看看。小弟先在此谢过了。 Flash与S3C44B0X的接口电路图如图2所示。处理器ADDR20~1对应着Flash ROM的A19~0,偏移了1位,这是由于S3C44B0X是按照字节编址的, ...…

查看全部问答>

求助:8051串口 中断接收 查询发送 数据丢失

用C8051F020与PC机之间串口通讯. 单片机用中断方式接收数据,用查询方式发送数据. 我的程序是为了实现:定义5字节数据为一帧,PC机向单片机发送数据,当数据到达一帧(5个字节)的时候,单片机向PC机将这一帧数据发送出去. 我用了2个BUFF,第1个BUFF用于 ...…

查看全部问答>

关于wince的Alph的问题?

wince下的IE不能够支持Alpha吗?我想实现一些简单的特效,比如,淡出,渐显等图片效果,如何实现啊? …

查看全部问答>

用C语言给51单片机编程时,怎么给外部单元的地址赋值(单片机的指针问题)

初学51单片机,有些问题请教! 我知道在标准c语言里面是不能给指定的一个地址单元赋值的,但是不知道单片机这里能不能这样。 问题1:keil c51中怎么才能使用DPTR寄存器?用keil时包含后我可以使用DPH和DPL但是不能使用DPTR,难道单片机的 ...…

查看全部问答>