main.c

#include "mycode.h"
unsigned char keyvalue,t;
void main()
{SystemInit();//系统初始化Timer0Init();Timer1Init();uart1();EA  = 1;
//  Init_time();while(1){keyvalue=get_keyvalue();if(keyvalue!=0) t = keyvalue;display(0,t/10);display(1,t%10);}
}

mycode.c

#include "mycode.h"
unsigned char code numb[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xbf};unsigned char getkey(void)
{if(!s7)//{delay_ms(10);if(!s7){while(!s7);return s7_press;}}if(!s6)//{delay_ms(10);if(!s6){while(!s6);return s6_press;}}if(!s5)//{delay_ms(10);if(!s5){while(!s5);return s5_press;}}if(!s4)//{delay_ms(10);if(!s4){while(!s4);return s4_press;}}return 0;
}void display(unsigned char x,unsigned char dat)
{HC138(7,0xff);HC138(6,1<<x);HC138(7,numb[dat]);delay_us(500);
}char putchar(char c)
{SBUF=c;while(!TI);TI = 0;return c;
}void Timer0Init(void)      //1毫秒@12.000MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0x20;       //设置定时初始值TH0 = 0xD1;       //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;
}
void Timer1Init(void)       //1毫秒@12.000MHz
{AUXR |= 0x40;     //定时器时钟1T模式TMOD &= 0x0F;       //设置定时器模式TL1 = 0x00;       //设置定时初始值TH1 = 0x00;       //设置定时初始值TF1 = 0;      //清除TF1标志
//  TR1 = 1;       //定时器1开始计时
}void SystemInit(void)
{HC138(4,0xff);HC138(5,0x00);HC138(0,0x00);
}
void uart1(void)
{SCON = 0x50;      //8位数据,可变波特率AUXR |= 0x40;      //定时器时钟1T模式AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器TMOD &= 0x0F;        //设置定时器模式TL1 = 0xC7;       //设置定时初始值TH1 = 0xFE;       //设置定时初始值ET1 = 0;      //禁止定时器%d中断TR1 = 1;        //定时器1开始计时ES  = 1;
}
void delay_us(unsigned int t)       //@12.000MHz
{while(t--){_nop_();_nop_();_nop_();_nop_();}
}void delay_ms(unsigned int t)      //@12.000MHz
{unsigned char i, j;while(t--){i = 12;j = 169;do{while (--j);} while (--i);}
}

mycode.h

#ifndef __MYCODE_H__
#define __MYCODE_H__
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <absacc.h>
#include <intrins.h>
#include "iic.h"
#include "onewire.h"
#include "ds1302.h"
#include "key.h"
#define HC138(x,y)  {P2&=0x1f;P2|=(x<<5);P0=y;}
sfr AUXR  = 0x8e;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;#define s7_press 1
#define s6_press 2
#define s5_press 3
#define s4_press 4
void Timer0Init(void);      //1毫秒@12.000MHz
void Timer1Init(void);      //1毫秒@12.000MHz
unsigned char getkey(void);
void uart1(void);
void display(unsigned char x,unsigned char dat);
void SystemInit(void);
void delay_us(unsigned int t);      //@12.000MHz
void delay_ms(unsigned int t);      //@12.000MHz
#endif

onewire.c

#include "onewire.h"
#include "reg52.h"
sbit DQ = P1^4;//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{t=t*10;while(t--);
}//单总线写操作
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//单总线读操作
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}        Delay_OneWire(5);}return dat;
}//DS18B20初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}unsigned int Read_temp()
{unsigned char L,H;unsigned int temp;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(500);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);//先低后高L=Read_DS18B20();H=Read_DS18B20();temp=(H<<8)|L;temp=((float)temp*0.0625)*1000+5;temp/=10;return temp;}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_Hunsigned int Read_temp(void);#endif

iic.c

