- 159
- 0
- 约3.51千字
- 约 6页
- 2020-12-17 发布于浙江
- 举报
(1)
#includereg51.h
#define uchar unsigned char
#define uint unsigned int
sbit INPUT1 = P1^0; //控制口
sbit INPUT2 = P1^1;
sbit INPUT3 = P1^2;
sbit INPUT4 = P1^3;
sbit ENA = P1^4; //产生PWM波
sbit ENB = P1^5;
uint MA=0,MB=0;
uint SpeedA=20;//50%占空比
uint SpeedB=20;
void delay(uint z) {
uint x,y;
for(x=z;x0;x--)
for(y=125;y0;y--);
}
void main(void)
{
delay(1000) ;
delay(1000) ;
INPUT1=1;
INPUT2=0;
INPUT3=1;
INPUT4=0;
TH0 = 0xF4;
TL0 = 0x48;
TH1 = 0xF4;
TL1 = 0x48;
TMOD = 0x11;
TR0 = 1;
TR1 = 1;
ET0 = 1;
ET1 = 1;
EA = 1;
while(1){}
}
void time0_int() interrupt 1 using 1
{
TR0=0;
TH0=0xF4;
TL0=0x48;
MA++;
if(MA SpeedA){
ENA = 1;
}
else ENA = 0;
if(MA == 40){
MA = 0;
}
TR0 = 1;
}
void time1_int() interrupt 3 using 1
{
TR1=0;
TH1=0xF4;
TL1=0x48;
MB=MB + 1;
if(MB SpeedB){
ENB=1;
}
else ENB = 0;
if(MB == 40){
MB = 0;
}
TR1 = 1;
}
(2)
#include reg52.h
sbit KEY1 = P3^1;
sbit PWM = P1^5;
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
unsigned char PWM_Num;//定义档位
TMOD |=0x01;//定时器设置 1ms in 12M crystal
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
IE= 0x82; //打开中断
TR0=1;
CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步
while(1)
{
if(!KEY1)
{
delay(10000);
if(!KEY1)
{
PWM_Num++;
if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case 0:P1=0xFE;PWM_ON=0;break;//高电平时长
case 1:P1=0xFD;PWM_ON=4;break;
case 2:P1=0xFB;PWM_ON=6;break;
case 3:P1=0xF7;PWM_ON=8;break;
default:break;
}
}
}
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
if (count==PWM_ON)
{
PWM = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来
原创力文档

文档评论(0)