实现功能:
旋转编码器按键:切换占空比和频率数码管显示编码器设置的占空比和频率
单片机输出根据编码器设置的占空比和频率的pwm信号
目前数码管无法显示编码器的数据
电路原理图如下:
单片机源程序如下:
- #include "STC15F2K60S2.H"
- #include "intrins.h"
- //++++++++++++++pwm输出
- #define uchar unsigned char// 0~255,1Byte
- #define uint unsigned int//0~65535,2Byte
- //==变量类型定义区
- uchar duty=111;//占空比8bit
- uchar rate=11;//频率
- uchar ratex=0;//显示"H"
- uchar disp_buffer[]={1,1,1,10,10,1,1,11};//显示缓冲定义
- uchar led_code[]={0xc0,0xf9,0xa4,0xb0,0x98,0x92,0x82,0xf8,0x80,0x90,0xbf,0x89};//显示0-9定义
- uchar position[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八个数码管定义
- uchar disp_flag[]={0,0,0,0,0,0,0,0};//八个数码管对应标记
- //==位变量区
- bit set_flag=0;//按键设置标记
- //===硬件线路定义
- sbit ECE=P5^5;//编码器按键 ECA
- sbit ECA=P3^2;//编码器A相
- sbit ECB=P4^0;//B相
- sbit PWM=P3^6;//pwm输出
- sbit KEY1=P2^6;//预留
- sbit KEY2=P2^7;//预留
- //==函数声明区(函数清单)
- void display();//函数
- void disp_suju();//显示缓冲区函数
- void delayms(uchar count);//延时函数
- void timer0_init();//定时器初始化函数
- void k1();//编码器按键ECA
- void INT_init (void);//外部中断0
- void dutyANDf(duty,rate);//占空比调节函数
- //===主函数
- void main()
- {
- while(1)
- {
- timer0_init();//定时器函数
- dutyANDf(duty,rate);
- display();
- k1();
- INT_init ();
-
- }
- }
- //==显示函数定义
- void display()
- { uchar i;
- disp_suju();
- for(i=0;i<8;i++)
- {
- P2=led_code[disp_buffer[i]];
- P0=position[i];
- delayms(1);
- P2=0xff;//熄灭led
- P0=0xff;//关闭led电源
- }
- }
-
- //显示数据准备
- void disp_suju()//时钟程序缓存函数
- {
- disp_buffer[0]=duty/100;//占空比百
- disp_buffer[1]=duty%100/10;
- disp_buffer[2]=duty%10;
- disp_buffer[3]=10;//-
- disp_buffer[4]=10;//-
- disp_buffer[5]=rate/10;//频率十
- disp_buffer[6]=rate%10;//频率个
- disp_buffer[7]=11;//H
- }
- void delayms(uchar count)//延时
- {
- uchar i,j;
- for(i = 0; i < count; i++)
- for(j = 0; j < 120; j++);
- }
- void k1()
- {
-
- if(ECE==0)
- {//有按键
- set_flag=0;//频率
-
- }
- else
- {
- set_flag=1;//占
-
- }
- }
- void INT_init(void)
- {
- EA = 1;
- EX1 = 1;
- EX0 = 1;
- IT1 = 1;//下降沿触发
-
- }
- void exint0() interrupt 0
- {
- if(ECB==0)
- {//正
- if(set_flag==1)//占空比标志
- {
- duty++;
- if(duty==255)
- {
- duty=255;
- }
- else{;}
- display();
- }
- else
- {
- rate++;
- if(rate==20)
- {
- rate=20;
- }
- else{;}
- }
- }
- else
- {
- //反ecb==1
- if(set_flag==1)//占
- {duty--;
- if(duty==1)
- { duty=1;
- }else{;}
-
- }
- else
- {
- rate--;
- if(rate==1)
- {
- rate=1;
- } display();
- }
- }
- }
- void Timer0Init(void) //50??@12.000MHz
- {
- AUXR &= 0x7F;
- TMOD &= 0xF0;
- TL0 = 0xB0;
- TH0 = 0x3C;
- TF0 = 0;
- TR0 = 1;
- }
- //-------------------------------------
- void timer0_int() interrupt 1
- {
- if(ECA==0){
- if(ECB==0)
- {//正
- if(set_flag==1)//占空比标志
- {
- duty++;
- if(duty==255)
- {
- duty=255;
- }
- else{;}
- display();
- }
- else
- {
- rate++;
- if(rate==20)
- {
- rate=20;
- }
- else{;}
- }
- }
- else
- {
- //反ecb==1
- if(set_flag==1)//占
- {duty--;
- if(duty==1)
- { duty=1;
- }else{;}
-
- }
- else
- {
- rate--;
- if(rate==1)
- {
- rate=1;
- } display();
- }
- }
- }else{;
- }
- }
- void dutyANDf(uchar duty,uchar f)
- {
- int Xt1,Xt0;
- float t1,t0;
- uchar h1,l1,h0,l0;
- t1=duty/f;
- t0=(1/f)-t1;
- Xt1=256-1000000*t1;
- Xt0=256-1000000*t0;;
- TMOD=0X01;
- TR0=1;
- h1=(uchar)(Xt1>>4);
- h0=(uchar)(Xt0>>4);
- l0=(uchar)Xt0;
- while(1)
- {
- TH0=h1;
- TL0=l1;
- do{}while(!TF0);
- PWM=!PWM;
- TF0=0;
- TH0=h0;
- TL0=l0;
- do{}while(!TF0);
- PWM=1;
- TF0=0;
-
- }
-
- }
复制代码
所有资料51hei提供下载:
编码.rar
(7.93 KB, 下载次数: 77)
|