#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灯会根据数码管切换
单片机实例——直流电机定时转向
最新推荐文章于 2023-06-24 19:28:30 发布