資源簡介
這個利用硬件測試和模擬仿真測試都可以,只要根據我在文件中的說明進行改動就可以了;硬件測試的時候我用的是6個傳感器,就對6路模擬量都進行了轉換。

代碼片段和文件信息
/*模擬仿真的ADC0809連接的是P2口,輸出連接的是P3口
??實際測試的時候ADC0809連接的是P1口,輸出是P3,注意要在下載程序之后再將ADC0809?的輸出與P3口連接,不然會不能下載程序。
??存在的問題是:?電機轉速出現問題,斷斷續續的轉動,似乎是電流不夠的原因
*/
#include
#include
#define?uc?unsigned?char
#define?ui?unsigned?int
/*實際硬件測試使用*/
uc?code?table_motor[]?=?{0x400x600x200x080x180x10};//方向左轉彎?直線?右轉彎??后左轉?后退??后右轉
uc?code?table_port[]?=?{0x0f0x1f0x2f0x3f0x4f0x5f};//這里是選擇通道0?1?2?3?4?5??????//?(P1口)低四位設置?0809的幾個標志位?(OE、EOC、Start(ALE)、CLK)?
/*模擬仿真顯示使用*/
uc?code?table0[]?=?{0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x770x7c0x390x5e0x790x71};?//共陰極數碼管段定義
uc?code?table2[]?=?{0xf30x600xb50xf40x660xd60x7d0x700xf70xf60x770xc70x930xe50x970x17};
uc?code?table1[]?=?{0xfe0xfd0xfb0xf7}; ?//數碼管位選*/
/*ADC0809相關引腳位定義???????????占用?7?+?8?+?2?(傳感器電源輸入)+?2(電源)個引腳*/?
sbit?OE?=?P1^0;
sbit?EOC?=?P1^1;
sbit?ST?=?P1^2;
sbit?CLK?=?P1^3;
sbit?A?=?P1^4;
sbit?B2?=?P1^5;
sbit?C?=?P1^6;
//A?P2^4?B:??P2^5???C:??P2^6
/*電機模塊占用引腳位定義??????????占用??6個引腳*/
sbit?SCK?=?P2^0; ?//4腳???移位寄存器時鐘
sbit?RCK?=?P2^2; ?//12腳??鎖存時鐘? //11腳??電機?1?的使能端?
sbit?SI?=?P2^1; ?????//8腳???數據輸入? ?
sbit?EN?=?P2^5;??? ?//7使能端
sbit?PW1?=?P2^4;?????//電機1激活?11?
sbit?PW2?=?P2^6;?????//電機2激活?3
/*模擬測試數字信號輸出?利用74hc595擴展引腳*/
sbit?SCK2?=?P1^3;
sbit?RCK2?=?P1^5;
sbit?SI2?=?P1^7;
uc?result[6]?=?{0};??//存儲6路轉換的結果
uc?max?=?1; //記錄最大的轉換結果的下標默認前進方向?
void?display(uc?);
void?Followlight();?
/*延時函數*/?
void?delay(int?ms)
{
uc?i;
while(ms--)
{
for(i?=?0;i?110;i++)
;
}
}?
/*找到最大轉換結果的下標*/
void?find_max()
{
uc?i;
for(i?=?0;i?6;i++)
{
if(result[max]? max?=?i;
}
}
/*轉換實現???轉換時間128us*/
void?ADC0809_alter(uc?i)
{
switch(i)
{
case?0:
P1?=?table_port[0];
break;
case?1:
P1?=?table_port[1];
break;
case?2:
P1?=?table_port[2];
break;
case?3:
P1?=?table_port[3];
break;
case?4:
P1?=?table_port[4];
break;
case?5:
P1?=?table_port[5];
break;
}
ST?=?0;
ST?=?1;
ST?=?0;?//啟動轉換 ?
while(?EOC?==?0);?//等待轉換結束
OE?=?1;//允許輸出
result[i]?=?P3;
OE?=?0;//關閉輸出
ST?=?1;?//這里產生一個下降沿?清除寄存器?
}?
/*75hc595串行傳輸數據*/
void?sendaction(uc?d)
{
/*數據串行輸入*/?
int?i?=?0;
for(i?=?0;i?8;i++)?
{
if(d&0x01)
SI?=?1;
else
SI?=?0;
d?=?d>>1;
SCK?=?0;
_nop_();
_nop_();
SCK?=?1;
}
/*鎖存數據*/
????EN?=?0;//開啟輸出使能端
RCK?=?0;
_nop_();
_nop_();
RCK?=?1;?
delay(100);
EN?=?1;//關閉輸出使能端
return;
}
//這里電機根據??max?控制小車轉向?
void?motor_action(uc?direct)
{
switch(direct)
{
case?0:
sendaction(table_motor[0]);//正左轉
break;
case?1:
sendaction(table_motor[1]);//前進
break;
case?2:
sendaction(table_motor[2]);//正右轉
break;
case?3:
sendaction(table_motor[3]);//后左轉
break;
case?4:
sendaction(table_motor[4]);//后退
break;
case?5:
sendaction(table_motor[5]);//后右轉
break;?
}
return?;
}
?//這
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2015-05-10?14:52??ADC0809andmotor\
?????文件????????5112??2015-05-10?14:38??ADC0809andmotor\ADC_motorcontrol.c
?????文件??????152349??2015-05-08?17:44??ADC0809andmotor\motortest1.dsn
- 上一篇:M1卡服務程序
- 下一篇:BT05藍牙封裝 AD庫
評論
共有 條評論