|
自己做的第一個小實(shí)物
IMG_20190815_150912.jpg (2.71 MB, 下載次數(shù): 41)
下載附件
2019-8-15 15:11 上傳
IMG_20190815_150905.jpg (2.74 MB, 下載次數(shù): 49)
下載附件
2019-8-15 15:11 上傳
IMG_20190815_150853.jpg (3.05 MB, 下載次數(shù): 37)
下載附件
2019-8-15 15:11 上傳
真的有點(diǎn)累 跟仿真還是有差距的 自己焊的開發(fā)板到處都是問題 給大家分享一下我自己東拼西湊的程序 備注我已經(jīng)盡量寫的詳細(xì)了 程序都貼出來了
電路圖不會畫 所以提供不了 不過這個東西也沒多復(fù)雜 程序上的端口我都備注了
//main.c
//頭文件
#include <reg52.h>
#include "lcd1602.h"
#include "sg90.h"
#include "anjian.h"
//定義端口
//定義變量
//unsigned char code str1[]={"error!"};
unsigned char code str2[]={"SG90 control"};
unsigned char code str3[]={"program...."};
unsigned char code str4[]={"direction:"};
unsigned char code str7[]={"angle:90"};
//unsigned char code str5[]={"left "};
//unsigned char code str6[]={"right"};
void main()
{
LCDINIT(); //LCD初始化
WCLCD(0X01,0); //清屏 不檢測忙
DISPLAYSTR(0,0,str2); //輸出字符串
DISPLAYSTR(0,1,str3);
delay(3000);
WCLCD(0X01,0);
DISPLAYSTR(0,0,str4);
DISPLAYSTR(0,1,str7);
SG90INIT();//舵機(jī)驅(qū)動
while(1)
{
if(count>=250) count=0;//設(shè)置舵機(jī)脈沖時基 25ms
anjian();//按鍵控制
}
}
//lcd1602.h
// lcd 1602驅(qū)動程序
#ifndef __LCD1602_H__
#define __LCD1602_H__
//頭文件
#include "delay.h"
//函數(shù)申明
void WDLCD(unsigned char WDLCD); //寫數(shù)據(jù)
void WCLCD(unsigned char WCLCD,BUSYC); //寫狀態(tài)
unsigned char RSLCD(void); //讀狀態(tài)
void LCDINIT(void);//初始化
void DISPLAYCHAR(unsigned char X, unsigned char Y, unsigned char DData);//指定位置輸出一個字符
void DISPLAYSTR(unsigned char X, unsigned char Y, unsigned char code *DData);//指定位置輸出一串字符
//定義端口
#define LCD P1 //lcd1602 D0-D7端口
sbit LCD_E=P3^4;
sbit LCD_RS=P3^5;
sbit LCD_RW=P3^6;
//定義變量
unsigned char BUSY=0X80;//忙
//寫數(shù)據(jù)
void WDLCD(unsigned char WDLCD)
{
RSLCD(); //檢測忙
LCD= WDLCD;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 0; //若晶振速度太高可以在這后加小的延時
LCD_E = 0; //延時
LCD_E = 1;
}
//寫指令
void WCLCD(unsigned char WCLCD,BUSYC) //BuysC為0時忽略忙檢測
{
if (BUSYC) RSLCD(); //根據(jù)需要檢測忙
LCD = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
}
//讀狀態(tài)
unsigned char RSLCD(void)
{
LCD = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
while (LCD & BUSY); //檢測忙信號
return(LCD);
}
void LCDINIT(void) //LCD初始化
{
LCD = 0;
WCLCD(0x38,0); //工作方式設(shè)置 8位數(shù)據(jù)接口 兩行顯示 5*8點(diǎn)陣
delay(5);
WCLCD(0x38,0);
delay(5);
WCLCD(0x38,0);
delay(5);
WCLCD(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
WCLCD(0x08,1); //顯示關(guān) 光標(biāo)不顯示 光標(biāo)不閃爍
WCLCD(0x01,1); //清屏
WCLCD(0x06,1); // 寫入新數(shù)據(jù)后光標(biāo)右移 顯示不移動
WCLCD(0x0F,1); // 顯示開 光標(biāo)顯示 光標(biāo)閃爍
}
//按指定位置顯示一個字符
void DISPLAYCHAR(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
X |= 0x80; //算出指令碼
WCLCD(X, 1); //發(fā)命令字
WDLCD(DData); //發(fā)數(shù)據(jù)
}
//按指定位置顯示一串字符
void DISPLAYSTR(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x19) //若到達(dá)字串尾則退出
{
if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
DISPLAYCHAR(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
X++;
}
}
}
#endif
//sg90.h
//舵機(jī)驅(qū)動
#ifndef __SG90_H__
#define __SG90_H__
//端口
sbit SG_PWM=P2^6; //舵機(jī)脈沖輸出端
//變量
unsigned char PWM_count=15;//pwm高電平時間 初始為1.5ms 舵機(jī)轉(zhuǎn)動90°
unsigned int count=0;//延時中斷計(jì)數(shù)
void SG90INIT()
{
TMOD = 0x02;//定時器0 方式2
TH0 = 0xa4;//100us定時
TL0 = 0x0a4;
EA = 1;//中斷開啟
ET0 = 1;
TR0 = 1;//開始計(jì)數(shù)
}
void timer0()interrupt 1 //100us 中斷
{
if(count<=PWM_count)//脈沖高電平時間
{
SG_PWM=1;
}
else //脈沖時基-高電平=低電平時間
{
SG_PWM=0;
}
count++;
}
#endif
//anjian.h
//按鍵驅(qū)動
#ifndef __ANJIAN_H__
#define __ANJIAN_H__
//字符串?dāng)?shù)組
unsigned char code str5[]={"left "};
unsigned char code str6[]={"right"};
unsigned char code ASCII[]={"0123456789"};
unsigned char num;//顯示數(shù)字 變量
void anjian()
{
if((P2&0x03)!=0x03)//判斷 P2^0 and P2^1是否有按鍵
{
delay(5); //延時
if((P2&0x03)!=0x03)//再判斷一次
switch(P2&0x03)
{
case 0x02: //P2^0按下
PWM_count++; //高電平時間加100us
DISPLAYSTR(0x0a,0,str5);//顯示left
if(PWM_count>=25)//高電平不會大于2.5ms 25*100us=2.5ms
PWM_count=25;
num=(PWM_count-5)*9; //計(jì)算舵機(jī)角度
DISPLAYCHAR(0X06,1,ASCII[num/100]);
DISPLAYCHAR(0X07,1,ASCII[num/10%10]);
DISPLAYCHAR(0X08,1,ASCII[num%10]);//顯示角度
break;
case 0x01: //P2^1按下
PWM_count--;
DISPLAYSTR(0x0a,0,str6);
if(PWM_count<=5)
PWM_count=5;
num=(PWM_count-5)*9;
DISPLAYCHAR(0X06,1,ASCII[num/100]);
DISPLAYCHAR(0X07,1,ASCII[num/10%10]);
DISPLAYCHAR(0X08,1,ASCII[num%10]);
break;
default: //兩個鍵同時按下 跳出
break;
}
do{delay(5);}
while((P2&0x03)!=0x03); //判斷是否松開按鍵
}
}
#endif
//delay.h
//延時函數(shù) 毫秒級
#ifndef __DELAY_H__
#define __DELAY_H__
#define uint unsigned int
#define uchar unsigned char
void delay(uint count)
{
uint i;
uchar j,k;
for(i=0;i<count;i++)
for(j=0;j<88;j++)
for(k=0;k<2;k++);
}
#endif
全部程序51hei下載地址:
舵機(jī)控制.zip
(20.18 KB, 下載次數(shù): 84)
2019-8-15 15:12 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|