代码 功能 1602 看门小时狗, 定时器, 步进电机 2相6线2拍半控制法,加速起动过程,
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
unsigned char aa,b2,d1,d11,d12;
unsigned int m,m1,m2,ty,s1,m1,h1,a2,ty1,dsrw,bb,a1,i1,b1;
void akey(void);
void delaymma(uint z);
void delay(BYTE ms);
void delay2(void);
void wy(void);
void xs(void);
sbit key1 = P3^2;
sbit key2 = P3^3;
sbit key3 = P3^4;
sbit key4 = P3^5;
sbit key5 = P3^6;
sbit key6 = P3^7;
sbit rs = P2^0; //
sbit rw = P2^1;
sbit ep = P2^2;
sfr WDT_COUTR = 0xc1; //小狗狗起床了
BYTE code dis_code[11]={"01234567890"};
unsigned char data dis_buf[8];
unsigned char data dis_buf2[2];
//uchar xdata cl[4][20]={{1,2,3,0},{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}};
BYTE code dis1[] = {"|| Greenbird ||"};
BYTE code dis2[] = {"|| JRCSH ||"};
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //P10~3. P20-3
uchar code FFW[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //P10~3. P20-3
//uchar code REV1[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; ////P14~7.
//uchar code fj2[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; ////P14~7.
uchar rate ;
void delay(BYTE ms)
{ // 延时子程序
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
WDT_COUTR =0X3f; //3F <10S //0X3C < 1S//小狗狗乖
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void delay2()
{
uchar k,t;
k = rate;
t = 0x00;
do{
do{ _nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}while(--t);
}while(--k);
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
uchar i;
for (i=0; i<8; i++) //一个周期转30度
{
P1 = FFW[i]; //取数据
delay2(); //调节转速
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
BYTE i;
lcd_init(); // 初始化LCD
delay(10);
delaymma(7);
for(m=0;m<3;m++)
{
lcd_pos(0); // 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != '\\0')
{ // 显示字符"jrcsh"
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40); // 设置显示位置为第二行第二个字符
i = 0;
while(dis2[i] != '\\0')
{
lcd_wdat(dis2[i]); // 显示字符" jrcsh@qq "
i++;
}
delaymma(800);
for(i=0;i<80;i++)
{
lcd_pos(i);
lcd_wdat(' ');
}
delaymma(560);
}// for m
lcd_pos(0); // 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != '\\0')
{ // 显示字符"jrcsh"
lcd_wdat(dis1[i]);
delaymma(100);
i++;
}
lcd_pos(0x40); // 设置显示位置为第二行第二个字符
i = 0;
while(dis2[i] != '\\0')
{
lcd_wdat(dis2[i]); // 显示字符" jrcsh@qq "
delaymma(200);
i++;
}
delaymma(800);
for(i=0;i<80;i++)
{
lcd_pos(i);
lcd_wdat(' ');
}
// 显示"-"
TMOD = 0x11;
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;//开定时器0中断
TH0 = 0x28;
TL0 = 0x00;
TH1 = 0x28;
TL1 = 0x00;
TR1=1;
TR0=1;//定时器开
//TR0=0;//停定时器0
P1=0xff;
d1=1;
m2=0;
m1=0;
h1=0;
s1=0;
a1=0;
a2=1;
i1=0;
/*
for(m=0;m<4;m++)
{
for(m1=0;m1<20;m1++)
{
cl[m][m1]=m1+m*10;
}
}
*/
m1=0;
dis_buf[0] = dis_code[h1 / 10]; // 时十位
dis_buf[1] = dis_code[h1 % 10]; // 时个位
dis_buf[3] = dis_code[m1 / 10]; // 分十位
dis_buf[4] = dis_code[m1 % 10]; // 分个位
dis_buf[6] = dis_code[s1 / 10]; // 秒十位
dis_buf[7] = dis_code[s1 % 10]; // 秒个位
dis_buf[2] = ':'; // 显示"-"
dis_buf[5] = ':';
/*
lcd_pos(8);
lcd_wdat(' ');
lcd_pos(7);
lcd_wdat(' ');
for(i=64;i<80;i++)
{
lcd_pos(i);
lcd_wdat(' ');
}
*/
aa=0;
rate = 0x10;
b1=1;
b2=1;
d1=0;
while(1)
{
WDT_COUTR =0X3f; //3F <10S //0X3C < 1S//小狗狗乖
//---------------------------------------
if(key1==0)
{
aa=99;
}
if(aa==99)
{
b1++;
motor_ffw();
if(rate>2)
rate--;
}
if(b1 > 4)
{
if(rate>2)
rate--;
if(key1==1)
{
b1=1;
aa=0;
P1=0xff;
rate = 0x10;
}
}
//---------------------------------------
//0000000000000000000000000000000000
if(a1==0)
{
if(a2==1)
{
lcd_pos(0);
lcd_wdat(' ');
}
if(a2==0)
{
lcd_pos(6);
lcd_wdat(' ');
}
/*
lcd_pos(a2); // 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != '\\0')
{ // 显示字符"jrcsh"
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40); // 设置显示位置为第二行第二个字符
i = 0;
while(dis2[i] != '\\0')
{
lcd_wdat(dis2[i]); // 显示字符" jrcsh@qq "
i++;
}
*/
xs();
/*
lcd_pos(0x43); // 设置显示位置为第二行第二个字符
i = 0;
while(i<4)
{
m=dis_code[cl[i][i1] / 10];
lcd_wdat(m); // 策略显示
m=dis_code[cl[i][i1] % 10];
lcd_wdat(m); // 策略显示
lcd_wdat('-');
i++;
}
*/
a1=1;
}//a1=0
//时间设定部分-----------------------------------
if(key2==0)
{
delaymma(7);
while(!key2)
delaymma(7);
h1++;
xs();
}
if(key3==0)
{
delaymma(7);
while(!key3)
delaymma(7);
h1--;
xs();
}
if(key4==0)
{
delaymma(7);
while(!key4)
delaymma(7);
m1++;
xs();
}
if(key5==0)
{
delaymma(7);
while(!key5)
delaymma(7);
m1--;
xs();
}
if(key6==0)
{
delaymma(17);
while(!key6)
delaymma(17);
d1=0;
xs();
}
//时间设定部分-----------------------------------
//工作记录显示===================================
//工作记录显示===================================
if(s1 > 59)
{
s1=0;
m1++;
dis_buf[3] = dis_code[m1 / 10]; // 分十位
dis_buf[4] = dis_code[m1 % 10]; // 分个位
}
if(m1 > 59)
{
m1=0;
h1++;
dis_buf[0] = dis_code[h1 / 10]; // 时十位
dis_buf[1] = dis_code[h1 % 10]; // 时个位
rate = 0x15;
if(h1<20) //定里处理部分--------------小于21点 大于 6点着手 每小时 放一次 食料 ---------------------
{
if(h1>5)
{
for(m=0;m<170;m++)
{
wy();
}
d1++;
}
}
}
if(h1 > 23)
{
h1=0;
}
if(a1==0)
{
akey() ;
dis_buf[0] = dis_code[h1 / 10]; // 时十位
dis_buf[1] = dis_code[h1 % 10]; // 时个位
dis_buf[3] = dis_code[m1 / 10]; // 分十位
dis_buf[4] = dis_code[m1 % 10]; // 分个位
}//a1
//0000000000000000000000000000000000000000000
} // wa
}//ma
/********************************************************/
void delaymma(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void akey(void)
{
/*
if(key1==0)
{
while(!key1)
a1++;
if(a1 > 99)
{
a1 =0;
}
delaymma(100);
}
if(key2==0)
{
while(!key1)
a1--;
if(a1 < 1)
{
a1 =99;
}
delaymma(100);
}
*/
}
void timer0() interrupt 1
{
TH0 = 0x28;
TL0 = 0x00;
ty=ty++;
if(ty > 20)
{
ty=0;
s1=s1++;
}
}
void timer1() interrupt 3
{
TR1=1;
TH1 = 0x28;
TL1 = 0x00;
ty1=ty1++;
WDT_COUTR =0X3f; //3F <10S //0X3C < 1S//小狗狗乖
if(ty1 > 20)
{
dis_buf2[0] = dis_code[d1 / 10]; // 时十位
dis_buf2[1] = dis_code[d1 % 10]; // 时个位
dis_buf[6] = dis_code[s1 / 10]; // 秒十位
dis_buf[7] = dis_code[s1 % 10]; // 秒个位
a1=0;
ty1=0;
if(a2==0)
{
a2=1;
}
else
{
a2=0;
}
}
}
void wy()
{
WDT_COUTR =0X3f; //3F <10S //0X3C < 1S//小狗狗乖
motor_ffw();
P1=0xff;
if(rate>2)
rate--;
}
void xs()
{
uchar i;
lcd_pos(8); // 设置显示位置为第一行的第9个字符
i = 0;
while(i<8)
{
lcd_wdat(dis_buf[i]);
i++;
}
lcd_pos(0x43); // 设置显示位置为第二行第二个字符
lcd_wdat('W');
lcd_wdat('Y');
lcd_wdat('=');
lcd_wdat(dis_buf2[0]); // 策略显示
lcd_wdat(dis_buf2[1]); // 策略显示
}
/*
key 1 电机转动
2 小时 ++
3 小时 --
4 分钟 ++
5分钟 --
6 喂食次数 归0
*/