使用普中科技51单片机进行(I^2)C总线操作
/*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总线操作相关推荐
- 普中科技51单片机的ADC采样电位器功能实现以及特点
ADC模数转换的目的: **单片机能够接受和处理的数据都是离散的数字量,而不是连续的模拟量,**就和机器语言不能和普通语言一样通用,要先转换成单片机能够接受的数据,才能进行对模拟量数据(比如,温度,受 ...
- 普中科技51单片机_【笔记】普中科技-51单片机-静态数码管显示
#include <reg51.h> #include <intrins.h> typedef unsigned char u8; typedef unsigned int u ...
- 基于普中科技的单片机开发实验仪编写的数字表
基于普中科技的单片机开发实验仪编写的数字表 1.项目简单说明 一.显示日期,对ds1302芯片进行计时所得的日期用数码管进行显示: 二.显示温度,对18B20芯片测量所得的温度用数码管进行显示: 三. ...
- 普中科技stc89c52rc单片机烧写失败
我在使用普中的stc89c52rc单片机时候遇到了烧写失败的情况,如图所示 尝试使用stc-isp 进行烧写时候一直显示正在检测目标单片机 我的解决办法: STC-ISP勾选使能6T(双倍速)模式 , ...
- 普中科技89c51单片机工程实训--音乐播放器
对基于单片机的音乐播放器可应用于 mp3, MP4, 扩音器等很多 方面, 并可作为很多系统的辅助功能, 作为单片机的重要硬件资 源之一, 利用定时器可以产生各种固定频率的方波信号, 也可以 产生包括 ...
- 学习普中的51单片机TFT彩屏篇中遇到的问题和解决办法
如果你出现了把程序下载到单片机中,但是TFT彩屏显示白屏,那你可以试试这个解决办法 检查一下该屏的驱动C文件中的tftlcd.H文件,看一下里面宏定义的显示屏型号是否跟你手中的显示屏型号一致,如果不一 ...
- 普中V2 51单片机 节拍器 仿真
1.用单片机实现音乐节拍发生器: 2.用按键设置节拍(2/4:3/4:4/4): 3.用LED或LCD显示被选节奏的名称,速度: 4.用按键调节节拍速度: 5.用蜂鸣器发出强弱不同的拍(强,弱,弱为3 ...
- 普中科技51纯代码(流水灯)
流水灯 1.点亮一个灯 2.一个灯闪烁 3.流水灯 4.灯左右来回流水 5.左右来回不定位平移 6.番外:蜂鸣器 7.流水灯+蜂鸣器 1.点亮一个灯 #include <reg51.h>s ...
- 普中科技51纯代码(按键)
1.独立按键控制灯 #include <reg51.h>typedef unsigned char u8; typedef unsigned int u16;sbit led1=P0^0; ...
最新文章
- 数学建模中的matlab实例,matlab数学建模实例
- Mac OS Terminal 几个快捷键
- 面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...
- 实战 es6_Node.JS实战65:ES6新特性:箭头函数
- 第五六七章(PTA复习)
- Jetson nano jetpack4.5安装torch1.8.0 yolov5(遇到到报错和解决办法)
- c语言的编程特点,c语言编程是什么?C语言编程的特点和应用
- Springboot的Mybatis拦截器实现
- java菜鸟疑问1:为什么我的代码总出现cannot be resolved or is not a field这种问题
- windows7安装Bitvise开启SSH服务
- python录制音频
- 经典回味:ResNet到底在解决一个什么问题呢?
- 色织物数据集YDFID-1
- 【前端】解决盒子被撑大问题 box-sizing
- android实现仿真键盘(KeyboardView适配)
- linux宝塔重新安装,Linux服务器Windows系统 安装和卸载宝塔面板
- 如何搭建属于自己的腾讯云服务器
- CGAL的安装与在VS中的配置
- 【综合题】农民挤奶问题
- 浅谈游戏《超级马里奥:奥德赛》
热门文章
- homepod换wifi网络_HomePod怎么更换wifi?苹果HomePod更换无线网连接图文教程
- java课程设计 博客园_Java课程设计博客(团队)
- 如何使用活字格实现高效开发协同管理系统?
- 20130822-STM8L101F3P6的PD0使用异常,尚未解决~!
- GP技术的展望——先有鸿钧后有天
- Android VLC音频视频播发器快速集成教程与模块
- JS 事件高级(包括DOM事件流,阻止事件冒泡,阻止事件默认行为,,,以及对我来说,很好用的 事件代理)
- 上海交通大学c语言程序设计考试,2016年华东交通大学软件学院C语言程序设计考研复试题库...
- iOS意见反馈(邮箱反馈)
- 南京市区枪击案疑系双方开车斗气引发(图)-开车斗气-枪击-南京枪击案