单片机

用手机控制家门:基于DTMF的门控系统

想象这样一个情景:我正在跟家里通电话,我在手机上按了几个键,手机产生对应的DTMF信号,DTMF信号经过广州大学城某移动基站收发台BTC,基站控制器BSC,广州移动关口局GMSC,汕头电信关口局最终到达我家的电话线上,被连接在电话线的设备接收识别后自动打开家里楼梯口的电控门。

有点科幻,不过我用了一个晚上的时间设计制作了以上装置。上面的情景有点装B,大家假装没看到就行了。下面进入正题。

家里楼梯口安装有电控门,控制器在楼上,而且只有一个,有时挺不方便。但装多几个控制器的话,一来工作量大,二来重新布线会带来很多麻烦。因此,我想到了DTMF。

说起DTMF可能很多人不知道,但几乎所有人都用过。因为我们打电话拨号时,就是用DTMF技术识别按键的。双音多频 DTMF(Dual Tone Multi Frequency),是电话系统中电话机与交换机之间的一种用户信令,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。

基于DTMF的电控门控制系统

双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如’1′相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。

所以,我决定用MT8870芯片来解码DTMF信号,用51单片机控制电控门,相当把家里电话系统和电控门联系起来。这样只要拿起家里任何一部电话,拨一下设定的密码,就可以打开电控门了。下面是解码部分原理图:

基于DTMF的电控门控制系统原理图

基于DTMF的电控门控制系统原理图

基于DTMF的电控门控制系统原理图

基于DTMF的电控门控制系统原理图

需要注意的是:密码不是随便取的:

  • 密码先不能太短,不然没有保密性
  • 密码不能是在正常拨号中可能出现的,不然电控门会“误开”,建议用上“*”和“#”做前后缀

今年安装好之后演示给我妈看,她看后说:还要按那么多键阿?她意思是我技术不行,好的设计应该是只按一个键就能打开电控门,呵呵。

图文:双向IO口与准双向IO口的区别

单片机P0口是双相口,而P1P2P3是准双相口。举个例子:相信大家都理解准妈妈,就是怀孕的女人,当然这里也是这样的,就不是真正的双相口了。

为什么P0是双向口,这里的差别是什么呢?最主要原因是:P0没有上拉电阻,所以当P0最IO口的时候一定要加上上拉电阻,否则的话,你输出的1就是无效了,这样T2截止了,那么P0都就是呈现高阻状态了。下图分别是P0,P1P2P3的读写数据,红线表示输出,蓝线表示输入(读引脚)

还有一个就是读锁存器的,没画出来。在读引脚的时候,有一点注意:每当读引脚的时候要确保场效应管T2是截止的,否则的话1(高电平)外部数据读不出来,T2会把它拉低,所以通过MOV PX,FFH,把T2截止,就完美了。
作者:Lasuer 转载请出处:http://mtoou.info/io-zhunshuangxiangkou/

单片机

说说单片机是什么的,有什么功能和作用

近来看了学习下单片机知识,了解了单片机是做什么用的。其主要囊括以下内容:

1.单片机的引脚,IO口,SFR,RAM,触发器,寄存器,三态门,逻辑运算,补码,PSW的OV值溢出、晶振,复位,掉电方式,寻址原理

2.单片机自带的功能:传统的C51:计数/定时,串行通讯,中断,拓展键盘(独立式,行列式(循环扫描,中断方式))LED显示(静态显示,动态显示),MLC(LCD)液晶显示。当代的:IIC总线,SPI总线,DA转换,AD转换(0832,0809,串行方式TCL),看门狗,定时器2

3.拓展芯片:可编程IO芯片,译码器,锁存器,驱动器,缓冲机,外部RAM,PCF8563,温度传感器,电容测量,CO2测量,异步电机,跑马灯等等

4.编程方法:C语言(keil c),汇编语言(WAVE)

单片机学习的思路:芯片引脚功能,特殊功能寄存器,时钟时序,使能端,地址分配,数据和地址分时传送,IO口现用以及拓展,相应拓展电路,门电路,复位状态,善用中断,青睐C语言,程序设计,程序优化

一个单片芯片的作用可以连接这么多的芯片进行工作,通过IO,串口和总线联系起来,当然媒介是时钟信号,在这个世界里,掀起了一场电子风暴,飞利浦,STC,wire……

因为你可爱,芯片家族以你为中心展开可,因为你的温柔你的包容,大家都喜欢你了,可是当ARM掀开了21世纪的大门后,当APPLE公司发型ipad之后,当只能手机普及的那刻

你的历史也会就此终结,但你在光辉的电子产业中写下了重重的一笔,现在90%以上的电子产品都是用ARM芯片,单片机只是回味一下了先驱

ARM学习思路和单片机完全不同,是一个革新了,更智能,更快速,更经济使用

关于澡堂自动淋浴器原理及BUG处理方法

最近多名青年反应在澡堂遭遇BUG,由此感生此文。
自动淋浴器的核心技术在于红外线的发射与接收,控制器可能是PLC或单片机的一种,但单片机不会是MCS-51系列的。澡堂的设备是典型即时触发、延时关断型。一言以蔽之,当满足触发条件,即时触发;但触发条件失去后,水流不会立即停止,据我数秒,大概有5sec的延时时间。下面更加具体的介绍各个部分。
在离地面大概120公分的地方,有一个黑色长方形盒状物,其中有一个红色闪光点,我们的大部分信息由此读取。正常状态下红点不亮,当红点亮后5sec后,水流停止。此处实际上输出一道线状红外线,方向垂直于墙壁,这是遥控感应的checkpoint1。
在莲蓬头后方20cm处有一个黑色圆柱状设备,出射一道柱状红外线流,方向垂直于地面,这是checkpoint2。
有人可能注意到这两道红外线是相交的(C1和C2的交集),当交集处出现物体将其阻断,水流即流出。
BUG解决方案是基于此原理的,不再赘述。

本文由:Mr.Anchor 奉献
如若复制、转载请注明原文地址:
http://mtoou.info/linyu-bug/

单片机

单片机延时程序实例讲解

在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,那就是延时程序。下面我凭记忆来讲解延时程序。

课本上讲,1个机器周期=6个状态周期=12个时钟周期,而这个时钟周期与晶振频率有关。我们接下来要上的实验基本都是以12MHz的晶振。12M的频率,得其周期为1/12乘10的-6方s,那么1个机器周期就是它的12倍,即1us,而一般语句需要2个机器周期,例如

MOV R6,#20

DNJZ R6,$

每一次执行时,每一个过程就需要2个机器周期,为1us乘2。.同样C语言中for循环语句没执行一次也是2个机器周期,即2us。下面我会以每个语句执行一次用时的2us为基本单位,不会再细化了。

汇编语言最基本延时:

MOV R6,#20

D1:MOV R7,#248

DNJZ R7,$//循环248次,共用248X2us,

DNJZ R6,D1

我开始也是搞不懂怎么算它到底延时多少,现在给大家写它表达式:

我觉得应该从最后往前算,在MOR R7,#248执行一次前提下,用时1X2us,然后循环减248,用时248X2us,故共用时[2+2X248]us。

然而又由于DNJZ R6,D1,上面的过程又循环20次,故上面的循环最终用时20X[2+2X248]us。

接着注意到单纯DNJZ R6,D1会用时20X2=40us。

最后注意过执行唯一一次的 MOV R6,#20会用时1X2us。

所有,最终表达式为:1X2us+20X[2+2X248]us+20X2=10002us=10ms=0.01s。

同理,用c51编的延时程序要了解它必须也要写出它的表达式,下面的C51延时程序可以试着自己写出表达式:

void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}

我还是把表达式写在这,[(248X2+2)X20+2]X20=199240=199.24ms=0.2s

再给一个我验证过的程序,这是个比较典型和基本的延时程序应用例子:

