使用proteus進(jìn)行仿真:運(yùn)用單片機(jī)(AT89C52、STM32、MSP430等)控制實(shí)現(xiàn)PWM輸出經(jīng)驅(qū)動(dòng)芯片后驅(qū)動(dòng)電機(jī),(驅(qū)動(dòng)自選) 需實(shí)現(xiàn)以下功能: 1、pwm頻率為1KHz,初始占空比50% 2、PWM輸出占空比可調(diào) 3、可控制兩個(gè)電機(jī)同時(shí)正轉(zhuǎn)、反轉(zhuǎn)、一正一反; (可實(shí)物,提供所需器材)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (375.22 KB, 下載次數(shù): 33)
下載附件
2023-7-9 00:34 上傳
1.png (74.34 KB, 下載次數(shù): 23)
下載附件
2023-7-8 22:56 上傳
單片機(jī)源程序如下:
- #include<reg52.h> // 引入STC89C52頭文件
- #define uint unsigned int // 定義無(wú)符號(hào)整型變量
- #define uchar unsigned char // 定義無(wú)符號(hào)字符型變量
- uchar time, count = 50, flag1 = 1, flag2 = 1; // 定義變量
- uchar seg[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39}; // 數(shù)碼管顯示字符
- sbit PWM1 = P3^0; // PWM 輸出引腳 1
- sbit PWM2 = P3^1; // PWM 輸出引腳 2
- sbit PWM3 = P3^2; // PWM 輸出引腳 3
- sbit PWM4 = P3^3; // PWM 輸出引腳 4
- sbit key_add = P2^3; // 增加按鍵
- sbit key_dec = P2^4; // 減少按鍵
- sbit key_turn1 = P2^5; // 旋轉(zhuǎn)按鍵 1
- sbit key_turn2 = P2^6; // 旋轉(zhuǎn)按鍵 2
- sbit RS = P3^5; // LCD 控制引腳 RS
- sbit RW = P3^6; // LCD 控制引腳 RW
- sbit E = P3^7; // LCD 控制引腳 E
- // 延時(shí)函數(shù)
- void delayxms(uint z);
- // 旋轉(zhuǎn)按鍵1的處理函數(shù)
- void Motor_turn1();
- // 旋轉(zhuǎn)按鍵2的處理函數(shù)
- void Motor_turn2();
- // 增加按鍵的處理函數(shù)
- void Motor_add();
- // 減少按鍵的處理函數(shù)
- void Motor_dec();
- // 定時(shí)器0的初始化函數(shù)
- void timer0_init();
- // 定時(shí)器1的初始化函數(shù)
- void timer1_init();
- // 向LCD發(fā)送命令
- void w_com(uchar j);
- // 向LCD發(fā)送數(shù)據(jù)
- void w_dat(uchar j);
- // 初始化LCD
- void lcd_init();
- void main()
- {
- uint mm, nn;
- lcd_init();
- timer0_init();
- timer1_init();
- while (1)
- {
- Motor_turn1();
- Motor_turn2();
- Motor_add();
- Motor_dec();
- w_com(0x80);
- w_dat('d');
- w_dat('u');
- w_dat('t');
- w_dat('y');
- w_dat(' ');
- w_dat('r');
- w_dat('a');
- w_dat('t');
- w_dat('i');
- w_dat('o');
- w_dat(':');
- w_com(0xc7);
- mm = seg[count/10];
- nn = seg[count%10];
- w_dat(mm);
- w_dat(nn);
- w_dat('%');
- }
- }
- // 延時(shí)函數(shù),延時(shí)z毫秒
- void delayxms(uint z)
- {
- uint x, y;
- for (y = z; y > 0; y--)
- for (x = 110; x > 0; x--);
- }
- // 處理旋轉(zhuǎn)按鍵1
- void Motor_turn1()
- {
- if (key_turn1 == 0)
- {
- delayxms(2);
- if (key_turn1 == 0)
- {
- flag1 = ~flag1;
- }
- while (!key_turn1);
- }
- }
- // 處理旋轉(zhuǎn)按鍵2
- void Motor_turn2()
- {
- if (key_turn2 == 0)
- {
- delayxms(2);
- if (key_turn2 == 0)
- {
- flag2 = ~flag2;
- }
- while (!key_turn2);
- }
- }
- // 處理增加按鍵
- void Motor_add()
- {
- if (key_add == 0)
- {
- delayxms(2);
- if (key_add == 0)
- {
- count += 5;
- if (count >= 100)
- {
- count = 0;
- }
- }
- while (!key_add);
- }
- }
- // 處理減少按鍵
- void Motor_dec()
- {
- if (key_dec == 0)
- {
- delayxms(2);
- if (key_dec == 0)
- {
- count -= 5;
- if (count >= 100)
- {
- count = 0;
- }
- }
- while (!key_dec);
- }
- }
- // 定時(shí)器0初始化
- void timer0_init()
- {
- TMOD = 0x01;
- TH0 = (65536 - 10) / 256;
- TL0 = (65536 - 10) % 256;
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }
- // 定時(shí)器0中斷處理函數(shù)
- void timer0_int() interrupt 1
- {
- TR0 = 0;
- TH0 = (65536 - 10) / 256;
- TL0 = (65536 - 10) % 256;
- TR0 = 1;
- if (flag1 == 1)
- {
- PWM1 = 0;
- time++;
- if (time < count)
- PWM2 = 1;
- else
- PWM2 = 0;
- if (time >= 100)
- time = 0;
- }
- else
- {
- PWM2 = 0;
- time++;
- if (time < count)
- PWM1 = 1;
- else
- PWM1 = 0;
- if (time >= 100)
- time = 0;
- }
- }
- // 定時(shí)器1初始化
- void timer1_init()
- {
- TMOD = 0x10;
- TH1 = (65536 - 10) / 256;
- TL1 = (65536 - 10) % 256;
- TR1 = 1;
- ET1 = 1;
- EA = 1;
- }
- // 定時(shí)器1中斷處理函數(shù)
- void timer1_int() interrupt 3
- {
- TR1 = 0;
- TH1 = (65536 - 10) / 256;
- TL1 = (65536 - 10) % 256;
- TR1 = 1;
- if (flag2 == 1)
- {
- PWM3 = 0;
- time++;
- if (time < count)
- PWM4 = 1;
- else
- PWM4 = 0;
- if (time >= 100)
- time = 0;
- }
- else
- {
- PWM4 = 0;
- time++;
- if (time < count)
- PWM3 = 1;
- else
- PWM3 = 0;
- if (time >= 100)
- time = 0;
- }
- }
- // 向LCD發(fā)送命令
- void w_com(uchar j) {
- RS = 0;
- RW = 0;
- E = 1;
- P1 = j;
- E = 0;
- delayxms(3);
- }
- // 向LCD發(fā)送數(shù)據(jù)
- void w_dat(uchar j) {
- RS = 1;
- RW = 0;
- E = 1;
- P1 = j;
- E = 0;
- delayxms(2);
- }
- // 初始化LCD
- void lcd_init() {
- delayxms(10);
- w_com(0x38);
- delayxms(10);
- w_com(0x0c);
- delayxms(10);
- w_com(0x06);
- delayxms(10);
- w_com(0x01);
- delayxms(10);
- w_com(0x38);
- delayxms(10);
- }
復(fù)制代碼
Keil代碼與Proteus仿真下載:
仿真程序.7z
(65.19 KB, 下載次數(shù): 19)
2023-7-9 00:35 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|