51单片机C语言如何实现8个流水灯左移三次,后右移三次;如此循环

51单片机C语言如何实现8个流水灯左移三次,后右移三次;如此循环,第1张

51单片机C语言实现循环8个流水灯左移三次,后右移三次。

例程:

#include<reg51h>  //51单片机头文件

#include <intrinsh> //包含有左右循环移位子函数的库

#define uint unsigned int    //宏定义

#define uchar unsigned char  //宏定义

sbit beep=P2^3;

void delay(uint z)  //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms

{                    //delay(500);大约延时500ms

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--);    

}

void main()            //主函数

{

    uchar a,i,j;

    while(1)        //大循环

    {

        a=0xfe;     //赋初值

        for(j=0;j<3;j++) for(i=0;i<8;i++)   //左移三次

        {

            P1=a;       //点亮小灯

            beep=0;     //开启蜂鸣器

            delay(50); //延时50毫秒

            beep=1;     //关闭蜂鸣器

            delay(50);  //再延时50毫秒

            a=_crol_(a,1); //将a变量循环左移一位

        }

        a=0x7f;

       for(j=0;j<3;j++) for(i=0;i<8;i++)  //右移三次

        {

            P1=a;       //点亮小灯

            beep=0;     //开启蜂鸣器

            delay(50); //延时50毫秒

            beep=1;     //关闭蜂鸣器

            delay(50);   //再延时50毫秒

            a=_cror_(a,1); //将a变量循环右移一位

        }        

    }

}

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。

可以实现,首先随便连接一个I/O口,P1/P2/P0均可,然后赋予一初值,然后使用本征函数_cror_(循环变量,循环次数)循环右移,或者循环左移实现。左移只需改掉本征函数,同时亮灭可以先给全1,然后给全0,中间加延时,自然得到需要的功能。

#include <reg51h> //包含头文件

#include <INTRINSH> //包含本征函数头文件

#define uint unsigned int //定义uint

#define uchar unsigned char //定义uchar

void delayms(uint n) //延时,n为多少延时多少ms

{

uint i;

for(;n>0;n--) //延时nms

for(i=121;i>0;i--) //12M晶振而言,延时1ms;

}

void main() //主程序

{

uint w=0xfe; //定义变量w为第一个灯点亮

while(1)

{

P0=w%256; //取出变量w的低八位89%10=9,89/10=8,2^8=256

delayms(500); //延时500ms

w=_irol_(w,1); //对双字节变量w循环左移1位

}

}

开始学习单片机的同学们写注意了,在运行程序后,现象不正确的时候,不要首先就找软件的错误,我的经验是从源头开始找问题,首先你得确定你的平台是正确的,

你说是按键没效果,先用万用表测试一下你的引脚的电平,是否被拉低了

如果按键没问题,你就检查_crol_(P0,1);这句,查一下头文件是否被包含,我个人建议自己作个移位函数

虽然程序中还有别的问题,但不会造成你一在按键没效果的现象!

如果你是想学硬件的人,你可以这么玩下去,如果你是想编程,建议你先写段时间(可能是很长时间)的C语言,至少能写个画形动画或是图书馆管理程序出来后再去学单片机吧,不然真心觉得你会学得很慢,而且进步很慢

先说第一个问题:

比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。

再说第二个问题:

比如说从p10口发送出去,则可以写为

sbitout=p1^0;//定义out为p10口,这样今后好写程序

chari;

for(i=0;i<8;i++)

{

out=data&0x80;//因为高位在前,将它写成二进制就明白了

data<<=1;

}

上面的程序就能搞定了;

应该是所有的单片机都有cy位(不知道浮点dsp有没有);

c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;

还有什么不明白的补充问题就是

C51单片机的循环左移函数是,_crol_(变量名,n),循环右移函数是,_cror_(变量名,n),函数中的“循环”是指变量的8位二进制数依次向左移一位,或向右移一位。

你比如的,取8位数,让1111 1110循环左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位数向左或向右移一位。继续移位,就会循环重复的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12182958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存