#include "iic.h"
#include "reg52.h"
#include "intrins.h"sbit SDA = P2^1;
sbit SCL = P2^0;
#define DELAY_TIME 5//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);
}//I2C总线启动信号
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//I2C总线停止信号
void IIC_Stop(void)
{SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 1;IIC_Delay(DELAY_TIME);
}//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{SCL = 0;SDA = ackbit;                    IIC_Delay(DELAY_TIME);SCL = 1;IIC_Delay(DELAY_TIME);SCL = 0; SDA = 1;IIC_Delay(DELAY_TIME);
}//等待应答
bit IIC_WaitAck(void)
{bit ackbit;SCL  = 1;IIC_Delay(DELAY_TIME);ackbit = SDA;SCL = 0;IIC_Delay(DELAY_TIME);return ackbit;
}//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;IIC_Delay(DELAY_TIME);if(byt & 0x80) SDA  = 1;else SDA  = 0;IIC_Delay(DELAY_TIME);SCL = 1;byt <<= 1;IIC_Delay(DELAY_TIME);}SCL  = 0;
}//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;IIC_Delay(DELAY_TIME);da <<= 1;if(SDA) da |= 1;SCL = 0;IIC_Delay(DELAY_TIME);}return da;
}

void Write_byte_02(unsigned char add,unsigned char dat)
{IIC_Start();IIC_SendByte(0xA0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
}
void Write_02(unsigned char add,unsigned char *dat)
{IIC_Start();IIC_SendByte(0xA0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();while(*dat!='\0'){IIC_SendByte(*dat);IIC_WaitAck();dat++;}IIC_Stop();
}
unsigned char  Read_byte_02(unsigned char add)
{unsigned char dat;IIC_Start();IIC_SendByte(0xA0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0xA1);IIC_WaitAck();dat=IIC_RecByte();IIC_WaitAck();IIC_Stop();return dat;
}
void Read24c04(unsigned char add, unsigned char *str ,unsigned char count)
{unsigned char i;for(i=0;i<count;i++){str[i] = Read_byte_02(add);add = add + 0x01;}
}

unsigned char AD_read(unsigned char ch)
{unsigned char dat;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(ch);IIC_WaitAck();
//  IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();dat=IIC_RecByte();IIC_WaitAck();IIC_Stop();return dat;
}
//DA转换需要时间
void DA_write(unsigned char dat)
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();}
//      m=AD_read(3);
//      DA_write(m);
//      display(5,(m*100/51)/100);
//      display(6,(m*100/51)%100/10);
//      display(7,(m*100/51)%10);
//
//
//      display(0,m/100);
//      display(1,m%100/10);
//      display(2,m%10);
//
//      HC138(6,0xff);
//      HC138(7,0xff);

iic.h

#ifndef _IIC_H
#define _IIC_Hvoid IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
void Write_byte_02(unsigned char add,unsigned char dat);
unsigned char  Read_byte_02(unsigned char add);
void Write_02(unsigned char add,unsigned char *dat);
void Read24c04(unsigned char add, unsigned char *str ,unsigned char count);
void DA_write(unsigned char dat);
unsigned char AD_read(unsigned char ch);
#endif

ds1302.c

#include "ds1302.h"
#include <reg52.h>
#include <intrins.h>
sbit SCK_1302 = P1^7;
sbit SDA_1302 = P2^3;
sbit RST_1302 = P1^3;
/ 秒   分  时
unsigned char Time[]={0x00,0x51,0x13,0x08,0x04,0x22};
//写字节
void Write_Ds1302(unsigned  char temp)
{unsigned char i;for (i=0;i<8;i++)        { SCK_1302 = 0;SDA_1302 = temp&0x01;temp>>=1; SCK_1302=1;}
}   //向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{RST_1302=0;   _nop_();SCK_1302=0;    _nop_();RST_1302=1;    _nop_();  Write_Ds1302(address);    Write_Ds1302(dat);      RST_1302=0;
}//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST_1302=0;    _nop_();SCK_1302=0;    _nop_();RST_1302=1;    _nop_();Write_Ds1302(address);for (i=0;i<8;i++)   {       SCK_1302=0;temp>>=1;    if(SDA_1302)temp|=0x80;    SCK_1302=1;} RST_1302=0;  _nop_();SCK_1302=0;    _nop_();SCK_1302=1;    _nop_();SDA_1302=0;    _nop_();SDA_1302=1;    _nop_();return (temp);
}///
void Init_time()
{Write_Ds1302_Byte(0x8E,0x00);Write_Ds1302_Byte(0x80,Time[0]);//秒Write_Ds1302_Byte(0x82,Time[1]);//分Write_Ds1302_Byte(0x84,Time[2]);//时Write_Ds1302_Byte(0x86,Time[3]);//时Write_Ds1302_Byte(0x88,Time[4]);//时Write_Ds1302_Byte(0x8C,Time[5]);//时Write_Ds1302_Byte(0x8E,0x80);
}unsigned char  BCDtoHEX(unsigned char  BCD)
{   unsigned char tempData;BCD&=0x7f;tempData = (BCD >> 4) * 10 + (BCD & 0x0F);return (tempData);
}
//16进制数转换成BCD码(例如:16转换成0x16)---写时钟使用(写的秒=26,为十进制,需要转换成BCD码=0x26))
//
//uint8_t HEXtoBCD(uint8_t HEX)
//{//  uint8_t tempData;
//
//  tempData = ((HEX / 10) << 0x04) + (HEX % 10);
//  return (tempData);
//}
void Read_ds1302()
{Time[0]=BCDtoHEX(Read_Ds1302_Byte(0x81));Time[1]=BCDtoHEX(Read_Ds1302_Byte(0x83));Time[2]=BCDtoHEX(Read_Ds1302_Byte(0x85));Time[3]=BCDtoHEX(Read_Ds1302_Byte(0x87));Time[4]=BCDtoHEX(Read_Ds1302_Byte(0x89));Time[5]=BCDtoHEX(Read_Ds1302_Byte(0x8D));}

