我是电子信息的一名学生这是我的单片机课程设计,今天分享给大家。有需要的评论区留言,可以发源码给你们,包含实验报告,仿真图。
STC89C52为核心,设计一个温度报警器,它由部分组成:显示模块、CPU控制模块、报警模块、温度测量模块、按键控制模块。CPU控制模块采用STC89C52单片机进行控制,温度传感器由DS18B20模块进行室温的测量,显示模块由八个数码管进行显示,报警模块由LED亮灭和有源蜂鸣器来实现。温湿度显示器要求如下:
1)、温度-阈值显示
上电数码管第一位和第二位显示室温大小第三位显示C,第六位显示-表示阈值,第七位第八位显示阈值大小;
2)、调整阈值显示
按下按键K1则数码管只显示第七位和第八位,且数值为当前阈值大小;
1)、数码管处于温度-阈值显示界面时,D1点亮,D2熄灭,其余灯光不受影响;
2)、数码管处于调整阈值显示时,D1熄灭,D2点亮,其余灯光不受影响;
3)、温度大于大于所设置阈值时,D3点亮,D4熄灭,其余灯光不受影响;
4)、温度小于所设置阈值时,D3熄灭,D4点亮,其余灯光不受影响;
5)、蜂鸣器打开时,D5点亮,其余灯光不受影响;
6)、蜂鸣器关闭时,D5熄灭,其余灯光不受影响;
1)、K1控制 温度-阈值显示 和 阈值调节显示 的来回切换;
2)、在调节阈值显示界面下,K2控制阈值的加1,在温度-阈值显示界面下,此按键没有任何功能;
3)、在调节阈值显示界面下,K3控制阈值的减1,在温度-阈值显示界面下,此按键没有任何功能;
4)、蜂鸣器调节按键,初始状态下,蜂鸣器打开,按下后蜂鸣器关闭;

main.c
#include "main.h"
#include "onewire.h"
sbit K1=P1^4;
sbit K4=P1^5;
sbit K2=P1^6;
sbit K3=P1^7;
sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
sbit L5=P2^4;//开关蜂鸣器
sbit buzzer=P1^1;
u8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6};
u8 dat[4];
u8 wendu=0;
u8 yi,er,san,si,wu,liu,qi,ba;
bit jia=0,jian=0,S1=0,S4=0;
u8 yuzhi=25;
u8 Ds18b20();
void display();
void key();
void main()
{
while(1)
{
wendu=Ds18b20();
key();
if(S1==0)
{
L1=0;L2=1;L3=1;L4=1;
yi=wendu/10;er=wendu%10;
san=12;si=10;wu=10;
liu=11;qi=yuzhi/10;ba=yuzhi%10;
}
else if(S1==1)
{
L1=1;L2=0;L3=1;L4=1;
if(jia==1){jia=0;if(yuzhi<50)yuzhi++;}
if(jian==1){jian=0;if(yuzhi>0)yuzhi--;}
yi=10;er=10;san=10;si=10;wu=10;
liu=10;qi=yuzhi/10;ba=yuzhi%10;
}
if(S4==0)
{
L5=0;
if(yuzhi<=wendu){L1&=1;L2&=1;L3&=0;L4=1;buzzer=1;}
else if(yuzhi>wendu){L1&=1;L2&=1;L3=1;L4=0;buzzer=0;}
}
else if(S4==1)
{
L5=1;
if(yuzhi<wendu){L1&=1;L2&=1;L3=0;L4=1;buzzer=0;}
else if(yuzhi>=wendu){L1&=1;L2&=1;L3=1;L4=0;buzzer=0;}
}
display();
}
}
void delayms(u16 z)
{
u16 i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void nixie(u8 add,u8 dat)
{
P3=0x01<<add;
P0=dat;
}
void display()
{
nixie(0,table[yi]);
delayms(3);
nixie(1,table[er]);
delayms(3);
nixie(2,table[san]);
delayms(3);
nixie(3,table[si]);
delayms(3);
nixie(4,table[wu]);
delayms(3);
nixie(5,table[liu]);
delayms(3);
nixie(6,table[qi]);
delayms(3);
nixie(7,table[ba]);
delayms(3);
}
u8 Ds18b20()
{
u8 low,high,temp;
init_ds18b20();
Write_DS18B20(0xcc);//0xcc控制ds18b20,直接跳过一些其他命令(精度命令等)
Write_DS18B20(0x44);//0x44控制ds18b20只读一次温度大小
Delay_OneWire(100);
init_ds18b20();
Write_DS18B20(0xcc);//0xcc控制ds18b20,直接跳过一些其他命令(精度命令等)
Write_DS18B20(0xbe);//0xbe,单片机准备读取自己内部的寄存器里面的数据
Delay_OneWire(100);
low=Read_DS18B20();//ds18b20内部数据一共16位,高四位表示符号(正负),低四位表示小数部分
high=Read_DS18B20();
temp=high<<4|low>>4;//丢弃高四位和低四位
return temp;
}
void key()
{
if(K1==0)
{
delayms(2);
if(K1==0)
{
if(S1==0)S1=1;
else if(S1==1)S1=0;
}
while(!K1)display();
}
if(K2==0)
{
delayms(2);
if(K2==0)jia=1;
while(!K2)display();
}
if(K3==0)
{
delayms(2);
if(K3==0)jian=1;
while(!K3)display();
}
if(K4==0)
{
delayms(2);
if(K4==0)
{
if(S4==0)S4=1;
else if(S4==1)S4=0;
}
while(!K4)display();
}
}
main.h
#ifndef __main_H__
#define __main_H__
#include <REGX52.H>
#include <intrins.H>
typedef unsigned int u16;
typedef unsigned char u8;
#endif
onewire.c
#include "onewire.h"
sbit DQ = P1^0; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
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_H
#include "main.h"
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
void Write_DS18B20(unsigned char dat);
void Delay_OneWire(unsigned int t) ;
#endif
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答
我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:
我有一个数组:array=['Footballs','Baseball','football','Soccer']而且我需要计算看到Football或Baseball的次数,无论大小写和复数形式如何。这是我尝试做的,但没有成功:array.count{|x|x.downcase.include?'football'||x.downcase.include?'baseball'}编写这段代码的正确或更好的方法是什么?我正在寻找3作为答案。 最佳答案 我会将count与一个block结合使用,该block根据与您正在寻找的约束相匹配的正
在Ruby(1.8.X)中为什么Object既继承了内核又包含了内核?仅仅继承还不够吗?irb(main):006:0>Object.ancestors=>[Object,Kernel]irb(main):005:0>Object.included_modules=>[Kernel]irb(main):011:0>Object.superclass=>nil请注意,在Ruby1.9中情况类似(但更简洁):irb(main):001:0>Object.ancestors=>[Object,Kernel,BasicObject]irb(main):002:0>Object.included
我有两个具有相同方法名称的模块。当我在某个类中包含两个模块时,只执行最后一个模块的方法。我需要在初始化类时同时执行:classMyClassincludeFirstModuleincludeSecondModuledefinitializefoo#fooiscontainedinbothmodulesbutonlytheoneinSecondModulesisexecutedendend可行吗? 最佳答案 正如YusukeEndoh所说,在Ruby中一切皆有可能。在这种情况下,您必须忘记只说“foo”的便利性,并且必须非常明确地说明