标题:
全自动绕线机程序
[打印本页]
作者:
das
时间:
2015-4-5 00:47
标题:
全自动绕线机程序
该程序主要运用了键盘扫描技术和EEROM存储器编程,做到把键盘值输入到存储器中,不怕掉电。基于WICN单片机开发板设计。
主程序
//--------------------- 半自动绕线机程序 ----------------------
//-----------------芯片STC89C52RC 晶振11.0592M ----------------
//---------------------计数值范围1~22圈-----------------------
#include<reg52.h>
#include"24c01.c"
#include"stopgo.c"
#include"jishuan.c"
#include"lcd1602.c"
#include"startgo.c"
//-------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//-------------------------------------------------------------
sbit K1=P0^0; //数字输入键个位数
sbit K2=P0^1; //数字输入键十位数
sbit K3=P0^2; //输入功能并以IIC存入AT24C01中保存
sbit K4=P0^3; //确认存入数据键
sbit K5=P0^4; //停止键
sbit beep=P3^3;
sbit CLK=P1^2; //光电感应脉冲(用该开关模仿)
sbit LE_LED=P3^4;
sbit LED=P1^5;
//-------------------------------------------------------------
//-------------------------------------------------------------
uchar tablee[2];
//------按键延时-----------------------------------------------
void delayx(uint i)
{
uint w;
for(w=0;w<i;w++);
}
//-------------------------------------------------------------
void start_ggo(uchar b) //打线执行程序
{
uchar d=0;
uchar n=0;
while(n<=b)
{
LCD1602(n); //显示
if(!CLK)
{
delayx(500);
while(CLK==0);
n++;
LED=0;
beep=0;
delayx(10000);
LED=1;
beep=1;
}
}
}
//------------------------------------------------------------
//-------------------------------------------------------------
//------------------数据键盘按键扫描---------------------------
void main()
{
uchar h,f;
uchar e=30;
uchar id0=0;
uchar id1=0;
LE_LED=0;
while(1)
{
if(!K1) //P0.0 K1=3
{
delayx(500);
while(K1==0);
beep=0;
delayx(5000);
beep=1;
tablee[0]=3;
if(id0==1)
{
tablee[1]=3;
id0=0;
}
id0++;
if(id0==2)id0=0;
}
//--------------------
if(!K2) //P0.1 K2=5
{
delayx(500);
while(K1==0);
beep=0;
delayx(5000);
beep=1;
tablee[1]=5;
if(id1==1)
{
tablee[0]=5;
id0=0;
}
id1++;
if(id1==2)id1=0;
}
//===========================================================
if(!K3)//确认输入到AT24C01中
{
delayx(500);
while(K3==0); //P0.2
beep=0;
delayx(5000);
beep=1;
jishuan(tablee[0],tablee[1]);
f=jishuan_ok();
init(); //24c01初始化
W_AT24C01(e,f);//写数据到AT24C01中,0x30是器件地址内存单元
}
if(!K4)//启动机器打线 P0.3
{
delayx(500);
while(K4==0);
beep=0;
delayx(5000);
beep=1;
init(); //24c01初始化
h=R_AT24C01(e); //读AT24C01中0x30的数据
LCD1602(h); //显示
//start_go(h); //启动执行打线功能并计数
start_ggo(h);
if(!K5) //如果停机键按下则执行停机功能
stop_go();
}
}
}
//---IIC AT24C01存储器读写操作程序-----------
#include <reg52.h>
#define uchar unsigned char
sbit SDA=P3^6;
sbit SCL=P3^7;
///------------------------------------------
void delay()
{ ; ; }
///////////////////////
void start()//起始信号
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
///////////////////////
void stop()//终止信号
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void respons()//应答信号,等待或者发送一个应答信号
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))i++;
SCL=0;
delay();
}
/*************************************************/
void init()//初始化
{
SDA=1;
SCL=1;
}
//////////////////////////////////////////////////
void write_byte(uchar date)//写一字节
{
uchar i;
SCL=0;
for(i=0;i<8;i++)
{
date=date<<1;
SDA=CY;
SCL=1;
delay();
SCL=0;
delay();
}
}
//------------------------------------------------
uchar read_byte()//读数据(也就是接收从器件传来的数据)
{
uchar i,k;
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
return k;
}
//////////////////////////////////////////////////
//=============AT24C01写操作=====================//
void W_AT24C01(uchar address,uchar date)//写数据
{
start();
write_byte(0xa0); //器件地址
respons();
write_byte(address);//器件内存地址 address
respons();
write_byte(date);//数据 date
respons();
stop();
}
//////////////////////////////////////////////////
//==============AT24C01读操作====================//
uchar R_AT24C01(uchar address)
{
uchar date;
start();
write_byte(0xa0);//写器件地址和写指令0XA0=10100000B最后一个零表示写,低电平有效
respons();
write_byte(address);////器件内存地址address
respons();
start();
write_byte(0xa1);//写器件地址和读指令0XA1=10100001B,最后一个1表示读,高电平有效
respons();
date=read_byte();
stop();
return date;
}
//------------------LCD1602显示程序(模块)--------------------
#include <reg52.h>
#define uchar unsigned char
///////////////LCD1602/////////////
sbit RS=P0^5;
sbit RW=P0^6;
sbit YE=P0^7;
/////////////////////////////////////////////////////////////
uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0,1,2,3
0x99,0x92,0x82,0xf8,//4,5,6,7
0x80,0x90,0xfe};//8,9,.,段码表
/////////////////////////////////////////////////////////////
uchar code table1[] ={"0123456789. -"};
uchar code table2[] ={"Temperature"};
uchar code table3[] ={" 123333 "};
/////////////////////////////////////////////////////////////
void delayy(unsigned int us)
{
while(us--);
}
////////////////////////////////////////////
void delay2()
{
RS=0;
RW=0;
YE=0;
delayy(5);
YE=1;
}
/******************************LCD1602液晶显示****************************/
void LCD1602(uchar dd)//dd是整数
{
uchar e,f,i,nem;
e=dd/10;
f=dd%10;
//////////////////////////////////////LCD屏初始化
P2=0x01; //清屏
delay2();
P2=0x38; //显示设定两行
delay2();
P2=0x0f; //打开显示和光标
delay2();
P2=0x06; //光标右移
delay2();
P2=0x80; //光标回到第一行的开头
delay2();
//////////////////////////////////////////
for(nem=0;nem<11;nem++)////////////温度英文字显示
{
P2=table2[nem];
RS=1;
RW=0;
YE=0;
delay2();
}
////////////////////////
P2=table1[e];
RS=1;
RW=0;
YE=0;
P2=0x06; //光标右移显示整数十位
delay2();
////////////////////////
P2=table1[f];
RS=1;
RW=0;
YE=0;
P2=0x06; //光标右移显示整数个位
delay2();
/////////////////////////////////////////////////
P2=0xc0;//换行显示
delay2();
for(i=0;i<16;i++)
{
P2=0xc0;
delay2();
P2=table3[i];
RS=1;
RW=0;
YE=0;
}
}
//-----------数据计算程序--------------
#define uchar unsigned char
static uchar j=0;
///----------------------------------------------------
void jishuan(uchar i,uchar e) //i为十位,e为个位
{
j=((i*10)+e);
}
///-----------------------------------------------------
uchar jishuan_ok()
{
return (j);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1