ds1302.h

#ifndef __DS1302_H
#define __DS1302_Hextern unsigned char Time[6];void Init_time();
void Read_ds1302();void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );#endif

key.c

#include "key.h"
#include "mycode.h"
sfr P4 = 0xC0;
sbit P42 = P4^2;
sbit P44 = P4^4;
unsigned char get_keyvalue(void)
{unsigned char hang=0,lie=0;P3=0xf0;P42=1;P44=1;if(P3!=0xf0||P42!=1||P44!=1){delay_ms(10);if(P3!=0xf0||P42!=1||P44!=1){P3=0xf0;P42=1;P44=1;if(P44==0)       lie=1;if(P42==0)     lie=2;if((P3&(1<<5))==0)   lie=3;if((P3&(1<<4))==0)   lie=4;P3=0x0f;P42=0;P44=0;if((P3&(1<<0))==0)    hang=1;if((P3&(1<<1))==0)  hang=2;if((P3&(1<<2))==0)  hang=3;if((P3&(1<<3))==0)  hang=4;while(P3!=0x0f);return ((hang-1)*4+lie);}}return 0;}

key.h

#ifndef __KEY_H__
#define __KEY_H__unsigned char get_keyvalue(void);
#endif

蓝桥杯单片机:模块代码相关推荐

  1. 蓝桥杯单片机模块代码(AT24C02)(代码+注释)

    本模块是上电可擦除EEPROM,用于存储需要的数据.与上一节使用的底层代码相同,运用同一个总线,其操做顺序与PCF8591除第二步几乎完全一样.相同部分具体可看:蓝桥杯单片机模块代码(PCF8591) ...

  2. 蓝桥杯单片机模块代码(DS1302时钟芯片)(代码+注释)

    最近两天做项目耽误了,现在继续补 引脚图: 单片机内部连接方式 : 官方提供底层代码,弄懂原理即可: #include <reg52.h> #include <intrins.h&g ...

  3. 蓝桥杯单片机DS18B20代码注释及部分时序图

    蓝桥杯单片机蓝桥杯单片机DS18B20代码注释及部分时序图 #include<STC15F2K60S2.H> #include<intrins.h>#define uchar ...

  4. [蓝桥杯单片机]模块学习—中断系统

    前一段时间的文章已经跟各位一起刷了一部分的客观题了 接下来将会跟大家一起从官方提供的原理图和芯片手册出发 练习每个模块的程序编写 因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以 ...

  5. PCF8591详解(蓝桥杯单片机模块(IIC总线))

    文章目录 概述 特性 总体 框图 引脚 功能描述 寻址 控制字节 D/A转换 D/A转换过程 A/D转换 A/D转换过程 蓝桥杯部分 原理图部分 AD部分 DA部分 结束 概述 PCF8591是一款单 ...

  6. 蓝桥杯单片机必备代码(零基础也适合)

    1.选择不同接口代码,传参4是LED小灯接口,5是蜂鸣器继电器,6是数码管位置,7是数码管显示的数值 //选择接口 void SelectHC573(unsigned char n) {switch( ...

  7. AT24C02详解(蓝桥杯单片机模块(IIC总线))

    文章目录 特性 描述 引脚描述: 存储组织: 设备操作(IIC) 设备地址 写操作 字节写: 页写入: 确认轮询: 读操作 确认轮询: 当前地址读取: 任意地址读: 连续顺序读: 蓝桥杯部分 特性 2 ...

  8. DS1302详解(蓝桥杯单片机模块)

    文章目录 特性 详细描述 命令字节 CE 数据输入 数据输出 突发模态 时钟\日期 时钟停止标志 写保护 时钟\日期突发模式 RAM突发模式 数据传输 蓝桥杯部分 输出 特性 实时时钟计算秒.分.小时 ...

  9. 蓝桥杯单片机之PCF8591模块的使用

    蓝桥杯单片机之PCF8591模块的使用 简述 原理图: 引脚定义: 相关地址 IIC寻址设备地址 控制地址 IIC时序分析 数模转换D/A 模数转换 代码: 一:光敏电阻和可变电阻的AD转换,S4控制 ...

  10. 蓝桥杯单片机 赛后资料整理——NE555芯片模块与第十届省赛的总结

    蓝桥杯单片机 赛后资料整理--NE555芯片模块 电路原理 模块特性 驱动方法 代码模板 个人总结 本文适用于 CT107D竞赛板+ IAP15转接板 电路原理 模块特性 NE555是一种时钟芯片,输 ...

