客观题
第十三届省赛客观题
讲解
通过查找芯片手册得知IAP15F2K61S2单片机的外设中能够作为UART1的波特率发生器的有定时器1、定时器2。
压电效应就是指:某些电介质在沿一定方向上受到外力的作用而变形时,其内部会产生极化现象,同时在它的两个相对表面上出现正负相反的电荷。当外力去掉后,它又会恢复到不带电的状态,这种现象称为正压电效应。
光电效应是物理学中一个重要而神奇的现象,在光的照射下,某些物质内部的电子会被光子激发出来而 形成电流,即光生电。
热电效应是当受热物体中的电子(空穴),因随着温度梯度由高温区往低温区移动时,所产生电流或电荷堆积的一种现象。
霍尔效应: 当电流垂直于外磁场通过半导体时,载流子发生偏转,垂直于电流和磁场的方向会产生一附加电场,从而在半导体的两端产生电势差,这一现象就是霍尔效应。
三态门:是指逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路,高阻态相当于隔断状态。三态门都有一个EN控制使能端,来控制门电路的通断。
从电流的流向来看,很显然A、B、C点的电流都是流向Y。因此,我们就能够推出Y=A+B+C。
A选项是常用的状态翻转的方法。B选项,我们是不是可以看成P42==0呢?C选项可以转换为P4 = P4^0x100;在异或运算中同1或者同0则是0,否则就是1;因此,C选项就是正确的。D选项可以转换为P4=P4&0x100,一个数与上1结果就是它本身。
差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。在这两根线上的传输的信号就是差分信号。信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。RS232的传输方式是异步传输;而单总线协议1-wrie,只使用一根数据线,很显然不是正确答案。
data:访问可直接寻址的片内存储器,即内部RAM,即我们常说的DATA区或数据段,在整个RAM块中只占前128字节(Ox00~Ox7f),因为它采用直接寻址方式,对变量访问最快,通常我们把使用比较频繁的变量或局部变量存储在DATA段中,但是它的空间有限(128)。
idata:使用寄存器作为指针来进行间接寻址,一般常用来存放比较频繁的变量。
xdata:访问外部数据存储器,即外部RAM,大小64K(Ox0000~Oxiff),16位地址寻址,称作外部数据区简称XDATA 区,访问XDATA须采用间接寻址。
pdata:访问当前页面内的外部RAM中的XDATA,按页访问,每一页256字节。PDATA段只有256个字节,对PDATA和XDATA的操作是相似的,但是对PDATA段寻址比对XDATA段寻址要快,因为对PDATA段寻址只需要装入8位地址,而对XDATA段寻址需装入16位地址,所以尽量把外部数据存储在PDATA段中。
掌握好虚短与续断就能够很好的解除该题的答案了。虚短:理解成短路,运放处于线性状态时,把两输入端视为等电位,即运放正输入端和负输入端的电压相等;虚断:理解成断路,运放处于线性状态时,把两输入端视为开路,即流入正负输入端的电流为零;总结一句话:虚短用来得到电压相等;虚断用来得到电流为0。
全双工通信又称为双向同时通信,即通信的双方可以同时发送和接收信息的信息交互方式。它要求发射设备与接收设备有独立的接收与发射的能力即可。
maim函数
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "ds1302.h"
#include "onewire.h"
#define uc unsigned char
#define ui unsigned int
sbit H1=P3^0;
sbit H2=P3^1;
sbit H3=P3^2;
sbit H4=P3^3;
sbit L1=P3^4;
sbit L2=P3^5;
sbit L3=P4^2;
sbit L4=P4^4;
uc tac[7]={0x50,0x59,0x23,0x16,0x03,0x04,0x23};//秒 分 时 日 月 星期 年
#define COM(X) {P0 = X; P2 = (P2 & 0x1F | 0xC0); P2 &= 0x1F;}
#define SEG(X) {P0 = X; P2 = (P2 & 0x1F | 0xE0); P2 &= 0x1F;}
#define BUZ(X) {P0 = X; P2 = (P2 & 0x1F | 0xA0); P2 &= 0x1F;}
#define LED(X) {P0 = X; P2 = (P2 & 0x1F | 0x80); P2 &= 0x1F;}
uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x8e,0x8C,0xC1,0x86,0xbf,0x88};//0-9,C,F,P,U,E,-
//10-C
//11-F
//12-P
//13-U
//14-E
//15--
uc jm=0;
xdata ui temp;
xdata ui count;
uc m=1;
uc wd_kz=26;
uc zt;
//函数的申明
void jm_xs();
uc GetButtonValue_1(void);
/****************led,继电器,蜂鸣器的共用体*************************/
typedef union{
uc led_data;
struct{
uc led1:1;
uc led2:1;
uc led3:1;
uc led4:1;
uc led5:1;
uc led6:1;
uc led7:1;
uc led8:1;
}led_one;
}led_tow;
static xdata led_tow s_led;
typedef union{
uc other_data;
struct{
uc other1:4;
uc other_jdq:1;
uc other2:1;
uc other_fmq:1;
}other_one;
}other_tow;
static xdata other_tow s_other;
/****************led灯独立控制**************/
void led_dlkz(uc led_x,uc no_of)
{
switch(led_x)
{
case 1:s_led.led_one.led1=(no_of==1)?1:0;break;
case 2:s_led.led_one.led2=(no_of==1)?1:0;break;
case 3:s_led.led_one.led3=(no_of==1)?1:0;break;
case 4:s_led.led_one.led4=(no_of==1)?1:0;break;
case 5:s_led.led_one.led5=(no_of==1)?1:0;break;
case 6:s_led.led_one.led6=(no_of==1)?1:0;break;
case 7:s_led.led_one.led7=(no_of==1)?1:0;break;
case 8:s_led.led_one.led8=(no_of==1)?1:0;break;
}
LED(s_led.led_data);
}
/***************继电器开关控制**********************/
void jdq(uc no_of)
{
s_other.other_one.other_jdq=(no_of==1)?1:0;
BUZ(s_other.other_data);
}
/*****************蜂鸣器开关控制*****************/
void fmq(uc no_of)
{
s_other.other_one.other_fmq=(no_of==1)?1:0;
BUZ(s_other.other_data);
}
/******************************LED灯闪烁函数******************************/
void Timer0Init(void) //500微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x90; //设置定时初值
TH0 = 0xE8; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
void tim0()interrupt 1
{
count++;
if(count==100)
{m++;
if(m>2)
{ m=1; }
count=0;
}
}
void LED_SS()
{
switch(m)
{
case 1:led_dlkz(3,0);break;
case 2:led_dlkz(3,1);break;
}
}
/*************************工作指示灯函数***********************************/
void LED_ZS()
{
if(zt==0)
{led_dlkz(2,0);}
else
{led_dlkz(2,1);}
}
/***************延时函数区*************/
void Delay100us() //用于数码管显示
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
void Delay750ms() //用于消除开机85C
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 35;
j = 51;
k = 182;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1ms() //用于按键消抖
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
/***************数码管显示函数******************/
void OutputSMG(uc gqb,uc yxl)
{
uc i;
for(i=0;i<8;i++)
{
SEG(0xff);
COM(0x01<<gqb);
SEG(yxl);
Delay100us();
}
COM(0x00);
SEG(0x00);
}
/*********************************时钟显示分秒函数************************/
void smg_FM()
{
uc F,M;
readtime(tac);
F=(tac[1]>>4)*10+(tac[1]&0X0F);
M=(tac[0]>>4)*10+(tac[0]&0X0F);
OutputSMG(0,tab[13]);
OutputSMG(1,tab[2]);
OutputSMG(3,tab[F/10]);
OutputSMG(4,tab[F%10]);
OutputSMG(5,tab[15]);//-
OutputSMG(6,tab[M/10]);
OutputSMG(7,tab[M%10]);
if(F==0&&zt==1&&M==0)
{jdq(1);led_dlkz(1,0); }
if(F==0&&zt==1&&M==5)
{jdq(0);led_dlkz(1,1);}
if(F==0&&zt==1&&0<=M<5)
{TR0=1;LED_SS();}
if(F==0&&zt==1&&M>=5)
{TR0=0;led_dlkz(3,1);}
}
/*********************************时钟显示时分函数************************/
void smg_SF()
{
uc S,F,M;
readtime(tac);
M=(tac[0]>>4)*10+(tac[0]&0X0F);
S=(tac[2]>>4)*10+(tac[2]&0X0F);
F=(tac[1]>>4)*10+(tac[1]&0X0F);
OutputSMG(0,tab[13]);
OutputSMG(1,tab[2]);
OutputSMG(3,tab[S/10]);
OutputSMG(4,tab[S%10]);
OutputSMG(5,tab[15]);//-
OutputSMG(6,tab[F/10]);
OutputSMG(7,tab[F%10]);
if(F==0&&zt==1&&M==0)
{jdq(1);led_dlkz(1,0); }
if(F==0&&zt==1&&M==5)
{jdq(0);led_dlkz(1,1);}
if(F==0&&zt==1&&0<=M<5)
{TR0=1;LED_SS();}
if(F==0&&zt==1&&M>=5)
{TR0=0;led_dlkz(3,1);}
}
/*********************************时钟功能选择函数************************/
void sz_xz()
{
uc t;
t=GetButtonValue_1();
switch(t)
{
case 1:smg_SF();break;
case 2:smg_FM();break;
}
}
/******************************温度参数数码管显示函数******************************/
void smg_wd1()
{
OutputSMG(0,tab[13]);
OutputSMG(1,tab[3]);
OutputSMG(6,(tab[wd_kz/10]));
OutputSMG(7,tab[wd_kz%10]);
}
/******************************温度数码管显示函数******************************/
void smg_wd()
{
ui temp;
temp=rd_temperature();
temp=temp*0.625;
OutputSMG(0,tab[13]);
OutputSMG(1,tab[1]);
OutputSMG(5,tab[temp/100]);
OutputSMG(6,(tab[temp/10%10]&0x7f));
OutputSMG(7,tab[temp%10]);
if(temp>(wd_kz*10)&&zt==0)
{TR0=1;jdq(1);LED_SS();}
else
{TR0=0;jdq(0);led_dlkz(3,1);}
}
/**********************按键函数****************/
uc GetButtonValue_1(void)
{
H3=0;
H2=H1=H4=1;
L1=L2=L3=L4=1;
if(L1==0&&zt==1)
{Delay1ms();return 1;while(L1==0);}//s17 切换时秒显示
return 2;
}
void keycan()
{
H3=0;
H2=H1=H4=1;
L1=L2=L3=L4=1;
if(L1==0&&zt==0)
{Delay1ms();wd_kz--;while(L1==0){jm_xs();} }//s17 温度参数减
H4=0;
H1=H3=H2=1;
L1=L2=L3=L4=1;
if(L2==0)
{Delay1ms();jm++;if(jm>2){jm=0;}while(L2==0);}//s12 界面切换
H3=0;
H1=H2=H4=1;
L1=L2=L3=L4=1;
if(L2==0)
{Delay1ms();zt++;if(zt>1){zt=0;}while(L2==0){jm_xs();}}//s13 温度/时钟控制
H4=0;
H2=H1=H3=1;
L1=L2=L3=L4=1;
if(L1==0&&zt==0)
{Delay1ms(); wd_kz++;while(L1==0){jm_xs();}}//s16 温度参数加
}
/*********开机消除85显示**********/
void ds18b20_xxx()
{
rd_temperature();
Delay750ms();
}
/********界面切换函数*************/
void jm_xs()
{
switch(jm)
{
case 0:smg_wd(); break;
case 1:sz_xz(); break;
case 2:smg_wd1();break;
}
}
/****************初始化函数**********/
void csh_system()
{
LED(0xff);//LED灯全关闭
fmq(0);//关闭蜂鸣器
jdq(0);//关闭继电器
}
void main()
{
ds18b20_xxx();
savetime(tac); //时钟初始化
Timer0Init();
csh_system();
while(1)
{
GetButtonValue_1();
keycan();
LED_ZS();
jm_xs();
}
}
ds18B20.c
#include "STC15F2K60S2.H"
#include "onewire.h"
sbit DQ = P1^4;
单总线延时函数
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--){
for(i=0;i<12;i++);
}
}
void Delay_us(void)
{
unsigned char i;
i = 30;
while (--i);
}
//通过单总线向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;
// unsigned char index = 0;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
Delay_us();
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); // 延时大于480us
DQ = 1;
Delay_OneWire(10); // 14
initflag = DQ; // initflag等于1初始化失败
Delay_OneWire(5);
return initflag;
}
//缺失自己写
//DS18B20温度采集程序:整数
unsigned int rd_temperature()
{
// unsigned int temp;
unsigned char L,H;
init_ds18b20();
Write_DS18B20(0xcc);//跳过ROM指令
Write_DS18B20(0x44);//转换温度指令
Delay_OneWire(80); // 延时大于480us
init_ds18b20();
Write_DS18B20(0xcc);//跳过ROM指令
Write_DS18B20(0xbe);//读温度指令
L = Read_DS18B20();
H = Read_DS18B20();
// temp = H<<4;
// temp|=(L>>4);
return (H<<8)+L;
}
ds18b20.h
#ifndef _ONEWIRE_H
#define _ONEWIRE_H
//函数声明 全部声明
void Delay_OneWire();
void Delay_us();
void Write_DS18B20();
unsigned char Read_DS18B20();
bit init_ds18b20();
unsigned int rd_temperature();
#endif
ds1302.c
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <STC15F2K60S2.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);
}
void readtime(unsigned char *time)
{
unsigned char i=0;
unsigned char dat=0x81;
for (i=0;i<7;i++)
{
*(time+i)=Read_Ds1302_Byte (dat); //i对应的是偏移量
dat=dat+2;
}
}
void savetime(unsigned char *Time)
{
unsigned char i=0;
unsigned char dat=0x80;
Write_Ds1302_Byte(0x8e,0x00);//禁止写保护
for (i=0;i<7;i++)
{
Write_Ds1302_Byte( dat, *(Time+i) );
dat=dat+2;
}
Write_Ds1302_Byte(0x8e,0x80);//启用写保护
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void readtime(unsigned char *time);
void savetime(unsigned char *Time);
#endif
代码效果
二维码形式
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时