74HC595和74HC138控制程序

void Device_ctrl(unsigned char p2date,unsigned char p0date)//p0date为数据p2date为选中模块
{P0=p0date;P2=P2&0x1f|p2date;P2&=0x1f;
}

系统初始化关闭蜂鸣器LED继电器

Device_ctrl(0x80,0xff);//关闭蜂鸣器继电器
Device_ctrl(0xa0,0x00);//关闭led

数码管显示函数(需配合定时器使用)

unsigned char smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阳极数码管段码
unsigned char smg_display[8];
unsigned int  smg_count;
void smg_show()
{unsigned int i;Device_ctrl(0xc0,0);Device_ctrl(0xe0,~smg_display[i]);Device_ctrl(0xc0,0x01<<i);i=(i+1)%8;
}void smg_process()
{if(smg_count>3){}
}

按键使用函数(需配合定时器使用)

unsigned char trig_btn;
unsigned char con_btn;
unsigned int key_count;
void key_btn()//三行按键
{unsigned char readdate=P3^0xff;trig_btn=readdate&(con_btn^readdate);con_btn=readdate;
}void key_process()
{if(key_count>=10){key_count=0;key_btn();if(trig_btn==0x08)//s4{}if(trig_btn==0x04)//s5{if(trig_btn==0x02)//s6{}if(trig_btn==0x01)//s7{}}
}

矩阵键盘函数(需配合定时器使用)

#define KEY3 P3
#define NO_KEY 0xff
#define KEY_STATE0 0
#define KEY_STATE1 1
#define KEY_STATE2 2unsigned int key_count;
unsigned char key_scan()
{static unsigned  char  key_state=KEY_STATE0;unsigned char key_temp,key_value=0;unsigned char key1,key2;P30=0;P31=0;P32=0;P33=0;P34=1;P35=1;P42=1;P44=1;if(P44==0){key1=0x70;}if(P42==0){key1=0xb0;}if(P35==0){key1=0xd0;}if(P34==0){key1=0xe0;}if((P44==1)&&(P42==1)&&(P34==1)&&(P35==1)){key1=0xf0;}P30=1;P31=1;P32=1;P33=1;P34=0;P35=0;P42=0;P44=0;if(P30==0){key2=0x0e;}if(P31==0){key2=0x0d;}if(P32==0){key2=0x0b;}if(P33==0){key2=0x07;}if((P30==1)&&(P31==1)&&(P32==1)&&(P33==1)){key2=0x0f;}key_temp=key1|key2;switch(key_state){case KEY_STATE0: if(key_temp!=NO_KEY){key_state=KEY_STATE1;}break;case KEY_STATE1: if(key_temp==NO_KEY){key_state=KEY_STATE0;}else{switch(key_temp){case 0x77:key_value=4;break;case 0x7b:key_value=5;break;case 0x7d:key_value=6;break;case 0x7e:key_value=7;break;case 0xb7:key_value=8;break;case 0xbb:key_value=9;break;case 0xbd:key_value=10;break;case 0xbe:key_value=11;break;case 0xd7:key_value=12;break;case 0xdb:key_value=13;break;case 0xdd:key_value=14;break;case 0xde:key_value=15;break;case 0xe7:key_value=16;break;case 0xeb:key_value=17;break;case 0xed:key_value=18;break;case 0xee:key_value=19;break;}key_state=KEY_STATE2;}break;case KEY_STATE2:if(key_temp==NO_KEY){key_state=KEY_STATE0;}break;}return key_value;
}void key_process()
{unsigned char key_val;if(key_count>10){key_count=0;key_val=key_scan();switch(key_val){case 4:break;case 5:break;case 6:break;case 7:break;case 8:break;case 9:break;case 10:break;case 11:break;case 12:break;case 13: break;case 14: break;case 15: break;case 16: break;case 17: break;case 18 : break;case 19: break;}}
}

温度读取函数(需配合定时器使用)

//通过在while 1 之前运行一次准备读取温度避免刚上电温度读取85问题
unsigned int temp;
void temper_start()//准备读取温度
{init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);
}
float  read_temper()//读取温度
{float temper;unsigned char low,high;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);low=Read_DS18B20();high=Read_DS18B20();temper=(high<<8)|low;temper=temper*0.0625; return temper;
}
unsigned int temp_count;void temp_process()//每一秒读取一次温度 在定时器中设置温度读取间隔时间
{if(temp_count>1000){temp=read_temper()*100;temper_start();temp_count=0;}
}