#include<reg51.h>
sbit L1=P0^0;
void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
L1=1;
delay02s();
}
}

能看出它的功能么?他就是让一个灯不停的闪啊闪,亮个0.2s,又熄个0.2s,如此反复。

本文由:蒋匿 奉献
如若复制、转载请注明原文地址:
http://mtoou.info/danpianji-yanshichengxu/

中颖单片机——国内51增强单片机未来主流

这两天一直在调试中颖单片机,对于中颖单片机有了自己的看法。

自己用过51、AVR、PCI。最近有一个小项目。需要两个usart。朋友推荐用中颖的sh88f516.这个单片机性价比不错。全部程序用51移植就可以,引脚都通用。类似的51核芯片我也用过stc的,但是看到stc的数据手册之后。感觉用着很不爽。连数据手册里边都是广告。用了一次之后就再也不用了。

关于中颖单片机。我感觉这个芯片以后应该51增强单片机中的主流。性价比非常好。能够串口直接下载程序。数据手册和pic的类似。这个应该是初学者最好的入门工具。学会之后可以很轻松的入门avr、pic。不过感觉现在对于中颖单片机的市场推广不是很好。感觉使用者还是很少。百度上资料很少。但是我相信,这个芯片未来2年,一定能够占领中国增强型51的大部分市场份额。

作者:冰中的沸水
如若复制、转载请注明原文地址:
http://mtoou.info/51-zhongying/

宏晶单片机

宏晶单片机设置强上拉模式让数码管更亮!

STC(宏晶)系列单片机的I/O口具有强上拉模式,何为强上拉模式?

宏晶单片机I/O口可以设置成四种模式:准双向口/弱上接,推挽/强上拉,输入/高阻,设置成推挽/强上拉,无论输出1和0时能承受的电流都很大。

宏晶单片机的特殊功能寄存器(SFR)对I/O口增加了PXM1、PXM0寄存器,每个口都有这么一对。可通过设置PXM1:PXM0的值选择该口的工作模式:

PXM1,PXM0的定义如下:
0 0 准双向口(传统IO)
0 1 推挽输出(强上拉 ,电流可达20mA,尽量少用)
1 0 仅为输入(高阻)
1 1 开漏,如传统8051的P0口
下面以P1口为例进行说明:
P1口的模式配置寄存器的名字为P1M1、P1M0,地址分别为91H、92H。
例:不论是汇编还是c,寄存器的定义是一样的:
P1M1 equ 91H
P1M0 equ 92H
然后,程序中有以下语句:
汇编语言:
mov p1m1,#00000000B
mov p1m0,#11111111B ;将p1口全部置为强上拉模式
C语言:
P1M0 = 0xC0;
P1M1 = 0xA0;//P1.7开漏,P1.6高阻,P1.5强推挽输出,其他准双向I/O口。

利用宏晶单片机的这个功能,将数码管显示变得更亮些简直是轻而易举,以前我老是想着加上拉电阻呀、购买更高亮度的数码管呀,现在呀,觉得真好,用软件这么一设就搞定了。真是爽啊!(我用的单片机是STC11F02E、STC12C5A60S2)。

不过,在这里有两点忠告:

  1. 蚂蚁能拖动比自己重100倍的东西,但是也毕竟是蚂蚁,让蚂蚁去拉马车显然不行。因此,强上拉的“强”仅仅是相对的,拉个数码管是可以的,但拉动继电器之类的器件,你可还是要老老实实的按标准的电路来做,该加三极管的时候你还得要加,不要过于贪心了。
  2. 一旦你将I/O口设为上拉(推挽)模式了,你千万不能把两个口的线搭连在一起了,否则,一旦一个脚是输出1另一个脚是输出0,那你这个口是烧定了。而没有设为上拉模式,则一般不会损坏I/O口。

作者:风铃
如若复制、转载请注明原文地址:
http://mtoou.info/stc-qiangshangla/

51单片机多字节除的方法

