資源簡介
利用51單片機控制雙舵機,利用定時器0和定時器1分別控制水平和垂直方向的舵機,模擬實現云臺的功能。內含分別利用T0和T1單獨控制舵機的代碼,利用數碼管顯示9度步進角,按鍵實現角度加減~

代碼片段和文件信息
#include?“reg52.h“
unsigned?char?count;??????//0.1ms次數標識
sbit?pwm?=P1^7?;??????????//PWM信號輸出
sbit?jia?=P3^6;???????????//角度增加按鍵檢測IO口
sbit?jan?=P3^7;???????????//角度減少按鍵檢測IO口
unsigned?char?jd;?????????//角度標識
unsigned?char?flag;
sbit?dula=P2^6;
sbit?wela=P2^7;
unsigned?char?code?table[]={0x3f0x060x5b0x4f0x660x6d0x7d
????????????????????????0x070x7f0x6f0x770x7c0x390x5e0x790x71};
void?delay(unsigned?char?i)//延時
{
??unsigned?char?jk;
??for(j=i;j>0;j--) //jiang?jd=5fenli
????for(k=125;k>0;k--);
}
void?Time0_Init()????????????//定時器初始化
{
TMOD?=?0x02;?????????????//定時器0工作在方式2自動重裝TH0的值????
IE? ?=?0x82;
TH0??=?0xa4;
TL0??=?0xa4; ?????//11.0592MZ晶振,0.1ms
????TR0=1;???????????????????//定時器開始
}
void?Time0_Int()?interrupt?1?//中斷程序
{
// TH0??=?0xfe;?????????????//重新賦值
// TL0??=?0x33;
????
????{
????if(count ??????pwm=1;??????????????????//確實小于,PWM輸出高電平
????else
??????pwm=0;?????
????}
????count=(count+1);??????????//0.1ms次數加1? ??
???if(count==200)???count=0;???????????//次數始終保持為200?即保持周期為20ms
????
}
void?keyscan()???????????????//按鍵掃描
{?
???if(jia==0)????????????????//角度增加按鍵是否按下
??{
????delay(30);???????????????//按下延時,消抖
????if(jia==0)???????????????//確實按下
?????{?
???? ??jd++;??????????????????//角度標識加1
? ?????count=0;???????????????//按鍵按下?則20ms周期從新開始
?????if(jd==25)
????????jd=25;????????????????//已經是180度,則保持
??????while(jia==0);?????????//等待按鍵放開
?????}
??}
??if(jan==0)????????????????//角度減小按鍵是否按下
??{
????delay(30);
????if(jan==0)
?????{
?????? jd--;?????????????????//角度標識減1
??????count=0;
??????if(jd==0)
????????jd=1;???????????????//已經是0度,則保持
??????while(jan==0);
?????}
??}
}
void?display()???????????????//數碼管顯示函數
{
??unsigned?char?baishige;?
???switch(jd)????????????????//根據角度標識顯示相應的數值
{
??????case?1:????????????????//為1,角度為0,前3個數碼管顯示000
????????bai=0;???????????????
????????shi=0;
????????ge=0;
????????break;
??????case?2:
????????bai=0;
????????shi=4;
????????ge=5;
????????break;
??????case?3:
????????bai=0;
????????shi=9;
????????ge=0;
????????break;
??????case?4:
????????bai=1;
????????shi=3;
????????ge=5;
????????break;
??????case?5:????????????????//為5,角度為180,前3個數碼管顯示180
????????bai=1;
????????shi=8;
????????ge=0;
????????break;
}
???dula=0;
???P0=table[bai];
???dula=1;
???dula=0;
???wela=0;
???P0=0xfe;
???wela=1;
???wela=0;
???delay(5);
???P0=table[shi];
???dula=1;
???dula=0;
???P0=0xfd;
???wela=1;
???wela=0;
???delay(5);
???P0=table[ge];
???dula=1;
???dula=0;
???P0=0xfb;
???wela=1;
???wela=0;
???delay(5);
}
void?main()
{
?jd=3;
?flag=0;
?count=0;?
?pwm=0;
?Time0_Init();??????????????
?while(1)
?{
??keyscan();???????????????//按鍵掃描
??display();
?}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1689??2004-03-27?13:30??多舵機\REG51.H
?????文件???????1961??2008-02-17?00:06??多舵機\nmain.c
?????文件???????2754??2008-02-16?23:50??多舵機\main.LST
?????文件???????5115??2002-04-16?15:32??多舵機\STARTUP.A51
?????文件???????7407??2008-02-17?00:06??多舵機\11.plg
?????文件???????4333??2008-02-16?23:50??多舵機\main.OBJ
?????文件???????4563??2008-02-17?00:04??多舵機\nmain.LST
?????文件???????5946??2008-02-17?00:04??多舵機\nmain.OBJ
?????文件???????5710??2008-02-17?00:04??多舵機\11
?????文件????????914??2008-02-17?00:04??多舵機\STARTUP.obj
?????文件???????1221??2008-02-17?00:06??多舵機\11.Opt
?????文件??????11794??2008-02-17?00:04??多舵機\STARTUP.lst
?????文件???????8054??2008-02-17?00:04??多舵機\11.M51
?????文件???????1459??2008-02-17?00:04??多舵機\11.hex
????.......?????????0??2008-02-16?22:54??多舵機\11_Uv2.Bak
?????文件???????2081??2008-02-16?23:37??多舵機\11.Uv2
????.......??????1196??2008-02-16?23:37??多舵機\11_Opt.Bak
?????文件???????1022??2008-02-16?23:50??多舵機\main.c
?????目錄??????????0??2008-02-16?22:54??多舵機
?????文件???????3080??2012-04-15?12:05??T1duoji.c
?????文件???????3048??2012-04-15?11:29??T0duoji.c
-----------?---------??----------?-----??----
????????????????73347????????????????????21
- 上一篇:編譯原理課后答案蔣立源版
- 下一篇:圖的深度優先搜索遍歷c代碼實現
評論
共有 條評論