實現功能:
旋轉編碼器按鍵:切換占空比和頻率數碼管顯示編碼器設置的占空比和頻率
單片機輸出根據編碼器設置的占空比和頻率的pwm信號
目前數碼管無法顯示編碼器的數據
電路原理圖如下:
0.png (46.86 KB, 下載次數: 57)
下載附件
2018-11-7 17:05 上傳
單片機源程序如下:
- #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)
2018-11-7 16:32 上傳
點擊文件名下載附件
請教一下大神
|