2018-04-03 20:47:34 jiayoudangdang 阅读数 2180
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2487 人正在学习 去看看 朱有鹏

为何单片机的程序必须是死循环?!!

这个问题困扰了我好久,然而答案却是这个样子的!

单片机没有操作系统,不像电脑有Windows,程序运行与结束有操作系统管理。单片机的程序是不能结束的,否则会使单片机系统出现不确定的状态;
一般编译会自己加上
如果汇编写,一般不用做循环 
2003-05-26 12:14:00 setcdq9801 阅读数 2481
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2487 人正在学习 去看看 朱有鹏

首先声明:我学习单片机C语言还不到半年,所以我还是菜鸟,我贴出的东西或许你们都知道,但我只想把我学习的经历给记录下来,希望你能找到你所想要的.
 我记得做学单片机做的第一个实验就是做循环彩灯的实验,如果用汇编RL和RR很容易实现循环移位,但是C语言编程的移位指指令不能循环,移了后以0填充。
如果用C实现循环移位呢?
我的思路是:
比如将a=0x45循环左移二位。
a循环左移n位,即将原来右面(8-n)位左移n位,而将原来左端的n位移到最右面n位。
1、将a的左端n位先放到b中的高n位中
b=>>(8-n);
2、将a左移n位,其右面高n位被补0
c=<<n;
3、将b,c进行或运算
a=c|b;
程序如下:
main()
{
 unsigned char a=0x45,b,c;
 unsigned int n=2;
 b=a>>(8-n)
 c=a<<n;
 a=c|b;
}
记得我才学单片机的时候做的第一个实验就是循环彩灯(那时候用的汇编)
学单片机C语言的时候,第一个实验当然也就是循环彩灯了,C没有直接循环移位的指令没关系,用上面的语句即可实现。:)
2012-12-10 08:50:27 zhangxxxww 阅读数 1510
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2487 人正在学习 去看看 朱有鹏
while(1)在程序运行中的作用,这个循环看起来或许是非常的简单,困扰了我两天的时间,我在写中断程序时,数码管显示段选送来的数据,不显示又中断送来的数据,如果的main()函数中不加入这个程序,程序就会反复在main中运行,不会进入中断程序。因此在写单片机程序时,要想实现循环显示while是必不可少的。在中断程序中更为重要。
2012-10-31 19:48:19 Jcy8126 阅读数 15397
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2487 人正在学习 去看看 朱有鹏

51单片机之循环移位函数

今天在看书的时候看到了循环移位函数,想跟大家分享下,呵呵,大牛们不要嘲笑,由于本人刚起步,莫笑。

如果你使用keil软件编写C51程序的话,那么你可以打开Keil下的C51下的HLP文件,里面有个C51lib文件,这是个帮助文件。在这个文件里面就有关于移位函数的原型。

之前,如果我想移位的话(做流水灯的程序时),我会 P2 = (P2 << 1) | 1;你会发现后面需要或上一个1,以控制补0带来的麻烦。不过在移位函数中是可以不需要的,它自动补1。

下面来介绍下这俩个移位函数--_crol_与_cror_(包含在头文件intrins.h中)

_crol_:

比如,移位前是:01110110,那么移位后便是11101100。这个意思就是整体左移一位,之后将原本的首位移到最后一位。

_cror_:

比如,移位前是:01110110,那么移位后便是00111011。道理跟上面的相似。

附上一个简单的程序以说明问题:

#include
#include

#define uint unsigned int
#define uchar unsigned char

void delay(uchar);

uchar temp;

void main()
{
    temp = 0xfe;
    while(1)
    {
        P1 = temp;
        delay(100);
        temp = _crol_(temp,1);
    }
}

void delay(uchar time)
{
    uchar i,j;
    for(i = time;i > 0;--i)
        for(j = 110;j > 0;--j);
}


2014-06-12 22:37:27 To_Be_IT_1 阅读数 5293
  • 单片机有很多种-1.3.第1季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第3个课程,主要讲了单片机的发展史,各种主流单片机的各自特点,STC51单片机的各系列的特点以及项目中如何选型主控单片机。

    2487 人正在学习 去看看 朱有鹏

引言:


       单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。


两者区别:


        区别一

        for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。

        while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。

        区别二

        同样的代码,编译出的程序代码大小不同。


示例分析:


for.c源码:

#include <stdio.h>

int main(void)
{
	for(;;){
		printf("123\n");
	}

	return 0;
}

while.c源码:

#include <stdio.h>

int main(void)
{
	while(1){
		printf("123\n");
	}

	return 0;
}

汇编上面的两个程序发现它们的汇编源码完全相同

	.file	"while.c"
	.section	.rodata
.LC0:
	.string	"123"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	subl	$16, %esp
.L2:
	movl	$.LC0, (%esp)
	call	puts
	jmp	.L2
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1"
	.section	.note.GNU-stack,"",@progbits
这样看来两者似乎没有任何区别,其实不然,编译生成程序的大小不同

-rwxr-xr-x 1 book book 8296 2014-06-12 22:32 for
-rwxr-xr-x 1 book book 8298 2014-06-12 22:33 while




单片机 循环流水灯

阅读数 1754

没有更多推荐了,返回首页