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显示源程序...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建一个动物类 java_使用java面
- 下一篇: android 百度地图3.0定位,An