/*C51单片机学习打卡*/

/*观看郭天祥老师教学视频,使用普中科技51单片机开发板进行学习(I^2)C总线操作*/

/*功能:在开发版上进行999秒计时,在单片机掉电情况下可以记录最后一秒的数据*/

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit SDK=P2^0;
sbit SCL=P2^1;
void Delayms(uint xms);      //延时xms
void delay();      //延时几微秒
void Display(uchar x,uchar y);     //数码管显示函数,y为显示的数码管位数,x为显示的内容
void Initialize();            //初始化函数
void Start();               //起始函数
void Response();                  //应答函数
void Stop();                     //停止函数,表示全部数据已经发送完成
void Write_bite(uchar date);               //写一个字节的数据(一个字节八个位)
uchar Read_bite();                        //读取一个字节的数据(一个字节八个位)
void Write_address(uchar address,uchar date);      //写数据
uchar Read_address(uchar date);            //读数据

uchar num,hundred,ten,digit,write;
uint temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
                      0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,
                      0x39,0x5e,0x79,0x71};//显示0~F的值

void main()
{
    Initialize();
//    Write_address(2,5);
//    Delayms(10);
    temp=Read_address(2);
    if(temp>1)
        temp=0;
    while(1)
    {    
        hundred=temp/100;
        ten=temp%100/10;
        digit=temp%10;
        Display(hundred,4);
        Display(ten,3);
        Display(digit,2);
        if(write==1)
            {
                write=0;
                Write_address(2,temp);
            }
    }

}

void T0_Timer() interrupt 1          //每50ms溢出一次
{
    TH0=(65536-46080)/256;
    TL0=(65536-46080)%256;
    num++;
    if(num==20)
        {
            num=0;
        temp++;
            write=1;
            if(temp>999)
                temp=0;    
        }

}

void Display(uchar x,uchar y)
{
    switch(y)
    {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位    
    }
       P0=table[x];
    Delayms(10);
    P0=0x00;

}

void delay()      //延时几微秒

    ;
    ; 
}

void Delayms(uint xms)      //延时xms
{
    uint i;
    uchar j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);    
}

void Initialize()            //初始化函数
{
    SCL=1;                     //初始化时已经默认SCL与SDK为高电平,在之后的程序编写时,理应注意这点
    delay();                  //我觉得这个初始化完全没有意义,所需要的SCL和SDK的定义都会在其他子函数中,得到定义
    SDK=1;                      //最多只是为了确定一个初态
    delay();

TMOD=0x01;                    //定时器0设定
    TH0=(65536-46080)/256;
    TL0=(65536-46080)%256;
    EA=1;                       //开总中断
    ET0=1;                       //开定时器0中断
    ET1=1;                        //启动定时器0
    TR0=1;
    
         
    temp=0;
    num=0;
}

void Start()               //开始信号
{
    SDK=1;                  //在SCL为高电平时,SDK由高电平变为低电平,即为开始信号
    delay();
    SCL=1;                  //增强程序的移植性,虽然初始化时已经将SDK和SCL拉为高电平
    delay();
    SDK=0;
    delay();

}

void Responses()                  //应答信号
{                                     //前提是SDK此时已经为高电平
    uchar i;                        
    SCL=1;                           //应答信号:在SCL时钟线是高电平的前提下,SDK数据线由高电平转化为低电平
    delay();                       //若已经完成数据写入操作,SDK理应被拉成高电平
    while((SDK==1)&&(i<250))       //SDK被拉为0,【或SDK没有被拉为0,而程序在此停留到i==250时表示应答(无应答表示默认收到数据)】
        i++;                       //注:按照本次设计,方括号内情况不应出现,但为了严谨性,故加以编写
    SCL=0;                           //将SCL拉为低电平,使下一步子函数操作更清晰
    delay();
}

void Stop()                     //停止信号,表示全部数据已经发送完成
{
    SDK=0;                     //当SCL为高电平时,SDK由低电平变为高电平,表示全部数据已经发送完毕,即停止信号
    delay();
    SCL=1;
    delay();
    SDK=1;
    delay();
}

void Write_byte(uchar date)               //写一个字节的数据(一个字节八个位)
{
    uchar temp,i;
    temp=date;
    for(i=8;i>0;i--)
    {                           //时钟信号为高点平时,SDK数据线上的信号不允许改变
        temp=temp<<1;           //而此时SDK是高电平还是低电平,并不影响
        SCL=0;                   //将时钟信号改为低电平,此时SDK数据线可以开始写入数据
        delay();
        SDK=CY;                    //SDK按位写入数据
        delay();
        SCL=1;                    //SCL时钟信号拉为高电平,关闭数据写入
        delay();

}
    SCL=0;                       //注意:不明白为何要拉为低电平,应答信号时又拉成高电平,似是前后矛盾,可能是写入完成的标志
    delay();
    SDK=1;                       //恢复初始化状态,为其他子函数的编写提供便利
    delay();
}

uchar Read_byte()                        //读取一个字节的数据(一个字节八个位)
{
    uchar k,i;
    SCL=0;
    delay();
//    SDK=1;
//    delay();
    for(i=8;i>0;i--)
    {
        SCL=1;                          //当SCL置高时,SDK不可改变
        delay();
        k=(k<<1)|SDK;                  // 此时用“移位”和“按位或”的方法,将SDK上的八位数据一位位的复制给变量k
        SCL=0;
        delay();
    }
    return k;
}

