51单片机想把得到的一组数据,包括计时时间和电压,这最后得到的这组数据保存在24c02中,在下次上电后,通过在串口把数据发送出去这一段功能的实现程序,并仔细解释一下
时间: 2024-03-20 22:40:45 浏览: 151
下面是一段51单片机的程序,可以实现将计时时间和电压数据保存在24c02中,并在下次上电后通过串口发送出去。
```
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit SDA=P0^0; //I2C总线SDA引脚定义
sbit SCL=P0^1; //I2C总线SCL引脚定义
//24C02芯片的写函数
void AT24C02_Write(uchar addr,uchar dat)
{
uchar ack;
//发送起始信号
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
_nop_();
//发送器件地址和写命令
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
SCL=0;
_nop_();
//发送数据地址
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=addr;
_nop_();
SCL=0;
_nop_();
//发送数据
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=dat;
_nop_();
SCL=0;
_nop_();
//发送停止信号
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
ack=SDA;
_nop_();
}
//24C02芯片的读函数
uchar AT24C02_Read(uchar addr)
{
uchar dat;
//发送起始信号
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
_nop_();
//发送器件地址和写命令
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
SCL=0;
_nop_();
//发送数据地址
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=addr;
_nop_();
SCL=0;
_nop_();
//重新发送起始信号
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
_nop_();
//发送器件地址和读命令
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
SCL=0;
_nop_();
//读数据
SDA=1;
_nop_();
SCL=1;
_nop_();
dat=SDA;
_nop_();
SCL=0;
_nop_();
//发送停止信号
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
return dat;
}
//串口初始化函数
void UART_Init()
{
TMOD=0x20; //定时器1工作在方式2,自动重载
TH1=0xFD; //波特率为9600
TL1=0xFD;
TR1=1; //启动定时器1
SM0=0; //波特率不加倍
SM1=1;
REN=1; //启动串口接收
EA=1; //开总中断
ES=1; //开串口中断
}
//串口发送函数
void UART_Send(uchar dat)
{
SBUF=dat; //将数据写入发送缓冲区
while(!TI); //等待发送完成
TI=0; //清除发送完成标志位
}
//主函数
void main()
{
uchar time_h,time_l,voltage;
uint time;
//计时器初始化
TMOD=0x01; //定时器0工作在方式1,计时器模式
TH0=0x00; //定时器初值为0
TL0=0x00;
TR0=1; //启动定时器0
//ADC初始化
ADC_CONTR=0x83; //ADC工作在单次转换模式,ADC时钟频率为2分频
//串口初始化
UART_Init();
//读取保存的数据
time_h=AT24C02_Read(0x00);
time_l=AT24C02_Read(0x01);
voltage=AT24C02_Read(0x02);
time=(time_h<<8)|time_l;
//将计时时间和电压数据发送到串口
printf("Time:%d Voltage:%d\r\n",time,voltage);
//将当前时间和电压数据保存到24C02
AT24C02_Write(0x00,TH0);
AT24C02_Write(0x01,TL0);
AT24C02_Write(0x02,ADC_RES);
//等待一段时间
Delay(1000);
}
//串口中断处理函数
void UART_ISR() interrupt 4
{
uchar dat;
if(RI) //接收中断
{
RI=0; //清除接收中断标志位
dat=SBUF; //读取接收到的数据
//处理接收到的数据
}
if(TI) //发送中断
{
TI=0; //清除发送中断标志位
}
}
```
该程序的主要功能是将计时时间和电压数据保存在24c02中,并在下次上电后通过串口发送出去。程序的流程如下:
1. 计时器和ADC初始化。
2. 从24c02中读取保存的计时时间和电压数据。
3. 将读取到的计时时间和电压数据发送到串口。
4. 将当前时间和电压数据保存到24c02。
5. 延时一段时间。
6. 回到第2步,循环执行。
在程序中,使用了两个函数AT24C02_Write和AT24C02_Read来实现对24c02芯片的读和写操作。其中,AT24C02_Write函数用于将数据写入24c02中,AT24C02_Read函数用于从24c02中读取数据。程序中还使用了串口发送函数UART_Send和串口初始化函数UART_Init来实现串口通信。最后,在中断处理函数UART_ISR中可以对接收到的数据进行处理。
阅读全文
相关推荐
















