📄 采集部分程序.c
字号:
#include<reg51.h>
#include<intrins.h>
/***********
晶振用14.31818M
*************/
#define uchar unsigned char
#define uint unsigned int include
sbit ST=P0^3;
sbit OE=P0^4;
sbit EOC=P0^2;
sbit SCL=P0^0; //I2C 时钟
sbit SDA=P0^1; //I2C 数据
sbit EROM=P0^6; //使能ROM操作
sbit key=P0^5; //E2PROM存储控制
sbit key2= P0^7; //E2PROM读取控制
#define bo1200 0xC2; //波特率1200
#define bo2400 0xE1; //波特率2400
//unsigned char v[4],VVP; //保存最大值和最小值
unsigned int k1=0;
unsigned int k2=0;
unsigned int mun;
void init_T1(void) //串口初始化
{
EA=0; //暂时关闭中断
TMOD&=0x0F; //定时器1模式控制在高4位
TMOD|=0x20; //定时器1工作在模式2,自动重装模式
SCON=0x50; //串口工作在模式1
TH1=bo1200; //计算定时器重装值bo1200=0xe6;bo2400=0xF3
TL1=bo1200;
PCON|=0x80; //串口波特率加倍
// ES=1; //串行中断允许
TR1=1; //启动定时器1
// REN=1; //允许接收
EA=1; //允许中断
TI=0;
RI=0;
}
void trans(unsigned char dat) //串口发送函数
{
SBUF=dat;
while(!TI);
TI=0;
}
void Delay(unsigned int i)//延时函数
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void delay_us()
{
_nop_(); /*起始条件建立时间大于4.7us,延时*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay_ms()
{
unsigned int i;
for(i=0;i<20000;i++);
}
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
delay_us();
SCL=1;
delay_us();
SDA=0; /*发送起始信号*/
delay_us();
}
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
delay_us();
SCL=1;
delay_us();
SDA=1; /*发送I2C总线结束信号*/
delay_us();
}
void Ack_I2c() //应答函数
{
uchar i=0;
SCL=1;
delay_us();
while(SDA==1&&i<200)
i++;
SCL=0;
delay_us();
}
void No_ack() //非应答函数
{
SDA=1;
delay_us();
SCL=1;
delay_us();
SCL=0;
delay_us();
}
void init()
{
SDA=1;
SCL=1;
}
void wr_byte(uchar date) //写一个字节,该函数将数据写入24C02
{
uchar i;
SCL=0; //IC总线在写数据时,在时钟低电平的时候改变数据,高电平的时候传送数据
delay_us();
for(i=0;i<8;i++) /*要传送的数据长度为8位*/
{
if((date<<i)&0x80)
SDA=1; /*判断发送位*/
else
SDA=0;
delay_us();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
//IC总线在写数据时,在时钟低电平的时候改变数据,高电平的时候传送数据
delay_us();
SCL=0;
delay_us();
}
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
delay_us();
}
uchar re_byte() //读一个字节,该函数将数据读出24C02
{
uchar i,temp=0;
SCL=0;
delay_us();
SDA=1;
delay_us();
for(i=0;i<8;i++)
{
temp<<=1;
if(SDA)
{
temp|=0x01;
}
SCL=1;
delay_us();
SCL=0;
}
return temp;
}
void write(uchar add,uchar dat)
{
init();
Start_I2c();
wr_byte(0xa0);
Ack_I2c();
wr_byte(add);
Ack_I2c();
wr_byte(dat);
Ack_I2c();
Stop_I2c();
}
uchar read(uchar add)
{
uchar value;
init();
Start_I2c();
wr_byte(0xa0); //写器件地址,前面四位是芯片24C02本身确定的,它不变,之后三位是引脚地址,因为我们都接地了,所以这三位都为0,最后一位位读写位,写的话为0,读为1
Ack_I2c();
wr_byte(add); //希望写到哪个地址
Ack_I2c();
Start_I2c();
wr_byte(0xa1); //写数据
Ack_I2c();
value=re_byte();
No_ack();
Stop_I2c();
return value;
}
void main()
{
P2=0XFF;
P1=0xFF;
P0=0XFF;
delay_ms();
init_T1(); //设置串口发送波特率
ST=0;
Delay(5);
ST=1; //清空AD寄存器
Delay(5);
k1=0;
k2=0;
while(1)
{
ST=0; //开启转换
while(!EOC);
OE=1;
mun=P1;
P2=mun;
OE=0;
ST=1;
// Delay(1); //如果实物不稳定,可以用这个延迟试试
while((!key)&&(!EROM)) //开关KEY闭合 ,进行EPROM存储
{
ST=0; //开启转换
while(!EOC);
OE=1;
P1=0xff;
mun=P1;
P2=mun;
if(k1<254)
write(k1++,mun);
OE=0;
ST=1; //关闭转换
Delay(1); // 如果实物不稳定,可以用这个延迟试试 ,否则去掉,以免影响速度
k2=0;
}
while((!key2)&&(!EROM)) //当KEY2按下,开始 读取EPROM数据,并串口发送出去
{
if(k2<254)
{
mun=read(k2++); //读取EPROM中的数据
P2=mun; // 用P2口发送给单片机B进行显示
trans(mun); // 用串口发送出去
k1=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -