|
實(shí)現(xiàn)功能:
旋轉(zhuǎn)編碼器按鍵:切換占空比和頻率數(shù)碼管顯示編碼器設(shè)置的占空比和頻率
單片機(jī)輸出根據(jù)編碼器設(shè)置的占空比和頻率的pwm信號(hào)
目前數(shù)碼管無法顯示編碼器的數(shù)據(jù)
電路原理圖如下:
0.png (46.86 KB, 下載次數(shù): 57)
下載附件
2018-11-7 17:05 上傳
單片機(jī)源程序如下:
- #include "STC15F2K60S2.H"
- #include "intrins.h"
- //++++++++++++++pwm輸出
- #define uchar unsigned char// 0~255,1Byte
- #define uint unsigned int//0~65535,2Byte
- //==變量類型定義區(qū)
- 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};//八個(gè)數(shù)碼管定義
- uchar disp_flag[]={0,0,0,0,0,0,0,0};//八個(gè)數(shù)碼管對(duì)應(yīng)標(biāo)記
- //==位變量區(qū)
- bit set_flag=0;//按鍵設(shè)置標(biāo)記
- //===硬件線路定義
- sbit ECE=P5^5;//編碼器按鍵 ECA
- sbit ECA=P3^2;//編碼器A相
- sbit ECB=P4^0;//B相
- sbit PWM=P3^6;//pwm輸出
- sbit KEY1=P2^6;//預(yù)留
- sbit KEY2=P2^7;//預(yù)留
- //==函數(shù)聲明區(qū)(函數(shù)清單)
- void display();//函數(shù)
- void disp_suju();//顯示緩沖區(qū)函數(shù)
- void delayms(uchar count);//延時(shí)函數(shù)
- void timer0_init();//定時(shí)器初始化函數(shù)
- void k1();//編碼器按鍵ECA
- void INT_init (void);//外部中斷0
- void dutyANDf(duty,rate);//占空比調(diào)節(jié)函數(shù)
- //===主函數(shù)
- void main()
- {
- while(1)
- {
- timer0_init();//定時(shí)器函數(shù)
- dutyANDf(duty,rate);
- display();
- k1();
- INT_init ();
-
- }
- }
- //==顯示函數(shù)定義
- 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;//關(guān)閉led電源
- }
- }
-
- //顯示數(shù)據(jù)準(zhǔn)備
- void disp_suju()//時(shí)鐘程序緩存函數(shù)
- {
- 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;//頻率個(gè)
- disp_buffer[7]=11;//H
- }
- void delayms(uchar count)//延時(shí)
- {
- 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;//下降沿觸發(fā)
-
- }
- void exint0() interrupt 0
- {
- if(ECB==0)
- {//正
- if(set_flag==1)//占空比標(biāo)志
- {
- 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)//占空比標(biāo)志
- {
- 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;
-
- }
-
- }
復(fù)制代碼
所有資料51hei提供下載:
編碼.rar
(7.93 KB, 下載次數(shù): 77)
2018-11-7 16:32 上傳
點(diǎn)擊文件名下載附件
請(qǐng)教一下大神
|
|