附件
一、 电路原理图
二、 电路PCB图
三、 电路实物图
四、 源程序
#include
#include
#define uchar unsigned char #define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转相序编码
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit K1 = P3^0; //运行与停止 sbit K2 = P3^1; //设圈数 sbit K3 = P3^2; //方向转换 sbit K4 = P3^3; //转速加
sbit K5 = P3^4; //点动 sbit K6 = P3^5; sbit K7 = P3^6; sbit K8 = P3^7;
sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2;
bit on_off=0,on_off1=0; //运行与停止标志 bit direction=1; //方向标志 bit rate_dr=1; //速率标志 bit snum_dr=1; //圈数标志
uchar code cdis1[ ] = {%uchar code cdis2[ ] = {%uchar code cdis3[ ] = {%uchar code cdis4[ ] = {%uchar code cdis5[ ] = {%uchar code cdis6[ ] = {\
uchar m,v=0,q=0,q1;
uint number=0,number1=0;
uchar snum=10,snum1=10,number2=0; //预设定圈数 uchar rate=2,rate_ctr; //预设定速率 uchar data_temp,data_temP1,data_temp2;
/********************************************************/ /* /* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms /* /********************************************************/ void delay(uint t) //tms { uchar k; while(t--) {
for(k=0; k<125; k++) { } } }
/********************************************************/ void delayB(uchar x) //x*0.14MS {
uchar i; while(x--) {
for (i=0; i<13; i++) { } } }
/********************************************************/
/********************************************************/
/* /*检查LCD忙状态 /*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
/* /********************************************************/
bit lcd_busy()
{ bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();
result = (bit)(P0&0x80); LCD_EN = 0;
return(result); }
/********************************************************/
/* /*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /* /********************************************************/
void lcd_wcmd(uchar cmd)
{ while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }
/********************************************************/
/* /*写显示数据到LCD /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 /* /********************************************************/
void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP();
LCD_EN = 0; }
/********************************************************/
/* /* LCD初始化设定 /* /********************************************************/
void lcd_init() {
delay(30);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay(5);
lcd_wcmd(0x38); delay(5);
lcd_wcmd(0x38); delay(5);
lcd_wcmd(0x0c); //显示开,关光标 delay(5);
lcd_wcmd(0x06); //写入新数据后光标右移 delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); }
/********************************************************/
/* /* 设定显示位置 /* /********************************************************/
void lcd_pos(uchar pos) {
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 }
/********************************************************/ /*
/* LCD1602初始显示子程序 /* /********************************************************/ void LCD_init_DIS() {
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\\0')
{ //显示字符 lcd_wdat(cdis1[m]); m++; }
lcd_pos(0x40); //设置显示位置为第二行第1