完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`活动简介:
“每日一题”是XDLab推出的一项重要活动,每天早上8点我们会在QQ群:XDLab_1和XDLab_2内公布今天的“每日一题”的题目。大家可以根据自己的理解对题目迚行回答,也可以相互讨论,我们鼓励大家积极发言。然后当天晚上的时候我们会给出一个参考答案。在周日的时候,我们会将这一周的7个“每日一题”的题目以及参考答案汇总整理,上传至QQ群共享中,同时我们还会准备一定数量的纸质版放在店内供大家免费领取,先到先得。 活动目的在于通过“每日一题”让大家每天迚步一点点,增强大家的基础知识,提高大家对电子制作的兴趣。我们鼓励大家积极发言,如果丌懂、是菜鸟,请积极发问;如果懂、是大神,请慷慨解囊。 由于水平有限,如果您发现参考答案中有错误戒者有需要补充的,请将您的答案戒者建议发送至:xidianlab@126.com。同时如果您有什么好的问题,也可以将问题发送至邮箱:xidianlab@126.com。由XDLab发到群里,供大家一起讨论。 考虑到部分同学丌能及时的了解到QQ群内的动态,我们也会将每天的题目同步更新到人人网、微信平台、电子发烧友论坛上,欢迎大家持续关注。 (1) 人人主页:西电实验室 (2) 微信公众账号:xdlwelcom 扫描二维码,即可关注 ` |
|
相关推荐
5 个讨论
|
|
时间:2014.04.21 问题:分别使用定时器和延时函数实现数码管的动态扫描,并分析两种方法的区别。 解答: 51单片机本身资源较少,而使用延时函数是一种极其耗费资源的事情。使定时器则可以大大提高资源的利用率。 (1)用延时函数实现: 电路图: /*========================================================== * 开发人员:XXX * 当前版本:V1.0 * 创建时间:11/19/2013 * 修改时间: * 功能说明:让8个数码管同时显示数字1-8,显示方式为动态显示 *==========================================================*/ /*================(1)头文件、宏定义、变量定义及声明=======*/ #include /*数码管的相关变量和数组*/ ***it duxu=P3^4; //段选信号 ***it wexu=P3^5; //位选信号 unsigned char code table[]= { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; unsigned char code table1[]= { 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f }; /*================(2)函数声明===========================*/ void delay(unsigned int); /*================(3)主函数===========================*/ void main() { unsignedchar i; //定义循环变量 i=0; while(1) //让程序不停地执行次此循环 { wexu=1; P1=table1; //送位选数据 wexu=0; P1=0xff; //在送段选数据前关闭所有的显示,防止打开选时 duxu=1; //原来的位选数据通过锁存器造成乱码 P1=table[i+1]; //如果写成table的话,会显示0-7 duxu=0; delay(60); i++; if(i==8)i=0; //注意不要写成if(i==7) } } /*================(4)子函数声明===========================*/ /************************************************** *名称:delay(uint xms) *功能:延时函数,用来延迟时间 *入口参数:xms *出口参数:无 *说明:通过不断地执行空语句,来延迟时间(延时可以用延时语句,也可以用定时器产生中断来延迟时间,此例属于延时语句) *范例:void delay(uintxms); **************************************************/ void delay(unsigned int xms) //xms为形式参数 { unsigned int i; //循环变量,此处定义成unsignedint 或者unsigned char 均可,但是要注意变量的范围,如unsignedchar为0-255 for(i=xms;i>0;i--); //通过不断地执行空语句,来延迟时间 } (2)用定时器实现: 电路图: /*========================================================== * 开发人员:XXX * 当前版本:V1.0 * 创建时间:11/21/2013 * 修改时间: * 功能说明:用定时器中断实现数码管的动态扫描,大家可以对比用普通的delay()函数来实现动态扫描有什么区别 *==========================================================*/ #include ***it dula = P3^4; //段选 ***it wela = P3^5; //位选 unsigned char num1; //定义一个变量,用来对定时器中断进行计数 unsigned char code table1[]= //数码管(共阴)的段选编码,范围是0-F { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char code table2[]= //数码管的位选编码,范围是1-8 { 0xfe,0xfd,0xfb,0xf7, //例如0xfe=1111 1110 点亮第一个数码管 0xef,0xdf,0xbf,0x7f}; /*========================================================== *函数名称:Init() *功 能:对定时器进行初始化 *入口参数: *出口参数: *说 明:定时器0,工作方式为1 *==========================================================*/ void Init(){ TMOD = 0x01; // 定时器工作方式为1 TH0 = 63536/256; //赋初值,此处设定的中断时间为2ms,(65536-2000)/256 TL0 = 63536%256; EA = 1; //开总中断 ET0 = 1; //打开定时器0中断 TR0 = 1; //开启定时器}//主函数 void main(){ Init(); //初始化 while(1); //平时执行空循环 } /*========================================================== *函数名称:Timer0() *功 能:定时器中断服务内容 *入口参数: *出口参数: *说 明: *==========================================================*/ void Timer0() interrupt 1 //中断序号为1 { TH0= 63536/256; //每次中断发生后,先进行赋初值 TL0 = 63536%256; //以下部分为数码管的显示部分 P1=table1[num1+1]; //段选信号,将这一语句放在前面有消影的作用 dula=1; dula=0; P1=table2[num1]; //位选信号 wela=1; wela=0; num1++; //对定时器的中断进行计数,每中断一次,数码管更换一次内容 if(num1==8) num1=0; } |
|
|
|
|
|
时间:2014.04.22 问题:类似“P1=0xaa;dula=1;dula=0;”与“dula=1;P1=0xaa;dula=0;”语句,哪种数据 传输效果更好?为什么? 解答: 第一种数据传输效果更好。向锁存器传送数据的两种语句: ①: P1=0xaa; //传送数据 dula=1; //打开锁存器锁存端 dula=0; //关闭锁存器锁存端 ②: dula=1; //打开锁存器锁存端 P1=0xaa;//传送数据 dula=0; //关闭锁存器锁存端 锁存器锁存端打开后,随即开始接收数据,此时若P1口没有赋值我们想要传送的数据,则锁存器锁存端有可能接收到P1口原有错误的数据,直到P1口数据更新为预传送数据,这样便可能使得数据传输不稳定,尤其是在高速单片机中。这也是第②种写法不好的地方。如果我们用第①种写法,事先为P1赋值预传送数据,再打开锁存器锁存端,就保证了锁存器接收正确的数据,使数据传送更加稳定。此外在打开锁存端与关闭锁存端之间可适当延时,以保证数据接收完整。 |
|
|
|
|
|
时间:2014.04.23 问题:什么是指针,指针的优点有哪些? 解答: 计算机的内存是以字节为单位的一片连续的存储空间,计算机系统为每个内存单元都分配了编号,该编号就叫做内存地址(内存地址是连续的,并且用十六进制表示)。一块存储区的地址就是这个区域第一个字节的编号。操作系统就是通过这些地址来实现对内存的操作的。 1.指针其实就是一个变量,只不过普通变量包含的是一个真实的数据,而指针则像是指示器,告诉你内存的哪块区域可以找到数据。指针的声明方法如下所示: 2.指针的类型 *指针变量名; 3.指针的类型应该与指针所指向的数据的类型一致。其中“*”指出当前要声明的是一个指针而非普通变量。另外,指针的命应该遵循变量名的命名规范。 4.在程序中使用指针变量有以下好处: 5.可以提高程序的编译效率和执行速度。 6.能够实现动态的存储分配。 7.通过指针可以实现主调函数和被调函数的之间的变量共享,以便于双向的数据通信。 8.可以指向各种数据结构,有助于编写高质量代码。 9.定义指针变量的实例如下: int *Pt //定义整型的指针变量 char *pp //字符型的指针变量 |
|
|
|
|
|
时间:2014.04.25 问题:线程与进程的区别 解答: 学习电脑和编程语言就会遇到进程和线程,初学者往往会在此陷入迷茫和纠结中。其实弄清这两个概念不是很难。从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。 1.进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。 [url=http://jingyan.baidu.com/album/624e74598efcc834e9ba5a66.html?picindex=2] 2.进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。 3.通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发 执行的程度。 4.线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。 [url=http://jingyan.baidu.com/album/624e74598efcc834e9ba5a66.html?picindex=5] 5. 线程与进程的区别归纳: a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。 b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。 c.调度和切换:线程上下文切换比进程上下文切换要快得多。 d.在多线程OS中,进程不是一个可执行的实体。 [url=http://jingyan.baidu.com/album/624e74598efcc834e9ba5a66.html?picindex=7][/url] 6.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调 度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存 器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 22:09 , Processed in 0.422927 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号