久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4639|回復: 1
收起左側

stc89c52單片機+sg90舵機實現9°控制旋轉程序 lcd1602顯示

[復制鏈接]
ID:505677 發表于 2019-8-15 15:21 | 顯示全部樓層 |閱讀模式
自己做的第一個小實物
   IMG_20190815_150912.jpg IMG_20190815_150905.jpg IMG_20190815_150853.jpg
真的有點累 跟仿真還是有差距的  自己焊的開發板到處都是問題  給大家分享一下我自己東拼西湊的程序   備注我已經盡量寫的詳細了  程序都貼出來了
電路圖不會畫  所以提供不了  不過這個東西也沒多復雜  程序上的端口我都備注了
//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();//舵機驅動
while(1)
{
  if(count>=250)  count=0;//設置舵機脈沖時基 25ms
  anjian();//按鍵控制
}
}

//lcd1602.h
// lcd 1602驅動程序  
#ifndef __LCD1602_H__
#define __LCD1602_H__
//頭文件
#include "delay.h"
//函數申明
void WDLCD(unsigned char WDLCD); //寫數據
void WCLCD(unsigned char WCLCD,BUSYC); //寫狀態
unsigned char RSLCD(void); //讀狀態
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;//忙
//寫數據
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(); //根據需要檢測忙
LCD = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
}
//讀狀態
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); //工作方式設置 8位數據接口 兩行顯示 5*8點陣
delay(5);
WCLCD(0x38,0);
delay(5);
WCLCD(0x38,0);
delay(5);
WCLCD(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
WCLCD(0x08,1); //顯示關 光標不顯示 光標不閃爍
WCLCD(0x01,1); //清屏
WCLCD(0x06,1); // 寫入新數據后光標右移 顯示不移動
WCLCD(0x0F,1); // 顯示開 光標顯示 光標閃爍
}
//按指定位置顯示一個字符
void DISPLAYCHAR(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
X |= 0x80;   //算出指令碼
WCLCD(X, 1);  //發命令字
WDLCD(DData); //發數據
}
//按指定位置顯示一串字符
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) //若到達字串尾則退出
  {
   if (X <= 0xF) //X坐標應小于0xF
    {
     DISPLAYCHAR(X, Y, DData[ListLength]); //顯示單個字符
     ListLength++;
     X++;
    }
  }
}
#endif

//sg90.h
//舵機驅動
#ifndef __SG90_H__
#define __SG90_H__
//端口
sbit SG_PWM=P2^6; //舵機脈沖輸出端
//變量
unsigned char PWM_count=15;//pwm高電平時間   初始為1.5ms   舵機轉動90°
unsigned int count=0;//延時中斷計數

void SG90INIT()
{
    TMOD = 0x02;//定時器0 方式2
    TH0 = 0xa4;//100us定時
    TL0 = 0x0a4;
    EA = 1;//中斷開啟
    ET0 = 1;
    TR0 = 1;//開始計數
}
void timer0()interrupt 1  //100us 中斷
{
  if(count<=PWM_count)//脈沖高電平時間
    {
      SG_PWM=1;
    }
    else //脈沖時基-高電平=低電平時間
    {
       SG_PWM=0;
    }
  count++;
}
#endif

//anjian.h
//按鍵驅動
#ifndef __ANJIAN_H__
#define __ANJIAN_H__
//字符串數組
unsigned char code str5[]={"left "};
unsigned char code str6[]={"right"};
unsigned char code ASCII[]={"0123456789"};
unsigned char num;//顯示數字 變量
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; //計算舵機角度
       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
//延時函數 毫秒級
#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下載地址:
舵機控制.zip (20.18 KB, 下載次數: 84)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:766435 發表于 2020-6-2 13:15 | 顯示全部樓層
這么好的帖子,頂起!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区三区在线 | 国产精品高清一区二区三区 | 国产一区二区av | 性欧美精品一区二区三区在线播放 | 久久久婷| 激情久久网 | 99资源| 国产精品福利视频 | 久久久久久亚洲精品不卡 | 欧美日韩久久久 | 国产精品毛片一区二区三区 | 999久久久精品| 久久久久久综合 | 视频在线h | 久久免费精品视频 | 精品成人佐山爱一区二区 | 久久精品国产免费看久久精品 | 天天看天天爽 | 国产精品亚洲成在人线 | wwwxxx国产| 男人的天堂在线视频 | 免费观看一级毛片 | 国产黄色大片 | www网站在线观看 | 国产精品久久久久久久久免费高清 | 日韩视频精品在线 | 日韩在线 | 狠狠色综合久久婷婷 | 久久99精品视频 | 久久久精| 91亚洲免费 | 国产在线精品一区二区 | 求个av网址 | 久久国产精品一区二区 | 亚洲成人毛片 | 欧美free性| 超碰日韩| 中文视频在线 | 国产资源视频 | 国产精品久久久久无码av | 亚洲视频中文 |