#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar buf;
unsigned char jd;
unsigned char count;
sbit pwm =P1^7 ;
sbit motor_control_1 = P2^7;// 動力電機控制
sbit motor_control_2 = P2^6;//
void Time0_Init() //定時器初始化
{
TMOD = 0x01; //定時器0作業在方式1
IE = 0x82;
TH0 = 0xfe;
TL0 = 0x33; //11.0592MZ晶振,0.5ms
TR0=1; //定時器開始
}
void main(void)
{
jd=3;
count=0;
Time0_Init();
SCON=0x50; //設定串口作業方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定時器1作業于8位自動多載模式, 用于產生波特率
EA=1;
ES = 1; //允許串口中斷
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
while(1);
}
/*********************************************************
串行中斷服務函式
*********************************************************/
void serial() interrupt 4
{
ES = 0; //關閉串行中斷
RI = 0; //清除串行接受標志位
buf = SBUF; //從串口緩沖區取得資料
if(buf==0X31)//前進
{
motor_control_1 = 0;
motor_control_2 = 1;
}
if(buf==0x30)//剎車
{
motor_control_1 = 0;
motor_control_2 = 0;
}
if(buf==0x33)//后退
{
motor_control_1 = 1;
motor_control_2 = 0;
}
if(buf==0x32)//左轉
{
jd=5;
}
if(buf==0x34)//右轉
{
jd=1;
}
ES = 1; //允許串口中斷
}
void Time0_Int() interrupt 1 //中斷程式
{
TH0 = 0xfe; //重新賦值
TL0 = 0x33;
if(count< jd) //判斷0.5ms次數是否小于角度標識
pwm=1; //確實小于,PWM輸出高電平
else
pwm=0; //大于則輸出低電平
count=(count+1); //0.5ms次數加1
count=count%40; //次數始終保持為40 即保持周期為20ms
}
uj5u.com熱心網友回復:
會不會是第二次對TMOD賦值把第一次賦值覆寫掉了。uj5u.com熱心網友回復:
我也覺得是這樣的
uj5u.com熱心網友回復:
樓主,你可以把第二個改成tmod|=0x20,這樣應該就行了轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/154051.html
標籤:單片機/工控
上一篇:OLED顯示的問題
下一篇:小專案經驗記錄