温度读取的底层驱动代码

onewire.c

#include "reg52.h"sbit DQ = P1^4;  //单总线接口//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{t*=12;while(t--);
}//通过单总线向DS18B20写一个字节
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);
}//从DS18B20读取一个字节
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;
}

温度读取头文件

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_Hvoid Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);#endif

AD函数(需配合定时器使用)

unsigned int ad_count;
unsigned char ad_val;unsigned char read_ad(unsigned char add)//读取ad数值0-255
{unsigned char ad_value;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();ad_value=IIC_RecByte();IIC_SendAck(1);IIC_Stop();return ad_value;
}void ad_process()//通过定时器来读取ad数值
{if(ad_count>100){ad_count=0;ad_val=read_ad(0x03);//0x03为电位器rb2 0x01为光敏电阻}
}

DA函数(需配合定时器使用)

unsigned int da_count;//定时器控制电压输出频率
unsigned int ad_val;//255对应5v
void da(unsigned char date)//电压输出函数
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0X40);IIC_WaitAck();IIC_SendByte(date);IIC_WaitAck();IIC_Stop();
}void da_process()
{if(da_count>100){da_count=0;ad_val=255;da(ad_val);}
}

eeprom函数

写入函数

void write_eeprom(unsigned char add,unsigned char date)//eeprom写入函数
{IIC_Start();IIC_SendByte(0xa0); IIC_WaitAck();IIC_SendByte(add); IIC_WaitAck();IIC_SendByte(date); IIC_WaitAck();IIC_Stop();
}

eeprom读取函数

unsigned char read_eeprom(unsigned char add)//eeprom写入函数
{unsigned char date;IIC_Start();IIC_SendByte(0xa0); IIC_WaitAck();IIC_SendByte(add); IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1); IIC_WaitAck();date=IIC_RecByte();   IIC_SendAck(1);IIC_Stop();return date;
}

IIC底层驱动函数

iic.c

#include "reg52.h"
#include "intrins.h"#define DELAY_TIME 5#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);
}
//总线启动条件
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//总线停止条件
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;                    // 0:应答,1:非应答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;
}

iic.h0

#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 IIC_Delay(unsigned char i);
#endif

DS1302写入时分秒

void set_sfm(unsigned char shi,unsigned char fen,unsigned char miao)
{Write_Ds1302_Byte(0x8e,0);Write_Ds1302_Byte(0x80,(miao/10)*16+miao%10);Write_Ds1302_Byte(0x82,(fen/10)*16+fen%10);Write_Ds1302_Byte(0x84,(shi/10)*16+shi%10);Write_Ds1302_Byte(0x8e,0x80);
}

时分秒读取

shi=shi/16*10+shi%16;
fen=fen/16*10+fen%16;
miao=miao/16*10+miao%16;

DS1302底层驱动代码

ds1302.c

#include <reg52.h>
#include <intrins.h>sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;   // DS1302复位                                             void Write_Ds1302(unsigned  char temp)
{unsigned char i;for (i=0;i<8;i++)        { SCK=0;SDA=temp&0x01;temp>>=1; SCK=1;}
}   void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{RST=0;    _nop_();SCK=0; _nop_();RST=1;     _nop_();  Write_Ds1302(address);    Write_Ds1302(dat);      RST=0;
}unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_();Write_Ds1302(address);for (i=0;i<8;i++)   {       SCK=0;temp>>=1; if(SDA)temp|=0x80; SCK=1;} RST=0;    _nop_();SCK=0; _nop_();SCK=1; _nop_();SDA=0; _nop_();SDA=1; _nop_();return (temp);
}

ds1302.h

#ifndef __DS1302_H
#define __DS1302_Hvoid Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );#endif

ne555测量频率函数

void counter_init()//计数器初始化
{ TMOD|=0X05;         //定时器0/计数器0配置成计数模式且不自动装载TL0=0X00;           //初值为0TH0=0X00;          //初值为0TR0=1;             //启动计数器
}void ne555_process()    //放在1ms定时器2中断执行
{count_ne555++;if(count_ne555>=1000)  //精确的1s{count_ne555=0;freq_ne555=(TH0<<8)|TL0;TL0=0;TH0=0;}
}

