蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
文章目录
- 一、题目要求
- 二、代码展示
- 三、注意事项
一、题目要求
二、代码展示
#include <STC15F2K60S2.h>
#include "iic.h"#define uchar unsigned char
#define uint unsigned intuchar code SMG_duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”//分别是“0.-9.”
uchar code SMG_Dot_AC[10] = {0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};uint time_001s = 0;
uchar guang = 0;//系统初始化
void Initsys();
//配置HC138
void SelectHC138(uchar channel);
//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value);
//数码管8位码显示
void SMG_Display();
//数码管的延时
void Delay_one_ms_SMG();
//独立按键(BTN)
void Alone_Key();
//按键消抖延时
void Delay_five_ms_Key();
//矩阵键盘(KBD)
//void Matrix_Key();
//定时器初始化
void InitTimer0();
//售水机出水
void Mod_1_Strat();
//售水机停水
void Mod_2_Stop();
//PCF8591
uchar IIC_read(uchar add);
//光感处理
void Light_Check();void main()
{Initsys();InitTimer0();while(1){Light_Check();//Matrix_Key();Alone_Key();//SMG_Display();}
}//光感处理
void Light_Check()
{guang = IIC_read(0X01);if(guang < 64){SelectHC138(4);P0 = 0XFE;}else {SelectHC138(4);P0 = 0XFF;}
}//售水机出水
void Mod_1_Strat()
{SelectHC138(5);P0 = 0X10;while(1){Light_Check();SMG_Display();Alone_Key();if(time_001s == 99999){Mod_2_Stop();break;}}
}
//售水机停水
void Mod_2_Stop()
{EA = 0;SelectHC138(5);P0 = 0X00;time_001s = time_001s / 2;while(1){Light_Check();SMG_Display();}
}//定时器初始化
void InitTimer0()
{TMOD = 0x01;TH0 = (65535 - 10000) / 256;TL0 = (65535 - 10000) % 256;ET0 = 1;EA = 1;TR0 = 1;
}//定时器服务
void ServiceTimer0() interrupt 1
{TH0 = (65535 - 10000) / 256;TL0 = (65535 - 10000) % 256;time_001s++;
}//按键消抖延时
void Delay_five_ms_Key()
{uint i,j;for(i = 0; i < 5; i++)for(j = 845; j > 0; j--);
}//独立按键(BTN)
void Alone_Key()
{//S7按键if(P30 == 0){Delay_five_ms_Key();if(P30 == 0){Mod_1_Strat();}while(!P30){Light_Check();SMG_Display();}}//S6按键else if(P31 == 0){Delay_five_ms_Key();if(P31 == 0){Light_Check();Mod_2_Stop();}while(!P31){SMG_Display();}}
}//配置HC138
void SelectHC138(uchar channel)
{switch(channel){case 4: //LEDP2 = (P2 & 0X1F) | 0X80;break;case 5: //蜂鸣器和继电器P2 = (P2 & 0X1F) | 0Xa0;break;case 6: //位码P2 = (P2 & 0X1F) | 0Xc0;break;case 7: //段码P2 = (P2 & 0X1F) | 0Xe0;break;case 0: //锁住所有寄存器P2 = (P2 & 0X1F) | 0X00;break;}
}//系统初始化
void Initsys()
{SelectHC138(5);P0 = 0X00;//关闭蜂鸣器和继电器SelectHC138(4);P0 = 0XFF;//关闭LEDSelectHC138(6);P0 = 0XFF; //选择所有数码管SelectHC138(7);P0 = 0XFF; //关闭所有数码管
}//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value)
{SelectHC138(6);P0 = 0X01 << pos;SelectHC138(7);P0 = value;
}//数码管8位码显示
void SMG_Display()
{DisplaySMG_Bit(1, SMG_Dot_AC[0]);Delay_one_ms_SMG();DisplaySMG_Bit(2, SMG_duanma[5]);Delay_one_ms_SMG();DisplaySMG_Bit(3, SMG_duanma[0]);Delay_one_ms_SMG();DisplaySMG_Bit(4, SMG_duanma[time_001s / 10000]);Delay_one_ms_SMG();DisplaySMG_Bit(5, SMG_Dot_AC[time_001s % 10000 / 1000]);Delay_one_ms_SMG();DisplaySMG_Bit(6, SMG_duanma[time_001s % 1000 / 100]);Delay_one_ms_SMG();DisplaySMG_Bit(7, SMG_duanma[time_001s % 100 / 10]);Delay_one_ms_SMG();
}//数码管的延时
void Delay_one_ms_SMG()
{uint j;for(j = 845; j > 0; j--);
}//PCF8591
uchar IIC_read(uchar add)
{uchar temp;IIC_Start();IIC_SendByte(0X90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0X91);IIC_WaitAck();temp = IIC_RecByte();IIC_Stop();return temp;
}
/*
//矩阵键盘(KBD)
void Matrix_Key()
{uchar temp;//第一列P3 = 0X7F;P44 = 0; P42 = 1;temp = P3;temp = temp & 0X0F;if(temp != 0X0F){Delay_five_ms_Key();temp = P3;temp = temp & 0X0F;if(temp != 0X0F){temp = P3;switch(temp){case 0X7E:DisplaySMG_Bit(0, SMG_duanma[1]);break;case 0X7D:DisplaySMG_Bit(1, SMG_duanma[1]);break;case 0X7B:DisplaySMG_Bit(2, SMG_duanma[1]);break;case 0X77:DisplaySMG_Bit(3, SMG_duanma[1]);break;}while(temp != 0X0F){temp = P3;temp = temp & 0X0F;}}}//第二列P3 = 0XBF;P44 = 1; P42 = 0;temp = P3;temp = temp & 0X0F;if(temp != 0X0F){Delay_five_ms_Key();temp = P3;temp = temp & 0X0F;if(temp != 0X0F){temp = P3;switch(temp){case 0XBE:DisplaySMG_Bit(0, SMG_duanma[2]);break;case 0XBD:DisplaySMG_Bit(1, SMG_duanma[2]);break;case 0XBB:DisplaySMG_Bit(2, SMG_duanma[2]);break;case 0XB7:DisplaySMG_Bit(3, SMG_duanma[2]);break;}while(temp != 0X0F){temp = P3;temp = temp & 0X0F;}}}//第三列P3 = 0XDF;P44 = 1; P42 = 1;temp = P3;temp = temp & 0X0F;if(temp != 0X0F){Delay_five_ms_Key();temp = P3;temp = temp & 0X0F;if(temp != 0X0F){temp = P3;switch(temp){case 0XDE:DisplaySMG_Bit(0, SMG_duanma[3]);break;case 0XDD:DisplaySMG_Bit(1, SMG_duanma[3]);break;case 0XDB:DisplaySMG_Bit(2, SMG_duanma[3]);break;case 0XD7:DisplaySMG_Bit(3, SMG_duanma[3]);break;}while(temp != 0X0F){temp = P3;temp = temp & 0X0F;}}}//第四列P3 = 0XEF;P44 = 1; P42 = 1;temp = P3;temp = temp & 0X0F;if(temp != 0X0F){Delay_five_ms_Key();temp = P3;temp = temp & 0X0F;if(temp != 0X0F){temp = P3;switch(temp){case 0XEE:DisplaySMG_Bit(0, SMG_duanma[4]);break;case 0XED:DisplaySMG_Bit(1, SMG_duanma[4]);break;case 0XEB:DisplaySMG_Bit(2, SMG_duanma[4]);break;case 0XE7:DisplaySMG_Bit(3, SMG_duanma[4]);break;}while(temp != 0X0F){temp = P3;temp = temp & 0X0F;}}}
}*/
三、注意事项
- define 换行时,要加
\
- 使用我写的模板
DisplaySMG_Bit
第二个输入参数,记得要用开头定义的数组 iic,c
文件中,要8-12倍延时
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)相关推荐
- 《蓝桥杯真题》:1.自动售水机
自动售水机 功能简述: 设计任务及要求 实现代码 真题内容取自: 无语凝烟 功能简述: 通过竞赛硬件平台模拟小区自动售水机的工作流程,具体的:通过按键控制售水机水流出和停止:通过数码管显示费率.出水量 ...
- 蓝桥杯单片机第三届省赛自动售水机
#蓝桥杯单片机省三自动售水机 提示:能力有限仅供参考 本人能力有限仅供新手使用,第一次发表博客难免有错误仅供参考. 提示:以下是本篇文章正文内容,下面案例可供参考 一.main.c 代码如下: #in ...
- 【蓝桥杯】单片机学习(7)——UART串口通信
UART串口通信 一.基础知识介绍 1.通信方式的分类 2.RS232通信接口 3.UART模块介绍 (1)串口控制寄存器SCON(可位寻址) (2)电源控制寄存器PCON(不可位寻址) (3)辅助寄 ...
- 【蓝桥杯】单片机学习(10)——I2C通信协议与E2PROM
I2C总线与E2PROM 一.I2C总线 1.I2C协议和UART协议的区别 2.I2C时序认识 3.I2C总线的数据传送 (1)数据位的有效性规定 (2)起始信号和停止信号 (3)数据传输 (4)整 ...
- 【蓝桥杯】单片机学习(9)——多.c文件初认识及计算器实例
多.C文件+计算机实例 1.多.C文件的初步认识 extern关键字说明 2.实例(CT107D开发板) main.c代码: system.h代码 smg.c代码: key.c代码: system.h ...
- 【蓝桥杯】单片机学习(6)——蜂鸣器+继电器
蜂鸣器+继电器 1.蜂鸣器简介 2.蜂鸣器工作过程(CT107D开发板). 3.以普中科技开发板为例 1.蜂鸣器简介 蜂鸣器按照驱动方式可分为有源蜂鸣器和无源蜂鸣器.有源蜂鸣器内部带有振荡器,只要给B ...
- 蓝桥杯之单片机学习(二十五)——温度记录器(附题目和完整代码)
文章目录 一.题目要求 二.代码操作 2.1 main.c 2.2 ds1302.c 三.一些心得 一.题目要求 二.代码操作 2.1 main.c #include <STC15F2K60S2 ...
- 蓝桥杯之单片机学习(三)——共阳数码管的静态显示
文章目录 一.训练任务 二.训练重点 三.训练准备 3.1 原理图展示 3.2 数字对照表 3.3 数码管分路 3.4 一些解释 四.代码实现 注意事项!!! 一.训练任务 在CT107D单片机综合训 ...
- 蓝桥杯51单片机学习——proteus8关于51工程文件的创建
1.新建工程 2.选择路径 3.要设计电路,选隐含的模式 4.选择是否创建PCB板 一般不创建pcb 5.因为要进行仿真,选择固件模式 因为学习51单片机,所以选择AT89C5151控制器: 结合ke ...
最新文章
- 在Archlinuxarm上搭建Minecraft基岩服务器
- 下一代Hotmail和MSN Messenger最新界面截图
- python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!
- Redis的N种妙用,不仅仅是缓存
- oracle数据库6月之后的数据,Oracle数据库SCN存在可能在2019年6月导致宕机问题
- XP无法显示经典模式控制面板
- java对象转json格式
- 关于计算机学科的一些期刊和会议(转)
- Bootstrap 第一天
- python搭建一个后端平台
- SqlServer——正则表达式
- 文件分割与合并(Java)
- java中rtf转化为html的第三方工具,java .rtf文件转html
- php文章下一页,php获取文章上一页与下一页的方法_php技巧
- 编译原理 自下而上分析题型
- python 获取节假日,二十四节气,中国农历,星次、每日凶煞、每日值神、农历建除十二神、农历每日宜忌、彭祖百忌、每日五行、二十八星宿、天干地支、农历生辰八字、时辰凶吉等
- C# 微信企业号--发送消息
- 大厂Offer拿到手软啊!隔壁都馋哭了
- 技术进化论,GITC2014来见证
- 【学习记录】【密码学】SM4分组密码算法