void Write_address(uchar address,uchar date)      //由时序图得
{
    Start();
    Write_byte(0xa0);
    Responses();
    Write_byte(address);
    Responses();
    Write_byte(date);
    Responses();
    Stop();
}

uchar Read_address(uchar address)              //由时序图得
{
    uchar date;
    Start();
    Write_byte(0xa0);
    Responses();

Write_byte(address);
    Responses();
    
    Start();
    Write_byte(0xa1);
    Responses();

date=Read_byte();
    Stop();
    return date;
        
}

使用普中科技51单片机进行(I^2)C总线操作相关推荐

  1. 普中科技51单片机的ADC采样电位器功能实现以及特点

    ADC模数转换的目的: **单片机能够接受和处理的数据都是离散的数字量,而不是连续的模拟量,**就和机器语言不能和普通语言一样通用,要先转换成单片机能够接受的数据,才能进行对模拟量数据(比如,温度,受 ...

  2. 普中科技51单片机_【笔记】普中科技-51单片机-静态数码管显示

    #include <reg51.h> #include <intrins.h> typedef unsigned char u8; typedef unsigned int u ...

  3. 基于普中科技的单片机开发实验仪编写的数字表

    基于普中科技的单片机开发实验仪编写的数字表 1.项目简单说明 一.显示日期,对ds1302芯片进行计时所得的日期用数码管进行显示: 二.显示温度,对18B20芯片测量所得的温度用数码管进行显示: 三. ...

  4. 普中科技stc89c52rc单片机烧写失败

    我在使用普中的stc89c52rc单片机时候遇到了烧写失败的情况,如图所示 尝试使用stc-isp 进行烧写时候一直显示正在检测目标单片机 我的解决办法: STC-ISP勾选使能6T(双倍速)模式 , ...

  5. 普中科技89c51单片机工程实训--音乐播放器

    对基于单片机的音乐播放器可应用于 mp3, MP4, 扩音器等很多 方面, 并可作为很多系统的辅助功能, 作为单片机的重要硬件资 源之一, 利用定时器可以产生各种固定频率的方波信号, 也可以 产生包括 ...

  6. 学习普中的51单片机TFT彩屏篇中遇到的问题和解决办法

    如果你出现了把程序下载到单片机中,但是TFT彩屏显示白屏,那你可以试试这个解决办法 检查一下该屏的驱动C文件中的tftlcd.H文件,看一下里面宏定义的显示屏型号是否跟你手中的显示屏型号一致,如果不一 ...

  7. 普中V2 51单片机 节拍器 仿真

    1.用单片机实现音乐节拍发生器: 2.用按键设置节拍(2/4:3/4:4/4): 3.用LED或LCD显示被选节奏的名称,速度: 4.用按键调节节拍速度: 5.用蜂鸣器发出强弱不同的拍(强,弱,弱为3 ...

  8. 普中科技51纯代码(流水灯)

    流水灯 1.点亮一个灯 2.一个灯闪烁 3.流水灯 4.灯左右来回流水 5.左右来回不定位平移 6.番外:蜂鸣器 7.流水灯+蜂鸣器 1.点亮一个灯 #include <reg51.h>s ...

  9. 普中科技51纯代码(按键)

    1.独立按键控制灯 #include <reg51.h>typedef unsigned char u8; typedef unsigned int u16;sbit led1=P0^0; ...

最新文章

  1. 数学建模中的matlab实例,matlab数学建模实例
  2. Mac OS Terminal 几个快捷键
  3. 面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...
  4. 实战 es6_Node.JS实战65:ES6新特性:箭头函数
  5. 第五六七章(PTA复习)
  6. Jetson nano jetpack4.5安装torch1.8.0 yolov5(遇到到报错和解决办法)
  7. c语言的编程特点,c语言编程是什么?C语言编程的特点和应用
  8. Springboot的Mybatis拦截器实现
  9. java菜鸟疑问1:为什么我的代码总出现cannot be resolved or is not a field这种问题
  10. windows7安装Bitvise开启SSH服务
  11. python录制音频
  12. 经典回味:ResNet到底在解决一个什么问题呢?
  13. 色织物数据集YDFID-1
  14. 【前端】解决盒子被撑大问题 box-sizing
  15. android实现仿真键盘(KeyboardView适配)
  16. linux宝塔重新安装,Linux服务器Windows系统 安装和卸载宝塔面板
  17. 如何搭建属于自己的腾讯云服务器
  18. CGAL的安装与在VS中的配置
  19. 【综合题】农民挤奶问题
  20. 浅谈游戏《超级马里奥:奥德赛》

热门文章

  1. homepod换wifi网络_HomePod怎么更换wifi?苹果HomePod更换无线网连接图文教程
  2. java课程设计 博客园_Java课程设计博客(团队)
  3. 如何使用活字格实现高效开发协同管理系统?
  4. 20130822-STM8L101F3P6的PD0使用异常,尚未解决~!
  5. GP技术的展望——先有鸿钧后有天
  6. Android VLC音频视频播发器快速集成教程与模块
  7. JS 事件高级(包括DOM事件流,阻止事件冒泡,阻止事件默认行为,,,以及对我来说,很好用的 事件代理)
  8. 上海交通大学c语言程序设计考试,2016年华东交通大学软件学院C语言程序设计考研复试题库...
  9. iOS意见反馈(邮箱反馈)
  10. 南京市区枪击案疑系双方开车斗气引发(图)-开车斗气-枪击-南京枪击案