单片机实例——直流电机定时转向

#include<reg52.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit Lna = P1^0;
sbit Inb = P1^1;  //直流电机输入端

u8 code list[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                  0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

sbit LSA = P3^0;   //数码管的位选
sbit LSB = P3^1;
sbit LSC = P3^3;
#define DuanXaun P0  //数码管段选
#define led P2  //led灯

u8 flag=0;  //标志位

void delay(u16 n) //n=1,延时1ms
{
    u16 i,j; 
    for(i=n;i>0;i--) 
        for(j=114;j>0;j--);
}


void DigDisplay(u8 i) //数码管
{
    u8 j;
    switch(i){
        case 0: LSA=0;LSB=0;LSC=0;Lna=0;Inb=1;break;
        case 1: LSA=1;LSB=0;LSC=0;Lna=1;Inb=0;break;
        case 2: LSA=0;LSB=1;LSC=0;Lna=0;Inb=1;break;
        case 3: LSA=1;LSB=1;LSC=0;Lna=1;Inb=0;break;
        case 4: LSA=0;LSB=0;LSC=1;Lna=0;Inb=1;break;
        case 5: LSA=1;LSB=0;LSC=1;Lna=1;Inb=0;break;
        case 6: LSA=0;LSB=1;LSC=1;Lna=0;Inb=1;break;
        case 7: LSA=1;LSB=1;LSC=1;Lna=1;Inb=0;break;
    }
    for(j=0;j<10;j++){
        P0 = list[j];
        delay(100); 
    }
    flag++;//标志变化           
}

void led_Liu(u8 i)
{
    led=~(1<<i);//看最后注释
}

void main()
{   
    while(1){
        led_Liu(flag);
        DigDisplay(flag);
        if(flag==7) flag= 0;
    }   
}

//<<是按位左移运算,~是按位取反运算,=是赋值运算。
//P2=~(1<<i)的意思是把1换成二进制数,然后左移i位,再按位取非,将结果赋给P2,等价于P2=(~(1<<i))。
//比如i为3。那么P2= ~(1<<i) = ~(1<<3) 。
//先按1个字节来看,1的二进制为00000001,左移3位得到00001000。取反得到11110111,即十六进制的F7。
//如果整数为4个字节,那么P2= ~(1<<3) = 0xFFFFFFF7。
//****************************************************************************
//状态:数码管第一个亮9秒然后电机转向改变,第二个数码管再亮9秒,依次下去,电机转向每个都不一样,同时led灯会根据数码管切换



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值