主要通過Protues和Keil聯合仿真
單片機源程序如下:
- #include <reg52.h>
- //#include <at89x52.h>
- //#include <keyscan.h>
- extern void scan_full(void);
- extern unsigned char key_scan(void);
- extern bit key_ok;
- unsigned char pwm_set,key_value;
- unsigned char count;
- sbit PWM=P3^6;
- bit up,down,set_flag;
- unsigned char code BCD[]={0x3f,0x06,0x5b,0x4f, //此處是將0-F轉換成相應的BCD碼
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- void delay1(unsigned char t)
- {
- while(t--);
- }
- void pwm(void) interrupt 5//定時器2產生PWM波形
- {
- TF2=0; //定時器2的溢出標志要軟件清除,
- //但當RCLK或TCLK為1時由硬件清除
- if((count>=pwm_set)&&(count<10))
- PWM=1;
- else PWM=0;
- count++;
- if(count==10)
- count=0x00;
-
- }
- void key_pwm(unsigned char x)//把鍵值轉化為PWM設置值
- {
- switch(x) //把矩陣鍵盤轉化為獨立鍵盤
- {
- case 1:up=1;break;
- case 2:down=1;break;
- case 3:set_flag=!set_flag;break;
- default:break;
- }
-
- if(up&&set_flag) //設置PWM參數:pwm_set
- {
- pwm_set++;
- up=0;
- if(pwm_set>=10)
- pwm_set=0x00;
- }
- if(down&&set_flag)
- {
- pwm_set--;
- down=0;
- if(pwm_set==0xff)
- pwm_set=9;
- }
- if(!set_flag)
- {
- up=0;
- down=0;
- }
- }
- void main(void)
- {
- TH2=0xb1; //定時20MS
- TL2=0xe0;
- RCAP2H=0xb1;//定時器2溢出時會把這個單元的內容送到TH2和TL2中
- RCAP2L=0xe0;
- EA=1;
- ET2=1;
- TR2=1;
- while(1)
- {
- scan_full(); //看是否有鍵按下
- if(key_ok) //有鍵按下,則判斷到底是哪個鍵按下
- {
- key_value=key_scan();//鍵值送key_value暫存
- P0=~BCD[key_value]; /*此三句是將鍵值顯示出來*/
- P2=0xfe; /** */
- delay1(200); /*************************/
- key_pwm(key_value); //調用鍵值轉PWM設置參數函數
- key_value=0x00; //清除鍵值,以免一次按下,多次響應
- }
- P0=~BCD[pwm_set]; /***此三句是將pwm_set值顯示出來*/
- P2=0xfd; /******* */
- delay1(200); /****************************/
- }
- }
復制代碼
所有資料51hei提供下載:
PWM調溫.zip
(55.67 KB, 下載次數: 3)
2020-7-2 10:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|