标题:
51单片机自动喂食器代码与Proteus仿真图
[打印本页]
作者:
JN0717
时间:
2022-5-13 17:07
标题:
51单片机自动喂食器代码与Proteus仿真图
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
(79.76 KB, 下载次数: 58)
下载附件
2022-5-13 20:42 上传
单片机源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar ms,miao,fen,shi,shi_n=0,fen_n=1,miao_n;
uchar mos;
uchar mm,mm_d;
uchar shu,g;
bit aa,zi_d,shijian;
sbit rs = P2^0;
sbit rw = P2^1;
sbit e = P2^2;
sbit led=P3^7;
sbit k1=P2^3;
sbit k2=P2^4;
sbit k3=P2^5;
sbit k4=P2^6;
sbit k5=P2^7;
sbit T_CLK = P3^6; /*实时时钟时钟线引脚 */
sbit T_IO = P3^7; /*实时时钟数据线引脚 */
sbit T_RST = P3^5; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
uchar code FFW[]=
{
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};
uchar code REV[]=
{
0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
};
void delay(uchar m)
{
uchar i;
while(m--)
{
for(i = 0 ; i<250;i++) ;
}
}
void xiezhilin(uchar zhilin)
{
rs = 0 ;
rw = 0 ;
e = 0 ;
P0 = zhilin ;
delay(1);
e = 1 ;
delay(1);
e = 0 ;
}
void xiesu(uchar suzi)
{
rs = 1 ;
rw = 0 ;
e = 0 ;
P0 = suzi ;
delay(1);
e = 1 ;
delay(1);
e = 0 ;
}
void xianshi(uchar dizhi, uchar suzi)
{
xiezhilin(dizhi);
xiesu(suzi);
}
void xian()
{
if(zi_d==0)
{
xianshi(0x80+0x40+1,'Z');
}
else
{
xianshi(0x80+0x40+1,'S');
}
if((mos==1)&&(aa==1))
{
xianshi(0x80+4,' ');
xianshi(0x80+5,' ');
}
else
{
xianshi(0x80+4,0x30+shi_n%100/10);
xianshi(0x80+5,0x30+shi_n%10);
}
xianshi(0x80+6,':');
if((mos==2)&&(aa==1))
{
xianshi(0x80+7,' ');
xianshi(0x80+8,' ');
}
else
{
xianshi(0x80+7,0x30+fen_n%100/10);
xianshi(0x80+8,0x30+fen_n%10);
}
xianshi(0x80+9,':');
if((mos==3)&&(aa==1))
{
xianshi(0x80+10,' ');
xianshi(0x80+11,' ');
}
else
{
xianshi(0x80+10,0x30+miao_n%100/10);
xianshi(0x80+11,0x30+miao_n%10);
}
if((mos==4)&&(aa==1))
{
xianshi(0x80+0x40+4,' ');
xianshi(0x80+0x40+5,' ');
}
else
{
xianshi(0x80+0x40+4,0x30+shi%100/10);
xianshi(0x80+0x40+5,0x30+shi%10);
}
xianshi(0x80+0x40+6,':');
if((mos==5)&&(aa==1))
{
xianshi(0x80+0x40+7,' ');
xianshi(0x80+0x40+8,' ');
}
else
{
xianshi(0x80+0x40+7,0x30+fen%100/10);
xianshi(0x80+0x40+8,0x30+fen%10);
}
xianshi(0x80+0x40+9,':');
xianshi(0x80+0x40+10,0x30+miao%100/10);
xianshi(0x80+0x40+11,0x30+miao%10);
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void z_zhuan()
{
xianshi(0x80+0x40+15,'Z');
SendByte('Z');
for(mm_d=0;mm_d<24;mm_d++)
{
P1=FFW[mm];
delay(20);
mm++;
if(mm>7) {mm=0;}
}
P1=0x09;
xianshi(0x80+0x40+15,' ');
}
void f_zhuan()
{
xianshi(0x80+0x40+15,'F');
SendByte('F');
for(mm_d=0;mm_d<24;mm_d++)
{
P1=REV[mm];
delay(20);
mm++;
if(mm>7) {mm=0;}
}
P1=0x09;
xianshi(0x80+0x40+15,' ');
}
void v_RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
void dushi(void)
{
g=uc_R1302(0x81);
miao=g&0x70;
miao=miao>>4;
miao=(miao*10)+(g&0x0f);
g=uc_R1302(0x83);
fen=g&0x70;
fen=fen>>4;
fen=(fen*10)+(g&0x0f);
g=uc_R1302(0x85);
shi=g&0x70;
shi=shi>>4;
shi=(shi*10)+(g&0x0f);
}
void xieshi(void)
{
v_W1302(0x8E,0x00);//打开寄存器
g=miao%100/10;
g=g<<4;
shu=g|(miao%10);
v_W1302(0x80,shu);
g=fen%100/10;
g=g<<4;
shu=g|(fen%10);
v_W1302(0x82,shu);
g=shi%100/10;
g=g<<4;
shu=g|(shi%10);
v_W1302(0x84,shu);
v_W1302(0x8E,0x80); //guan
}
void key()
{
if(k1==0)
{
delay(5);
if(k1==0)
{
zi_d=0;
ES = 1;
while(!k1);
}
}
if(k2==0)
{
delay(5);
if(k2==0)
{
zi_d=1;
while(!k2);
}
}
if(zi_d==0)
{
if(k3==0)
{
delay(5);
if(k3==0)
{
mos++;if(mos==6) mos=0;
while(!k3);
}
}
if(mos!=0)
{
if(k4==0)
{
delay(5);
if(k4==0)
{
if(mos==1){shi_n++;if(shi_n==24)shi_n=0;}
if(mos==2){fen_n++;if(fen_n==60)fen_n=0;}
if(mos==3){miao_n++;if(miao_n==60)miao_n=0;}
if(mos==4){shi++;if(shi==24)shi=0;}
if(mos==5){fen++;if(fen==60)fen=0;}
xieshi();
while(!k4);
}
}
if(k5==0)
{
delay(5);
if(k5==0)
{
if(mos==1){if(shi_n==0)shi_n=24; shi_n--;}
if(mos==2){if(fen_n==0)fen_n=60; fen_n--;}
if(mos==3){if(miao_n==0)miao_n=60; miao_n--;}
if(mos==4){if(shi==0)shi=24; shi--;}
if(mos==5){if(fen==0)fen=60; fen--;}
xieshi();
while(!k5);
}
}
}
}
else
{
if(k4==0)
{
delay(5);
if(k4==0)
{
z_zhuan();
while(!k4);
}
}
if(k5==0)
{
delay(5);
if(k5==0)
{
f_zhuan();
while(!k5);
}
}
}
}
void main()
{
xiezhilin(0x01); //显示清屏
xiezhilin(0x38); //显示模式设置
xiezhilin(0x0c); //光标设置
TH1 = 0xFD; //晶振11.0592mhz 波特率设为9600
TL1 = 0xFD;
TMOD = 0x21; //定时器1方式2
SCON = 0x50; //串口接收使能
ES = 0; //串口中断使能 //使用外中断函数必须ES为0
TR1 = 1; //定时器1使能
TI = 0; //发送中断标记位,必须设置
EA = 1;
xianshi(0x80+0,'m');
xianshi(0x80+1,'o');
xianshi(0x80+2,'s');
xianshi(0x80+14,'D');
xianshi(0x80+15,'Y');
dushi();
shijian=1;
while(1)
{
ms++;
if(ms>=5){aa=~aa;ms=0;dushi();}
if(shu=='Z')z_zhuan();
if(shu=='F')f_zhuan();
shu=0;
key();
xian();
if((shi==shi_n)&&(fen==fen_n)&&(miao==miao_n))
{
shijian=1;
}
if(shijian==1)
{
z_zhuan();
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
delay(100);
dushi();
xian();
f_zhuan();
shijian=0;
}
}
}
void getch(void) interrupt 4
{
if(RI==1)
{
RI=0;
shu=SBUF;
led=~led;
}
}
复制代码
Keil5代码与Proteus8.8仿真下载:
http://www.51hei.com/bbs/dpj-220178-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1