3. 红外解码判断子程序
红外解码判断子程序包括对码值的判断程序和外部中断0程序,红外接收电路将接收到的信号送到外部中断0,然后红外解码程序对收到的信号进行解码,若解码失败则重新进行解码,若解码成功则判断器码值,然后调用步进电机控制和LCD显示程序实现步进电机的运转和显示。从而实现红外遥控对步进电机的控制及显示。系统红外解码判断子程序流程图如图12所示
红外解码函数N解码成功Y判断码值启动停止加速减速正转反转调用显示函数调用显示函数调用显示函数调用显示函数调用显示函数调用显示函数 图12
五:总结
该红外遥控步进电机的制作让我学会了怎样去设计一个系统,对一个系统的基本架构有了一定的认识,在通过对红外编解码电路的设计也让我对红外遥控的基本知识有了新的认识,知道了红外发码的原理掌握了红外解码程序的编写,对LCD现实模块的使用也让我对LCD有了新的认识,交接了要调节LCD的驱动电压使其达到0V左右才能让字符显示出来,通过对步进电机驱动电路的设计也让我认识到要在步进电机的P口加上拉电阻才能驱动步进电机。总之,这次实训让我收获了很多也为我以后的工作奠定了一定的基础。 源代码:
#include
#include
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit IR=P3^2; //红外接口标志
unsigned char TempData[8]; //存储显示值的全局变量 char code Tab[16]=%unsigned char irtime;//红外用全局变量
bit irpro_ok,irok,f;
unsigned char IRcord[4]; unsigned char irdata[33];
sbit A1=P1^0; //定义步进电机连接端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3;
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电 #define RS_CLR RS=0 #define RS_SET RS=1
#define RW_CLR RW=0 #define RW_SET RW=1
#define EN_CLR EN=0 #define EN_SET EN=1 #define CHECK_BUSY #define DataPort P0 unsigned char Speed=1; bit StartFlag,zfFlag;
sbit RS = P2^4; //定义端口
sbit RW = P2^5; sbit EN = P2^6;
void DelayUs2x(unsigned char t); void DelayMs(unsigned char t); void Ir_work(void); void Ircordpro(void); void TIM0init(void); void Init_Timer1(void); void EX0init(void);
/*------------------------------------------------ 判忙函数
------------------------------------------------*/ bit LCD_Check_Busy(void) {
#ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;
return (bit)(DataPort & 0x80); #else
return 0; #endif }
/*------------------------------------------------ 写入命令函数
------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {
// while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_CLR; RW_CLR; EN_SET;
DataPort= com; _nop_(); EN_CLR;
}
/*------------------------------------------------ 写入数据函数
------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {
//while(LCD_Check_Busy()); //忙则等待 DelayMs(5); RS_SET; RW_CLR; EN_SET;
DataPort= Data; _nop_(); EN_CLR; }
/*------------------------------------------------ 清屏函数
------------------------------------------------*/ void LCD_Clear(void) {
LCD_Write_Com(0x01); DelayMs(5); }
/*------------------------------------------------ 写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {
if (y == 0) {
LCD_Write_Com(0x80 + x); //表示第一行 } else
{
LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) {
LCD_Write_Data( *s); s ++; }