日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序...

發布時間:2024/7/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/*******************************************************************************

* 實驗名? ?? ?? ?? ?? ?? ?? ?? ?? ?: 紅外控制步進電機1602顯示值實驗

* 使用的IO? ?? ?? ?? ? : 電機用P2口

* 實驗效果? ?? ? : LCD1602顯示出讀取到的紅外線的值,步進電機作出相應的動作,啟動、停止、正轉反轉等

*? ?? ???注意? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???:

*******************************************************************************/

#include

#include"lcd.h"

sbit EN=P2^2;

sbit DIR=P2^1;

sbit CLK=P2^0;

sbit??Speaker=P1^5;

sbit IRIN=P3^2;

typedef unsigned char u8;

typedef unsigned int u16;

u16 z=0,cyl;

unsigned char code CDIS1[13]={" Red Control "};

unsigned char code CDIS2[13]={" IR-CODE:--H "};

unsigned char IrValue[6];

unsigned char Time;

void IrInit();

void DelayMs(unsigned int );

void T0_init();

void T1_init();

void keyscan();

/*??void delay1s(void);

void delay1s(void)

{

unsigned char h,i,j,k;

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

}??*/

void T0_init()

{

//對TMOD進行賦值,選擇T0/T1

//TMOD 8位 低4位用于T0,高4位用于T1 : GATE??C/T(C計數器高位有效,T定時器低位有效)??M1M2(工作方式 : 00 01 10 11)

//或運算|防止其他位被影響

TMOD|=0x11;

//計算初值??1ms=1000us的初值 :2的16次方(65535)-1000+1 = 64536 = FC18H??(工具)

TH0=(65536-50)/256;

TL0=(65536-50)%256;

//定時器0使能

ET0=1;

//打開總中斷

EA=1;

//TR0/TR1是T0/T1的運行控制位 TR0置1,T0開始工作,置1則停止工作

}

//中斷函數

void Timer0() interrupt 1

{

TH0=(65536-50)/256;

TL0=(65536-50)%256;

CLK=~CLK ;

}

void T1_init()

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

//定時器0使能

ET1=1;

//打開總中斷

EA=1;

//TR0/TR1是T0/T1的運行控制位 TR0置1,T0開始工作,置1則停止工作

}

//中斷函數

void Timer1() interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

z++;

}

/*******************************************************************************

* 函數名? ?? ?? ?: main

* 函數功能? ?? ?? ?? ?? ?? ? : 主函數

* 輸入? ?? ?? ???: 無

* 輸出? ?? ?? ?? ?? ?? ?: 無

*******************************************************************************/

void main()

{

unsigned char i;

IrInit();

LcdInit();

LcdWriteCom(0x80);

EN=0;

DIR=0;

T0_init();

T1_init();

for(i=0;i<13;i++)

{

LcdWriteData(CDIS1[i]);

}

LcdWriteCom(0x80+0x40);

for(i=0;i<13;i++)

{

LcdWriteData(CDIS2[i]);

}

while(1)

{

IrValue[4]=IrValue[2]>>4;? ?? ?? ?? ?? ?? ?? ?? ???//高位

IrValue[5]=IrValue[2]&0x0f;? ?? ?? ?? ?? ? //低位

if(IrValue[4]>9)

{

LcdWriteCom(0xc0+0x09);? ?? ?? ?? ?? ?? ?? ?? ?//設置顯示位置

LcdWriteData(0x37+IrValue[4]);? ?? ???//將數值轉換為該顯示的ASCII碼

}

else

{

LcdWriteCom(0xc0+0x09);

LcdWriteData(IrValue[4]+0x30);? ?? ???//將數值轉換為該顯示的ASCII碼

}

if(IrValue[5]>9)

{

LcdWriteCom(0xc0+0x0a);

LcdWriteData(IrValue[5]+0x37);? ?? ?? ?? ?? ? //將數值轉換為該顯示的ASCII碼

}

else

{

LcdWriteCom(0xc0+0x0a);

LcdWriteData(IrValue[5]+0x30);? ?? ?? ?? ?? ? //將數值轉換為該顯示的ASCII碼

}

keyscan();

}

}

void keyscan()

{

if( IrValue[4]==4&&? ?? ???IrValue[5]==5) //步進啟動

{

TR0=1;

EN=1;

}

else if( IrValue[4]==4&&? ?? ???IrValue[5]==4) //停止

{

TR0=0;

EN=0;

}

else if( IrValue[4]==0&&? ?? ???IrValue[5]==9) //正

{

DIR=1;

}

else if( IrValue[4]==1&&? ?? ???IrValue[5]==5) //反

{

DIR=0;

}

}

/*******************************************************************************

* 函數名? ?? ?? ?: DelayMs()

* 函數功能? ?? ?? ?? ?? ?? ? : 延時

* 輸入? ?? ?? ???: x

* 輸出? ?? ?? ?? ?? ?? ?: 無

*******************************************************************************/

void DelayMs(unsigned int x)? ?//0.14ms誤差 0us

{

unsigned char i;

while(x--)

{

for (i = 0; i<13; i++)

{}

}

}

/*******************************************************************************

* 函數名? ?? ?? ?: IrInit()

* 函數功能? ?? ?? ?? ?? ?? ? : 初始化紅外線接收

* 輸入? ?? ?? ???: 無

* 輸出? ?? ?? ?? ?? ?? ?: 無

*******************************************************************************/

void IrInit()

{

IT0=1;//下降沿觸發

EX0=1;//打開中斷0允許

EA=1;? ?? ???//打開總中斷

IRIN=1;//初始化端口

}

/*******************************************************************************

* 函數名? ?? ?? ?: ReadIr()

* 函數功能? ?? ?? ?? ?? ?? ? : 讀取紅外數值的中斷函數

* 輸入? ?? ?? ???: 無

* 輸出? ?? ?? ?? ?? ?? ?: 無

*******************************************************************************/

void ReadIr() interrupt 0

{

unsigned char j,k;

unsigned int err;

Time=0;

DelayMs(70);

if(IRIN==0)? ?? ?? ?? ?? ? //確認是否真的接收到正確的信號

{

err=1000;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//1000*10us=10ms,超過說明接收到錯誤的信號

/*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時

侯,程序死在這里*/

while((IRIN==0)&&(err>0))? ?? ???//等待前面9ms的低電平過去

{

DelayMs(1);

err--;

}

if(IRIN==1)? ?? ?? ?? ?? ?? ?? ?? ?//如果正確等到9ms低電平

{

err=500;

while((IRIN==1)&&(err>0))? ?? ?? ?? ?? ???//等待4.5ms的起始高電平過去

{

DelayMs(1);

err--;

}

for(k=0;k<4;k++)? ?? ?? ?? ?? ? //共有4組數據

{

for(j=0;j<8;j++)? ?? ???//接收一組數據

{

err=60;

……………………

…………限于本文篇幅 余下代碼請從51黑下載附件…………

總結

以上是生活随笔為你收集整理的51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。