;51单片机多字节的除法
;R4R5R6R7放被除数 R0R1R2R3放除数
;当除数的长度为4字节时 R3R4R5R6是余数 R7是商
;当除数的长度为3字节时 R3R4R5是余数 R6R7是商
;当除数的长度为2字节时 R3R4是余数 R5R6R7是商
;当除数的长度为1字节时 R3是余数 R4R5R6R7是商

;被除数是双字时,将R4R5置为0即可,这个程序包打天下
;用一个单元来放中间值 单元名为danyuan
danyuan equ 3BH
MOV R7,#0ffh
MOV R6,#0ffh
MOV R5,#0ffh
MOV R4,#0ffh
MOV R3,#100
MOV R2,#0H
MOV R1,#0H
MOV R0,#0H
MOV B,#08H
CJNE R0,#00H,DVDL
MOV B,#10H
CLR A
XCH A,R3
XCH A,R2
XCH A,R1
XCH A,R0
CJNE R0,#00H,DVDL
CLR A
XCH A,R2
XCH A,R1
XCH A,R0
MOV B,#18H
CJNE R0,#00H,DVDL
CLR A
XCH A,R1
XCH A,R0
MOV B,#20H
CJNE R0,#00H,DVDL
SETB OV
JMP END_DIV
DVDL: MOV danyuan,#00H
DVDL2: CLR C
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
XCH A,R5
RLC A
XCH A,R5
XCH A,R4
RLC A
XCH A,R4
XCH A,danyuan
RLC A
XCH A,danyuan
JC DVDL1
DVDL4: SUBB A,R3
MOV A,R5
SUBB A,R2
MOV A,R4
SUBB A,R1
MOV A,danyuan
SUBB A,R0
JC DVDL3
DVDL1: CLR C
MOV A,R6
SUBB A,R3
MOV R6,A
MOV A,R5
SUBB A,R2
MOV R5,A
MOV A,R4
SUBB A,R1
MOV R4,A
MOV A,danyuan
SUBB A,R0
MOV danyuan,A
INC R7
DVDL3: DJNZ B,DVDL2
END_DIV:
MOV R3,danyuan
NOP ;停在这里看结果
END

;验证无误!

作者:风铃
如若复制、转载请注明原文地址:
http://mtoou.info/51-danpianji-zijie/

用义隆单片机编程应注意的几个原则

一、如果用旧版的汇编编译器Elan Wice 的话,必须用外部软件编写和修改代码(推荐 Ultra Edit),因为Elan Wice自带的编辑器是有缺陷的,写程序的过程中会莫明其妙的多删一行程序,或者出现莫明其妙的符号,而且对汉字支持不好。这些都极其容易出现逻辑错误,郁闷的话可能要查半天,应该尽量的避免。新版的 Wice Plus (支持C语言)解决了这些问题,可以不强制要求用外部代码编辑器。

二、用仿真器带交流电(AC 220V)仿真的话,必须在目标板加上隔离变压器,否则会将仿真器烧坏。因为仿真器用的并口线,并口的“地”跟开关电源的“地”是连通的,如果在目标板连上市电,那么跟仿真器会形成回路,大电流会将仿真器烧毁,所以使用的时候千万注意。至于隔离的原理,可以参考模拟电子,耦合变压器部分的知识,这里就不说了。

三、不要想当然,E78PXX系列发展到现在,已经有了很多款单片机了。每个单片机都有差别,特别是涉及到编程部分,所以切忌想当然,以为EM78P156的程序,直接放到EM78P447上面就能用,实际上,你想错了,无论是入口地址,中断地址,中断前处理,寄存器设置,都不同,胡乱的做只会让你吃大亏,所以用每个义隆单片机之前必须好好的阅读芯片资料,如果经常需要用几个不同芯片的话,可以像我那样,做好几个“程序框架”直接套,这些在后面章节会说到。

