OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5311|回复: 7

一个AT24C02和串口的程序,请教前辈们2个问题

[复制链接]

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-3-29
在线时间
0 小时
发表于 2015-4-19 17:25:24 | 显示全部楼层 |阅读模式
5金钱
*************************************程序************************************************
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num1,b,flag;
uchar num2,num3,num4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};


sbit sda=P3^5;
sbit scl=P3^6;
sbit key=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;
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;
delay();
scl=1;
delay();
SCON=0x50;
TMOD=0x20;
TL1=0xFa;
TH1=0XFa;
TR1=1;
ES=1;
EA=1;
num1=44;
}


void write_byte(uchar date)
{
uchar i,temp;
temp=date;




for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
//scl=0;
// delay();
}
scl=0;
delay();
sda=1;
delay();
}


uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}


void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}


void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}


uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void display(uchar shi_h,uchar ge_h)
{
P2=0xfb;
P0=table[ge_h];
delay1(5);

P2=0xf7;
P0=table[shi_h];
delay1(5);

shi_h=num1/10;
ge_h=num1%10;


}


void keyscan()
{
if(key1==0)
{
delay1(5);
if(key1==0)



flag=1;
ES=0;
SBUF=num1;
delay1(500);
while(!TI);
TI=0;
ES=1;
while(!key1);

}
}
if(key==0)
{
delay1(5);


}
}


void main()
{

init();

num1=read_add(1);
write_add(1,num1); 
while(1)
{
keyscan();
if(flag==1)
display(num1/10,num1%10);




}
}


void ser()interrupt 4
{
while(RI!=1);
RI=0;
b=SBUF;

}


*****************************************************************************************************
结果串口发送的num1是在串口在助手显示的是“,”
另外请教前辈们 我要写入三个英文字符进AT24C02而且同样可以用串口发出来的应该怎么写 弄了2天了还是弄不出来。求指教

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-4-19 18:57:24 | 显示全部楼层
可以用原子哥的串口调试组件USMART,论坛有下载
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-3-29
在线时间
0 小时
 楼主| 发表于 2015-4-19 21:13:56 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num1,b,flag;
uchar code table_2[]="郑更濠";
uchar code table_1[]="44";
uchar data table_3[2];
uchar data table_4[6];
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

sbit sda=P3^5;
sbit scl=P3^6;
sbit key=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;
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;
delay();
scl=1;
delay();
SCON=0x50;
TMOD=0x20;
TL1=0xFa;
TH1=0XFa;
TR1=1;
ES=1;
EA=1;
num1=44;
}

void write_byte(uchar date)
{
uchar i,temp;
temp=date;


for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
    delay();
sda=CY;
delay();
scl=1;
delay();
// scl=0;
     //   delay();
}
scl=0;
delay();
sda=1;
delay();
}

uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}

void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
 for(b=100;b>0;b--);
}

void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}

uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void display(uchar shi_h,uchar ge_h)
{
P2=0xfb;
P0=table[ge_h];
delay1(5);

P2=0xf7;
P0=table[shi_h];
delay1(5);

shi_h=num1/10;
ge_h=num1%10;

}

void keyscan()
{
uchar i;
if(key1==0)
{
delay1(5);
if(key1==0)
{    
for(i=0;i<2;i++)
{
write_add(0x01+i,table_1);
flag=1;
ES=0;
SBUF=table_3;
delay1(500);
while(!TI);
TI=0;
}
ES=1;
while(!key1);
delay1(500);
while(!key1);
}
}
if(key==0)
{
delay1(5);
if(key==0)
{    
for(i=0;i<6;i++)
{
write_add(0x05+i,table_2);
ES=0;
SBUF=table_4;
delay1(500);
while(!TI);
TI=0;
}
ES=1;
while(!key);
delay1(500);
while(!key);
}
}
}

void main()
{
uchar i,t;
init();

for(i=0;i<2;i++)
table_3=read_add(0x01+i);
num1=atoi(table_3);
for(t=0;t<6;t++)
table_4[t]=read_add(0x05+t); 
while(1)
{

keyscan();
if(flag==1)
display(num1/10,num1%10);


}
}

void ser()interrupt 4
{
while(RI!=1);
RI=0;
b=SBUF;

}

**************************************************************************************************
这个今晚调出来的 把num1=44换成table_1[]="44"两个字节写进去 然后再把字符串用atoi转换成数字给num1 。程序大部分功能能实现,只不过是名字发到串口助手上还是会有些乱码而已。
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-4-19 22:02:42 | 显示全部楼层
回复【3楼】勤奋的菜鸟:
---------------------------------
你串口能正常打印东西啵?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-3-29
在线时间
0 小时
 楼主| 发表于 2015-4-20 09:03:30 | 显示全部楼层
回复【4楼】八度空间:
---------------------------------
对的 可以正常打印
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-4-20 19:46:51 | 显示全部楼层
回复【5楼】勤奋的菜鸟:
---------------------------------
仔细看下程序还有什么地方不对吧,IIC这东西时序对了都好办
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

22

主题

106

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2016-8-20
在线时间
91 小时
发表于 2016-8-26 20:43:30 | 显示全部楼层
存储芯片好像不支持英文存储吧!你可以吧英文转换成ASCII码(即十六进制)存入24C02,在把ASCII吗读出来写入SBUF发给电脑,电脑串口工具以ASCII码显示
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-8-31 22:49:21 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表