- ///////////////////////////////////////////////////
- //
- //硬件配置: P00~P07=LED1~LED8,
- // P27~P20=LED9~LED16,
- // INT0=Hall IC
- //
- // Crystal: 11.0592M
- ///////////////////////////////////////////////////
- #include <reg51.h>
- #include <string.h>
- //STC系列特殊寄存器
- sfr AUXR = 0x8e ;//bit7~0 : T0x12 T1x12 UART_M0x6 EADCI , ESPI ELVDI - -
- sfr P1M0 = 0x91;
- sfr P1M1 = 0x92;
- sfr P2M0 = 0x95;
- sfr P2M1 = 0x96;
- sfr P3M0 = 0xb1;
- sfr P3M1 = 0xb2;
- unsigned int Font[3][16]=//赛先生
- {
- {0x1010,
- 0x6110,
- 0x4120,
- 0x5541,
- 0x550F,
- 0x7F42,
- 0x5542,
- 0xD55C,
- 0x5542,
- 0x7F42,
- 0x55F9,
- 0x5541,
- 0x4120,
- 0x5130,
- 0x6020,
- 0x0000
- },
- {0x0000,0x0A08,0x7210,0x2260,0x2380,0x2200,0xFE00,0x2200, 0x23F0,0x2208,0x2208,0x0208,0x0230,0x0000,0x0000,0x0000},
- {0x0408,0x1808,0xF108,0x1108,0x1108,0x1108,0xFFF8,0x1108, 0x1108,0x1108,0x1108,0x1008,0x0008,0x0000,0x0000,0x0000}
- };
- unsigned char MASK_1BIT_ON[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- unsigned int ReverseHighByteOrder(unsigned int a)
- {
- unsigned char c,i;
- unsigned int b;
- b=(a>>8)&0x00ff;//b=调换之前的high字节
- c=0;//c=调换之后的字节
- for(i=0;i<8;i++)
- {
- if(MASK_1BIT_ON[i]&b)
- c=c|MASK_1BIT_ON[7-i];
- }
- b=c;
- b=(b<<8)&0xff00;
- b=b+(a&0x00ff);
- return b;
- }
- unsigned int ReverseLowByteOrder(unsigned int a)
- {
- unsigned char b,c,i;
- b=a&0xff;//b=调换之前的低字节
- c=0;//c=调换之后的低字节
- for(i=0;i<8;i++)
- {
- if(MASK_1BIT_ON[i]&b)
- c=c|MASK_1BIT_ON[7-i];
- }
- a=a&0xff00;
- a=a+c;
- return a;
- }
- void Delay_ms(ms)
- {
- int i,j;
- for(i=0;i<ms;i++)
- {
- for(j=0;j<10;j++)
- {}
- }
- }
- char HallIC_Coming;//是否是Hall IC碰到磁场
- int Timer0_Cnt;//Timer0中断计数
- ///////////////////////////////////////////////////
- //
- //主函数
- //
- ///////////////////////////////////////////////////
- void main()
- {
- int i;
- for(i=0;i<16;i++)
- {
- Font[0][i]= Font[0][i]^0xffff;//反相
- // Font[0][i]=ReverseLowByteOrder(Font[0][i]);//低字节的bit0~7修改为bit7~0
- Font[0][i]=ReverseHighByteOrder(Font[0][i]);//高字节的bit0~7修改为bit7~0
- }
- //Test
- P0=0x00;//全部打开LED
- P2=0x00;
- Delay_ms(1000);
- P2=0xff;
- //Timer0的设置
- TR0 = 1; //timer0启动
- ET0 = 1; //timer0中断
- TMOD |= 0x01; //timer0设置为mode1
- TH0=TL0=0;
- EX0 = 1;
- EA = 1;
- //计算电机旋转速度
- /* Timer0_Cnt=0;
- HallIC_Coming=0;
- for(i=0;i<100;i++)
- {
- while(HallIC_Coming==0);
- HallIC_Coming=0;
- }
- */ TR0=0;
- ET0=0;
-
-
- ////////////////////////////
- //正式开始
- HallIC_Coming=0;
- while(1)
- {
-
- if(HallIC_Coming)//等待Hall IC触发的中断
- {
- //处理
- for(i=0;i<16;i++)
- {
- P2=Font[0][i]&0xff;
- P0=(Font[0][i]>>8)&0xff;
- Delay_ms(5);
- }
- ////////////////////////////
- P0=P2=0xff;
- HallIC_Coming=0;
- }
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////
- //
- //外部中断0 (INT0,由Hall IC输出脚触发)
- //
- ////////////////////////////////////////////////////////////////////////////////////////
- void ISR_INT0(void) interrupt 0
- {
- HallIC_Coming=1;
- }
- //Timer0中断
- void ISR_Timer0(void) interrupt 1
- {
- Timer0_Cnt++;
- }
复制代码 |