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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7473|回復: 8
收起左側

基于52單片機控制編碼器顯示程序

  [復制鏈接]
ID:404419 發表于 2018-11-26 17:38 | 顯示全部樓層 |閱讀模式
#include "reg52.h"  
  
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit DIR=P1^0;
sbit STEP=P1^1;
sbit K1=P3^1;
sbit K2=P3^0;
typedef unsigned int u16;   //對數據類型進行聲明定義
typedef unsigned char u8;
uchar code digit[ ]={"0123456789"}; //定義字符數組顯示數字
uchar idata TEST[]="SPEED";

//電機正反轉二維數組 0為逆時針,1為順時針
uchar code MotorCode[2][8]={{0x04,0x06,0x02,0x0a,0x08,0x09,0x01,0x05},{0x05,0x01,0x09,0x08,0x0a,0x02,0x06,0x04}};
sbit EncoderA=P3^2;    //編碼器A相
sbit EncoderB=P3^4;    //編碼器B相
uint EncoderCount=0 ;

void delay(u16 i)
{
while(i--);
}
void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
        uint a,b;
        for(a=c;a>0;a--)
                for(b=114;b>0;b--);
}
#ifndef  LCD1602_4PINS  //當沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com)   //寫入命令
{
LCD1602_E = 0;     //使能
LCD1602_RS = 0;    //選擇發送命令
LCD1602_RW = 0;    //選擇寫入

LCD1602_DATAPINS = com;     //放入命令
Lcd1602_Delay1ms(1);  //等待數據穩定
LCD1602_E = 1;           //寫入時序
Lcd1602_Delay1ms(5);   //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)   //寫入命令
{
LCD1602_E = 0;  //使能清零
LCD1602_RS = 0;  //選擇寫入命令
LCD1602_RW = 0;  //選擇寫入
LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //發送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名         : LcdWriteData
* 函數功能     : 向LCD寫入一個字節的數據
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/     
#ifndef  LCD1602_4PINS     
void LcdWriteData(uchar dat)   //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //寫入時序
Lcd1602_Delay1ms(5);   //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)   //寫入數據
{
LCD1602_E = 0;   //使能清零
LCD1602_RS = 1;   //選擇寫入數據
LCD1602_RW = 0;   //選擇寫入
LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //寫入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
#ifndef  LCD1602_4PINS
/*=================================================
*函數名稱:LCD1602_Dis_OneChar
*函數功能:在指定位置顯示一個字符
*調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
*輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
                dat:需要顯示的數據以ASCLL形式顯示
=================================================*/
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
        if(y)        x |= 0x40;
        x |= 0x80;
        LcdWriteCom(x);
        LcdWriteData(dat);               
}
#endif
/*=================================================
*函數名稱:LCD1602_Dis_Str
*函數功能:在指定位置顯示字符串
*調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
                *str:需要顯示的字符串
=================================================*/
#ifndef  LCD1602_4PINS
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
        if(y) x |= 0x40;
        x |= 0x80;
        LcdWriteCom(x);
        while(*str != '\0')
        {
                LcdWriteData(*str++);
        }
}
#endif
/*******************************************************************************
* 函 數 名       : LcdInit()
* 函數功能   : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/     
#ifndef  LCD1602_4PINS
void LcdInit()        //LCD初始化子程序
{
  LcdWriteCom(0x38);  //開顯示
LcdWriteCom(0x0c);  //開顯示不顯示光標
LcdWriteCom(0x06);  //寫一個指針加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //設置數據指針起點
}
#else
void LcdInit()        //LCD初始化子程序
{
LcdWriteCom(0x32);  //將8位總線轉為4位總線
LcdWriteCom(0x28);  //在四位線下的初始化
LcdWriteCom(0x0c);  //開顯示不顯示光標
LcdWriteCom(0x06);  //寫一個指針加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //設置數據指針起點
}
#endif

void keypros1()
{
  if(K1==0)  //檢測按鍵K1是否按下
  {
   delay(1); //消除抖動
   if(K1==0)
   {
     while(1)
     {
    TMOD=0x01;
          TH0=(65535-2000)/256;
          TL0=(65535-2000)%256;
          EA=1;
          ET0=1;
          TR0=1;
         
    DIR=0;
     }
   while(!K1);   
      }   
         }
}


由于內容有限,這只是部分代碼,需要完整版,請下載附件

編碼器(成功).zip

29.81 KB, 下載次數: 133, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:404419 發表于 2018-11-26 17:40 | 顯示全部樓層
經本人實驗,真實有效!!!
回復

使用道具 舉報

ID:1 發表于 2018-11-26 21:49 | 顯示全部樓層
能分享原理圖嗎?
回復

使用道具 舉報

ID:404419 發表于 2018-12-17 09:52 | 顯示全部樓層
程序原理圖

原理圖

原理圖
回復

使用道具 舉報

ID:415787 發表于 2019-3-1 16:23 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:482999 發表于 2019-3-1 22:37 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:516413 發表于 2019-6-26 15:48 | 顯示全部樓層
感謝大神分享
回復

使用道具 舉報

ID:585817 發表于 2019-7-18 09:07 | 顯示全部樓層
怎樣在程序里面調節電機速度??
回復

使用道具 舉報

ID:688122 發表于 2020-2-6 19:20 | 顯示全部樓層
389156621 發表于 2019-7-18 09:07
怎樣在程序里面調節電機速度??

同問,我也想實現這個功能
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一区二区在线观看 | 精品成人免费一区二区在线播放 | 色射综合 | 国内精品99 | 国产永久免费 | 亚洲在线观看视频 | 久久精品亚洲精品国产欧美 | 欧美成人影院 | 成人在线观看网址 | 亚洲69p| www.中文字幕.com | aaaaa毛片| 五月综合激情网 | 欧美中文字幕在线观看 | 日韩一区二区在线视频 | 国产精品久久久久久久久久久久久久 | 国产人成精品一区二区三 | 人妖无码 | 蜜桃一区| 欧美综合一区二区三区 | 91网站在线播放 | 精品一区二区在线观看 | 一区二区三区中文字幕 | 精品在线一区 | 国产精品一区二区av | 孕妇一级毛片 | 精品视频一区二区三区在线观看 | 欧美日韩中文国产一区发布 | 国产精品色 | 久草免费在线视频 | av香蕉 | va在线| 欧美老妇交乱视频 | 精品亚洲一区二区三区 | 亚洲欧美激情国产综合久久久 | 中文字幕中文字幕 | 成人不卡 | 女人天堂av| 亚洲第一在线 | 在线视频中文字幕 | 一区二区三区免费在线观看 |