最新文章

  1. php 爬虫_Scrapy 爬虫完整案例-基础篇
  2. [C# 网络编程系列]专题十:实现简单的邮件收发器
  3. 用大白话讲解RxJava原理
  4. 5G NGC — 云原生的 5G 核心网架构演进
  5. 简单快速安装Apache+PHP+MySql服务环境(三)—— 下载安装phpmyadmin
  6. ASP.NET控件开发基础5
  7. python爬虫淘宝手机_【Python3 爬虫】14_爬取淘宝上的手机图片
  8. 如何云服务器销售,如何云服务器销售
  9. HTML罗盘时钟代码
  10. 新手阿里云服务器操作指南(图文教程)
  11. win7快捷方式去箭头_win7旗舰版桌面图标快捷方式箭头变成黑块怎么办?
  12. oracle sysdate毫秒,oracle systimestamp(sysdate)到毫秒
  13. MOS电平转换电路 stm32的I2C电平转换电路 IIC电平转换电路
  14. 用c语言求积分程序,菜鸟学C语言(五)之求定积分
  15. mocha.opts配置文件
  16. linux中 ~ / ./分别表示什么目录
  17. Unity 游戏脚本
  18. Abnova 6-酮-PGF1-α ELISA 试剂盒说明书
  19. python调用百度AI----文字识别
  20. Mac本子下安装Maven的插件

热门文章

  1. mysql拷贝文件安装_Mysql5.7.18的安装与主从复制图文详解
  2. python canny函数_python库skimage 应用canny边缘探测算法
  3. 微服务架构的优缺点_微服务架构DNS服务注册与发现实现原理
  4. mysql 不完全插入_MySql insert插入操作不完全指北_MySQL
  5. JDK8 Stream 操作
  6. 昆计计算机管理专修学院,昆明昆计高中的师资怎么样,学校是民办还是公办的...
  7. HuggingFace学习3:加载预训练模型完成机器翻译(中译英)任务
  8. pandas滑动窗口防止nan出现
  9. ipv6网络使用scp,并解决No route to host与no matches found报错
  10. python中ijust函数_Python基础