|
#include <reg52.h>
unsigned int i,j;
void delay(unsigned char xms);
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
//引腳定義:
sbit PWM1 = P2^0; //舵機(jī)的控制引腳(PWM輸出)
//引腳定義:
sbit SMG_q = P1^0; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)
sbit SMG_b = P1^1; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P1^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P1^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
sbit key1 = P3^7; //定義按鍵1
sbit key2 = P3^6; //定義按鍵2
sbit key3 = P3^5; //定義按鍵3
sbit key4 = P3^4; //定義按鍵4
sbit key5 = P3^3; //定義按鍵5
sbit key6 = P3^2; //定義按鍵6
//變量定義:
unsigned char fe=100; //轉(zhuǎn)角變量,值控制在100-250
void delayMS(void) //誤差 0us 延時(shí)1ms 此處可以修改高電平周期
//修改此處的延時(shí)可以更改舵機(jī)轉(zhuǎn)的角度 ,45度具體是多少 你可以試試
{
unsigned char a,c;
c=fe;
for(;c>0;c--){
a++;
a++;
}
}
//延時(shí)子函數(shù)
void delay(unsigned int time)
{
while(time--);
}
//初始化函數(shù)
void init()
{
TMOD=0X01; //設(shè)置定時(shí)器0為模式一,即16位計(jì)算模式
TH0 = 0x0B1;
TL0 = 0x0E0;
EA=1; //開(kāi)啟總中斷
ET0=1; //開(kāi)啟定時(shí)器0中斷
TR0=1; //啟動(dòng)定時(shí)器0
}
//中斷函數(shù),定地器0
void timer() interrupt 1
{
//20ms中斷
TH0 = 0x0B1;
TL0 = 0x0E0;
//0.1ms中斷,200次中斷為一個(gè)周期20MS,轉(zhuǎn)角控制是0.5MS-2.5MS即5-25,180度分辨率20格為9度(CPU速度越快,分辨率可以做到更高)
PWM1=1;
delayMS();
PWM1=0;
}
//主函數(shù),C語(yǔ)言的入口函數(shù)
void main(void)
{
unsigned char ldat;
init(); //初始化中斷控制寄存器
TMOD=0X20; //設(shè)置定時(shí)器1為模式2,做為波特率發(fā)生器
TL1=0xF3; //2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400
TH1=0xF3; //
TR1=1; //啟動(dòng)波特率發(fā)生
SCON=0x50; //設(shè)置串口方式2
ES=1;
P0=0xc0; //數(shù)碼管顯示0
SMG_g=0; //使用數(shù)碼管個(gè)位來(lái)顯示鍵值
while(1)
{
if(RI){ //查詢(xún)是否有數(shù)據(jù)接收
ldat=SBUF; //數(shù)據(jù)暫存于變量中
RI=0; //重新清0等待接收
SBUF=ldat; //將接收到的數(shù)據(jù)發(fā)送出去
if(ldat==0x10)
{ //PWM出1.0ms,燈亮
LED1=0;
P0=0xf9; //數(shù)碼管顯示1
fe=100; //0.5MS,定0度位置
delay(50000); //延時(shí)
delay(50000);
}
else if(ldat==0x20) //繼電器通電,鎖開(kāi)啟,燈滅
{
LED2=0;
P0=0xa4; //數(shù)碼管顯示2
fe=150; //1.5MS,定90度位置
delay(50000);
delay(50000);
}
else if(ldat==0x30)
{
LED3=0;
P0=0xb0; //數(shù)碼管顯示3
fe=200; //2.0MS,定135度位置
delay(50000);
delay(50000);
}
else if(ldat==0x40)
{
LED4=0;
P0=0x99; //數(shù)碼管顯示4
fe=250; //2.0MS,定135度位置
delay(50000);
delay(50000);
}
while(!TI); //等待發(fā)送完成
TI=0;
}
}
}
應(yīng)該是控制一定角度 ,但通電后無(wú)窮循環(huán)轉(zhuǎn)動(dòng),不知哪里有錯(cuò)、、求教大家了
|
|