原理图
- include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- #include<intrins.h>
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- #define left 0
- #define right 1
- void switch_direction(u8 x);
- sbit k1=P3^2; //定义按键K1
- sbit k2=P3^3; //定义按键K2
- sbit k3=P3^5; //定义按键K2
- u8 xianshi[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- char i;
- u16 j,m,flag_led,s_key;
- #define LED P2
- void delay(u16 i)
- {
- while(i--);
- }
- void Int_Init() //中断配置 外部中断
- {
- //设置INT0
- IT0=1;//跳变沿出发方式(下降沿)
- EX0=1;//打开INT0的中断允许。
-
- //设置INT1
- IT1=1;//跳变沿出发方式(下降沿)
- EX1=1;//打开INT1的中断允许。
-
-
- EA=1;//打开总中断
- }
- //定时器0中断
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- }
- void TIM1init(void)
- {
- TMOD=0x21; //设置定时器1为工作方式2
- TH1=0xff; //装入初值
- TL1=0xff;
- EA=1; //开总中断
- ET1=1; //开定时器中断
- TR1=1; //启动定时器1
- }
- void main()
- {
- LED = 0XFF;
- flag_led = 0;
- s_key = right;
- Int_Init(); // 设置外部中断1
- Timer0Init();
- TIM1init();
- while(1)
- {
- if(flag_led == 0)
- {
- LED = xianshi[i];
- }
- else
- {
- LED = 0xff;
- }
- }
- }
- void Int0() interrupt 0 //外部中断0的中断函数
- {
- delay(1000); //延时消抖
- if(k1==0)
- {
- s_key = left;
- }
- }
- void Timer0() interrupt 1 //定时器1中断服务函数
- {
- static u16 j;
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- j++;
- if(j==1000)
- {
- j=0;
- switch_direction(s_key);
- }
- }
- void Int1() interrupt 2 //外部中断1的中断函数
- {
- delay(1000); //延时消抖
- if(k2==0)
- {
- s_key = right;
- }
- }
- void Timer1() interrupt 3 //定时器1中断服务函数
- {
- TH1=0xff;
- TL1=0xff;
- if(k3==0)
- {
- delay(1000);
- if(k3==0)
- {
- EX0 = ~EX0;
- EX1 = ~EX1;
- TR0 = ~TR0;
- flag_led = ~flag_led;
- }
- }
-
-
- }
- void switch_direction(u8 x)
- {
- if(x == 0)
- {
- i--;
- }
- else
- {
- i++;
- }
- if(i==8)
- {
- i = 0;
- }
- if(i == -1)
- {
- i = 7;
- }
- }
复制代码
|