超声波测距函数

sbit  TX=P1^0;
sbit  RX=P1^1;void sendwave()
{unsigned char i;for(i=0;i<8;i++){TX=1;Delay12us();TX=0;Delay12us();}
}void  Distancemeasure()
{TMOD&=0x0f;TH1=0X00;TL1=0X00;sendwave();TR1=1;while((RX==1)&&(TF1==0));TR1=0;if(TF1==1){distance=999;TF1=0;}else{time=(TH1<<8)|TL1;distance=time*0.0172;}}void distance_measure()
{if(distance_count>100){distance_count=0;Distancemeasure();}
}

蓝桥杯单片机比赛准备程序相关推荐

  1. 蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯

    经过7节的学习,我们已经掌握了基本的硬件的使用规则,从本节开始我们开始学习一些模块的使用PWM.PCF8591.AT24C02.DS18B20.DS1302.555频率测量.光敏电阻测量.超声波测距等 ...

  2. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  3. 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块--PCF8591.我主页有其他模块的使用方法和基本原理(2条消息) Do My Best ...

  4. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

  5. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  6. 蓝桥杯单片机国赛客观题_蓝桥杯单片机比赛历年试题获取

    蓝桥杯单片机比赛历年试题获取!!! 准备蓝桥杯蓝桥杯比赛除了对板子各个模块的熟悉外,还有一件事,那就是把它们综合起来运用.当你单独使用板子上的某一个模块时,可能不会有什么问题,甚至对已经反复练习过后的 ...

  7. 蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理

    这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块--串口.中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习. 通信 ...

  8. 蓝桥杯单片机比赛学习:1、led点亮原理

    此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...

  9. 第八届蓝桥杯单片机省赛----程序题

    main.c程序 #include<stc15f2k60s2.h> #include "ds18b20.h" #include <ds1302.h>#def ...

最新文章

  1. 金融类APP不得强制读取通讯录
  2. 第十五届智能车竞赛技术报告-成电金秋-AI电磁
  3. 1.8 小飞的电梯调度算法
  4. uygurqa输入法android,uygurqa输入法
  5. #ifndef的作用
  6. [vue] 你了解什么是函数式组件吗?
  7. Web.py Cookbook 简体中文版 - 如何使用web.background
  8. SonicWall 督促客户立即修复NSM 本地版本漏洞
  9. 李彦宏被泼水,是“多数人的暴力”还是“群众的宣泄”
  10. HTTP权威指南笔记
  11. Android 项目必备(二十)-->NFC 的基本使用
  12. 【UI界面开发】背包系统一般思路
  13. 【TJOI2019】唱、跳、rap和篮球(DP)(容斥)
  14. 【.Net Core】编译时禁止自动生成netcoreapp文件夹
  15. Practical Python and OpenCV 3rd Edition读书笔记_Chapter8_Smoothing and Blurring平滑与模糊_思维导图
  16. 常见SOC启动流程分析
  17. 小学计算机水平测试论坛,热烈祝贺我校学生在市计算机水平测试中再创佳绩
  18. 英特尔k跟kf区别_真实情况透露英特尔10900kf和10900k区别怎么选?评测比较哪款好...
  19. 关于atom中apm 不能安装插件安装失败解决办法?
  20. 计算机网络 自顶向下方法 原书第7版 Chapter 1 计算机网络与因特网读书笔记

热门文章

  1. 希望整理 Android Studio 最全面的开发插件。
  2. C++抽象类和接口的区别
  3. 【华为机试真题Java】提取不重复的整数
  4. 计算机中信息的质量单位有哪些,g的单位(g单位有哪些)
  5. 苹果cms如何开启Redis高速缓存提升访问速度
  6. 计算机常用端口和协议/图解TCP/IP
  7. 《Smart IoT Projects》 一书今日限免
  8. mac卸载python3.6_mac 卸载自己安装python和brew卸载python
  9. 华为OD机试 -Excel 单元格数值统计(Python) | 机试题+算法思路+考点+代码解析 【2023】
  10. 【豆瓣电影】2019/11/21/Python搜索豆瓣电影(Top100)爬虫+D3.js词云(票房和豆瓣评分)实现