四、不要过多的怀疑单片机。在网上听说义隆单片机不好,那么出点什么事就骂单片机烂,而从来不反省是自己的程序问题。见过不少人打电话过来要我们技术支持。最后查处问题,基本上都不是单片机,仿真器的问题,而且程序处理的不好,有些干脆就是写错程序。所以写程序的时候多一点自我检讨,有好处。

I2C串行总线学习总结

起始信号(时钟线为高,数据线由高变低):
void AT24C04_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
结束信号:(时钟线为高,数据线由低变高)
void AT24C04_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
字节传输:(每个字节为8位,一个字节带一个相应位)
发送数据:
void AT24C04_SendByte(BYTE dat)
{
BYTE i;

for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
AT24C04_RecvACK();
}
接收数据:
BYTE AT24C04_RecvByte()
{
BYTE i;
BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}

return dat;
}
数据响应:
每次数据传输成功后,接收器件发送一个应答信号,当第九个信号产生是,产生应答信号的器件将SDA拉低。
接收起始条件和从地址后,应答,选择读写操作。
写操作,每接收一个字节,24c02发送一个应答信号。
读操作,发送一字节后释放总线,等待应答信号。接收到应答信号继续传输数据,接收到非应答信号,等待接收结束信号。
读数据时发送应答信号
void AT24C04_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
写数据时接收应答信号
bit AT24C04_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时

return CY;
}
页写和也读程序:
void AT24C04_WritePage()
{
BYTE i;

AT24C04_Start(); //起始信号
AT24C04_SendByte(0xa0); //发送设备地址+写信号
AT24C04_SendByte(0×00); //发送存储单元地址
for (i=0; i<16; i++)
{
AT24C04_SendByte(TESTDATA[i]);
}
AT24C04_Stop(); //停止信号
}

本文由刘翔奉献!版权归原作者所有。

如若复制、转载请注明原文地址:http://mtoou.info/i2c-zongxian/
单片机

说说台湾宏晶单片机,义隆,合泰,十速单片机各自的特点

宏晶单片机

觉得台湾的宏晶单片机(STC)做的还算成功,基于MCS-52内核,用52的内核在51的基础开发新的功能,添加SPI串口控制,添加双串口,添加双DPTR,添加P4口,添加AD等,利用52比51多出的spf空间开除更多的功能。最主要的是STC的串口下载功能ISP和ASP,使得单片机的开发成本大大降低,也利用ASP做出了单片机内部的EEPROM。

义隆单片机

但国人的特点大家都还是知道的,有了蛋糕大家都想吃。其次还让人满意是义隆单片机(ELAN),基于PIC内核,因为接触51的人更多,所以义隆就把pic的汇编语言改成和51相似的格式,pic里面的MOVWF改成了51的MOV,A,F。义隆的编译器和51不在一个层次,c语言的编译效率不是太高。义隆单片机开发要用昂贵的仿真器和烧写器,芯片是OTP编程,不适合开发,适合做成熟的产品,单片价格只有1元不到,一个字便宜的一逼,老板一听这价格就想用,PIC的价格至少是这个20倍,宏晶的51是它的5倍。最主要的是义隆单片机对LCM显示的直接驱动,避免昂贵的LCM驱动电路。

合泰单片机

合泰(HOLTEK)单片机,基于51内核,但不可以像STC一样可以用KEIL开发。它有和义隆一样的便宜的价格,有更出色的LCM的支持,组主要是人家是51的内核,所以汇编编程会很简单。

十速单片机

十速(tenx)单片机,完全的pic单片机的复制版本。也是今天刚听说,原本以为他和pic单片机的型号是一一对应的,且内部结构和汇编语句完全相同,以为他可以使用pic的编译平台MPLAB,这样可以挂载picc进行c语言开发。但事实不可以。本公司的编译器不太让人满意,据听说它的的c编译器会于今年6月份出炉。我想他的亮点,一是它是真正意义的pic单片机,结构,汇编格式,二是那价格简直就是收废品的价格。

作者:刘翔 版权归原作者所有
如若复制、转载请注明原文地址:http://mtoou.info/danpianji-stc-elan-holtek-tenx/