|
2019年電子設(shè)計競賽即將進(jìn)行,其中電機(jī)和舵機(jī)的控制需需要用到PWM,我編寫了一個電位器調(diào)節(jié)PWM的仿真程序,希望能對你有所幫助。#include <regx52.h>//#include "ADC0809.h"
#define uchar unsigned char
#define uint unsigned int
sbit CLOCK=P2^4;
sbit START=P2^5;
sbit EOC= P2^6;
sbit OE=P2^7;
uchar addata,k;
uint tmp,high;
void adc0809();
void delay(uchar t)
{
uchar i,j;
for (i=0;i<t;i++)
for (j=0;j<123;j++);
}
main()
{
TMOD=0x11; //定時計數(shù)器1設(shè)置方式1
TH0=(65536-500)/256; //初值0.5ms
TL0=(65536-500)%256;
TH1=0xff;
TL1=0xf0;
EA=1;
ET0=1;
ET1=1; //允許定時計數(shù)器1中斷以便產(chǎn)生CLOCK時鐘
TR0=1;
TR1=1;
while(1)
{
START=0;
OE=0;
START=1; //啟動ADC轉(zhuǎn)換
START=0;
while (!EOC)
{
adc0809(); //ADC轉(zhuǎn)換
tmp=addata*196; //數(shù)據(jù)處理,1個單位代表19.6mV 測出電壓在0-50000mv間
high=tmp/500;
}
}
}
void adc0809() //讀ADC0809子程序
{
P1=0xff; //P1全部置一準(zhǔn)備讀數(shù)據(jù)
OE=1;
addata=P1; //讀出轉(zhuǎn)換數(shù)據(jù)賦與addata
OE=0; //讀數(shù)完畢
}
DS1() interrupt 1
{
k++; //中斷1次為0.5ms
if (k<high)
P3_0=1; //輸出高電平
else
P3_0=0; //輸出低電平
if (k==100)
k=0; //PWM周期為0.5*100ms
TH0=(65536-500)/256; //初值0.5ms
TL0=(65536-500)%256;
}
void time1() interrupt 3
{
CLOCK=~CLOCK;
TH1=0xff;
TL1=0xf0;
}
|
|