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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4598|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

stc89c52單片機(jī)+sg90舵機(jī)實(shí)現(xiàn)9°控制旋轉(zhuǎn)程序 lcd1602顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
自己做的第一個小實(shí)物
  
真的有點(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)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:766435 發(fā)表于 2020-6-2 13:15 | 只看該作者
這么好的帖子,頂起!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精精国产xxxx视频在线野外 | 国产一区二区三区在线 | 国产成人精品久久二区二区91 | 中国av在线免费观看 | 一区二区不卡视频 | 福利视频日韩 | 欧美精品久久久 | 天天人人精品 | 精品免费国产一区二区三区四区介绍 | 九九九视频 | 亚洲精品视频一区二区三区 | 久久成人精品视频 | 日本色高清 | 国产精品久久久久久久 | 久久精品国产一区二区电影 | 久久久国产一区二区三区 | 99精品视频在线 | 成人久久久久 | 免费激情网站 | 一区免费看 | 久久蜜桃精品 | 电影91久久久 | 国产精品96久久久久久 | 国产在线精品一区二区三区 | 免费视频成人国产精品网站 | 欧美啪啪| av在线视| 久久伦理电影 | 久国产视频 | 成年人网站在线观看视频 | 中文字幕高清av | 一区在线观看 | 一区二区三区四区在线 | 久久精品久久久久久 | 国产乱码精品一区二区三区中文 | 国产成人免费 | 久久久成 | 日韩欧美在线播放 | 成人在线中文字幕 | av片在线观看网站 | 成人国产精品色哟哟 |