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