几个单片机应用实例.docx
《几个单片机应用实例.docx》由会员分享,可在线阅读,更多相关《几个单片机应用实例.docx(49页珍藏版)》请在冰豆网上搜索。
![几个单片机应用实例.docx](https://file1.bdocx.com/fileroot1/2022-12/30/13dfa486-7372-466b-a4bf-e410131abe29/13dfa486-7372-466b-a4bf-e410131abe291.gif)
几个单片机应用实例
几个单片机应用实例
例一:
一个液晶显示的数字式电脑温度计
液晶显示器分很多种类,按显示方式可分为段式,行点阵式和全点阵式。
段式与数码管类似,行点阵式一般是英文字符,全点阵式可显示任何信息,
如汉字、图形、图表等。
这里我们介绍一种八段式四位LCD显示器,该显
示器内置驱动器,串行数据传送,使用非常方便。
原理图如下图:
下图是长沙太阳人科技开发有限公司生产的4位带串行接口的液晶显示模块SMS0403
的外部引线简图:
有关该模块的具体参数,请查看该公司网站。
此例中使用的温度传感器为美国DALLAS公司生产的单总线式数字温度传感器。
该传感器本站有其详细的资料可供下载。
此例稍加改动,即可做成温控器。
下载驱动该模块的源程序LCD.PLM
例2:
LED显示电脑电子钟
本例介绍一种用LED制作的电脑电子钟(电脑万年历)。
原理图如下图所示:
上图中,CPU选用的是AT89C2051,时钟芯片选用的是Dallas公司的DS1302,
温度传感器选用的是Dallas公司的数字温度传感器DS1820,显示驱动芯片
选用的是德州仪器公司的TPIC6B595,也可选用与其兼容的芯片NC595或
国产的AMT9595。
整个电子钟用两个键来调节时间和日期。
一个是位选
键,一个是数字调节键。
按一下位选键,头两位数字开始闪动,进入设
定调节状态,此时按数字调节键,当前闪动位的数字就可改变。
全部参
数调节完后,五秒钟内没有任何键按下,则数字停止闪动,退出设定调
节状态。
源程序清单如下(无温度显示程序):
start:
do;
$include(reg51.dcl)
declare(sclk,io,rst)bitat(0b3h)register;/*p33,p34,p35*/
declare(command,data,n,temp1,num)byte;
declarea(9)byte;
declareab(6)byte;
declareaco(11)byteconstant(0fdh,60h,0dah,0f2h,66h,0b6h,0beh,
0e0h,0feh,0f6h,00h);
declareweek(11)byteconstant(0edh,028h,0dch,7ch,39h,75h,0f5h,
2ch,0fdh,7dh,00h);
declaredaliterally'p15',clkliterally'p16',aleliterally'p17',
mkliterally'p11',skliterally'p12';
clear:
procedure;
sclk=0;io=0;rst=0;
endclear;
send1302:
procedure(comm);
declare(i,comm)byte;
doi=0to7;
comm=scr(comm,1);
io=cy;
calltime
(1);
sclk=0;
calltime
(1);
sclk=1;
end;
endsend1302;
wbyt1:
procedure(com,dat);/*字节写过程*/
declare(com,dat)byte;
callclear;
rst=1;
callsend1302(com);
callsend1302(dat);
callclear;
endwbyt1;
wbyt8:
procedure;/*时钟多字节突发模式写过程*/
declarejbyte;
callclear;
a(7)=A(6);a(6)=a(0);
rst=1;
callsend1302(command);
doj=1to8;
callsend1302(a(j));
end;
callclear;
endwbyt8;
RBYT1:
PROCEDURE;
DECLAREIBYTE;
CALLCLEAR;
RST=1;
callsend1302(0c1h);
IO=1;
DOI=0TO7;
SCLK=1;
SCLK=0;
CY=IO;
N=SCR(N,1);
END;
A(8)=N;
CALLCLEAR;
ENDRBYT1;
send595:
procedure;
declarekbyte;
dok=0to7;
data=scr(data,1);
da=cy;
clk=1;
clk=0;
end;
endsend595;
send595_1:
procedure;
declarekbyte;
dok=0to7;
data=scr(data,1);
da1=cy;
clk1=1;
clk1=0;
end;
endsend595_1;
rb1:
procedure(abc,j);
DECLARE(I,j,abc)BYTE;
CALLCLEAR;
RST=1;
callsend1302(abc);
IO=1;
DOI=0TO7;
SCLK=1;
SCLK=0;
CY=IO;
N=SCR(N,1);
END;
ab(j)=N;
ab(j)=dec(ab(j));
CALLCLEAR;
endrb1;
rbyt6:
procedure;
callrb1(0f1h,0);
callrb1(0f3h,1);
callrb1(0f5h,2);
callrb1(0f7h,3);
callrb1(0f9h,4);
callrb1(0fbh,5);
callrb1(0fdh,6);
endrbyt6;
wbyt6:
procedure;
callwbyt1(8eh,0);/*writeenable*/
callwbyt1(0f0h,ab(0));
callwbyt1(0f2h,ab
(1));
callwbyt1(0f4h,ab
(2));
callwbyt1(0f6h,ab(3));
callwbyt1(0f8h,ab(4));
callwbyt1(0fah,ab(5));
callwbyt1(0fch,ab(6));
callwbyt1(8eh,80h);/*writedisable*/
endwbyt6;
rbyt8:
procedure;/*时钟多字节突发模式读过程*/
declare(i,j)byte;
callclear;
rst=1;
callsend1302(command);
io=1;
doj=1to8;
doi=0to7;
sclk=1;
calltime
(1);
sclk=0;
cy=io;
n=scr(n,1);
end;
a(j)=n;
end;
callclear;
a(0)=a(6);a(6)=A(7);
a(0)=a(0)and0fh;
ifa(0)>6thena(0)=0;
CALLRBYT1;
if(a
(1)=0anda
(2)=0anda(3)=0)then
do;
donum=0to35;
calltime(250);
end;
temp1=1;
end;
iftemp1=1then
do;
temp1=0;
ab(4)=ab(4)+1;
ifab(4)>99hthen
do;
ab(4)=0;
ab(5)=ab(5)+1;
ifab(5)>99hthenab(5)=0;
end;
callwbyt6;
end;
endrbyt8;
display:
procedure;/*jieya,yima,fasong*/
declare(i,n,m)byte;
n=a(0)and0fh;/*sendweek*/
data=week(n);
callsend595;
n=a(4);/*senddate*/
n=nand0fh;
data=aco(n);
callsend595;
n=a(4);
n=shr(n,4);
data=aco(n);
callsend595;
doi=1to3;/*sendsecond,minute,hour*/
n=a(i);
n=nand0fh;
data=aco(n);
callsend595;
n=a(i);
n=shr(n,4);
data=aco(n);
callsend595;
end;
doi=5to6;/*sendmonth,year*/
n=a(i);
n=nand0fh;
data=aco(n);
callsend595;
n=a(i);
n=shr(n,4);
data=aco(n);
callsend595;
end;
n=a(8);/*send19or20*/
n=nand0fh;
data=aco(n);
callsend595;
n=a(8);
n=shr(n,4);
data=aco(n);
callsend595;
dom=0to5;
n=ab(m);
n=nand0fh;
data=aco(n);
callsend595_1;
n=ab(m);
n=shr(n,4);
data=aco(n);
callsend595_1;
end;
ale=0;
ale=1;
enddisplay;
beginset:
procedure;
a(0)=06h;a
(1)=58h;a
(2)=59h;a(3)=23h;
a(4)=30h;a(5)=06h;a(6)=97h;a(7)=00;
a(8)=19h;/*setdate/time(1997,7,1,8:
00:
00,week3)*/
callwbyt1(8eh,0);/*writeenable*/
callwbyt1(80h,00h);/*startcolock*/
callwbyt1(0beh,0abh);/*两个二极管与8K电阻串联充电*/
command=0beh;/*writecolock/date*/
callwbyt8;
callwbyt1(0c0h,a(8));
callwbyt1(8eh,80h);/*setwriteprotectbit*/
endbeginset;
key:
procedure;
declare(i,time1,k1,tem)byte;
calltime(100);
k1=7;time1=30;
ifmk=0then
do;
dowhiletime1>0;
week:
ifk1=0then
do;
doi=0to5;
/*callhz(a(0));*/
end;
doi=0to3;
/*callhz0;*/
end;
end;
tem=a(k1);
ifk1=7thentem=a(8);
a(k1)=0aah;
ifk1=7thena(8)=0aah;
calldisplay;
calltime(254);
calltime(254);
a(k1)=tem;
ifk1=7thena(8)=tem;
calldisplay;
calltime(254);
calltime(254);
calltime(254);
time1=time1-1;
ifmk=0then
do;calltime(100);/*MODKEYPROCESS*/
TIME1=30;
IFMK=0THEN
DO;
k1=k1-1;
DOWHILEK1=0FFH;
K1=7;
END;
END;
end;
IFSK=0THEN
DO;CALLTIME(100);/*SETKEYPROCESS*/
TIME1=30;
IFSK=0THEN
DO;
tem=tem+1;
tem=dec(tem);
DOCASEK1;
DOWHILEtem=7;/*week*/
tem=0;
END;
DOWHILEtem=60H;/*scond*/
tem=0;
END;
DOWHILEtem=60H;/*minute*/
tem=0;
END;
DOWHILEtem=24H;/*hour*/
tem=0;
END;
DOWHILEtem=32H;/*date*/
tem=1;
END;
DOWHILEtem=13H;/*month*/
tem=1;
END;
DOwhiletem=100h;/*YEAR*/
tem=00;
END;
DOWHILETEM>=21H;
tem=19H;
END;
END;
A(K1)=tem;
ifk1=7thena(8)=tem;
END;
END;
END;
END;
endkey;
main$program:
mk=1;sk=1;temp1=0;num=0;p32=1;
ifsk=0thencallbeginset;
clk=0;da=0;ale=1;
loop:
dowhilemk=1;
ifa(0)>6thena(0)=0;
command=0bfh;
callrbyt8;
calldisplay;
dowhilemk=0;
callkey;
callwbyt1(8eh,0);
command=0beh;
callwbyt8;
callwbyt1(0C0H,A(8));
callwbyt1(8eh,80h);
end;
end;
gotoloop;
endstart;
例3:
一个6位LED、4个按键的显示板
按键和显示是单片机系统的基本输入输出部件,下面介绍一个由74LS164驱动的6位数码管和4个按键组成的通用仪表面板。
原理图如下图所示:
其线路板图如下图所示:
注:
此板中多了三个LED发光管,这三个发光管是分别接在IC4,IC5,IC6的13脚(Q7,数据
串出脚)上的
例四:
智能电机转速计数器
本电路由AT89C51单片机、CD4511、LCD数码管、磁敏霍尔元件等组成。
电路工作原理。
用磁敏元件作为传感器。
在无外磁场时,磁敏传感器的OUT端输出+4.35V(1电平),当电机转动一圈时,带动小磁铁N从磁敏传感器上掠过一次,传感器在外加磁场的作用下,输出一次+0.05V(0电平)脉冲信号,在程序中设INT0为边沿触发,OUT端这一变化通过INT0送至AT89C51,产生一次中断,使累加器A自动加1。
计数一次。
电机每转动一圈,产生一次中断,累加器加1。
当软件计数器T0定时1s时,将计数值送LED显示,LED显示的数值即当前电机每秒钟转速。
由于采用软件定时,定时误差值比常规硬件定时器小得多。
CD4511是BCD—七段LED锁存/译码/驱动器。
当LE为低电平时,将加在A、B、C、D端的数据译成段驱动信号,经限流电阻送到数码管的段控制线上。
当LE为高电平时,驱动信号被锁存在CD4511的输出端,实现静态显示。
因CD4511输出为高电平有效,故选用共阴极数码管。
D1为工作指示灯,供调试用。
本电路的调试分软件和硬件两部分。
建议先检查传感器是否工作,这可从D1的显示看出。
LED显示就要借助软件了。
本文附有调试程序ts.Asm。
单步执行该程序,如果数码管显示的不是789,那么硬件一定有问题,请仔细检查。
当确信硬件无误后,便可录入main.Asm程序,仿真调试通过后,将程序写入AT89C51中,电路设计就完成了。
本系统能在0~999转/s范围内对电机转动进行正确计数,满足了生产的需要。
将电路稍加改动,还可以扩展为脉冲频率计等。
例五:
自制学生坐姿矫正仪
《电子报》曾介绍过用普通电子电路制作的学生视力保护小装置,受其启发笔者用单片机加少许元件构成了一个简单实用的学生坐姿矫正仪。
硬件电路见附图。
采用AT89C2051单片机控制。
P3.7口输出大约38kHz的脉冲信号,驱动红外发光管LED1。
接收管PTR1是一体化的红外接收头。
安装时让红外发光管和接收头构成反射式传感器。
当学生的坐姿不正确,即头离书本太近时,LED1发出的38kHz红外光被学生的头部或脸部反射回来,照到PTR1上。
由于接收头的中心频率是38kHz,所以接收头PTR1输出低电平,将单片机的P1.3脚拉低。
经内部程序判断后在单片机的P3.4口输出100ms的高电平,驱动蜂鸣器发声,提醒学生改正坐姿。
单片机的定时器T0工作于方式2来产生大约38kHz的方波信号。
程序用FRANKLINC15编写。
程序清单如下:
#include<reg51.H>
#defineucharunsignedchar
#defineuintunsignedint
sbitp3_7=p3^7;
sbitp3_4=p3^4;
sbitp1_3=p1^3;
/*50ms延时子程序*/
voiddelay(uintms)
{
uchart;
while(ms-){for(t=0;t<125;t++=
{;};
=
=
/*T0中断程序*/
timer0()interrupt1using1{
TH0=0×00;TL0=0×E6;P3_7=!
P3_7;}
/*主程序*/
main()
{
TMOD=O×02;EA=1;ET0=1;TR0=1;TH0=0×00;TL0=0×E6;
while(1);{
while(p1_3=1)
p3_4=1;
delay(2);
p3_4=1;}
}
例六:
用89C2051控制摩托车报警系统
——摩托车防盗报警系统维修后感
笔者花了二百元左右买回一只摩托车防盗报警系统装在车上,非常方便。
该系统有防盗设定、寻车求救、启动暖车、解除防盗等四项功能。
但用了不到一个月,报警喇叭就会无故“嘀嘀”响个不停,所有功能完全消失,联系厂家无果,只能自己修。
经分析,系统由四部分组成,结构如图1所示。
经查,除信号处理电路外,其他电路功能正常。
信号处理电路用的是台湾义隆的EM78P156AP单片机,其原理图如图2。
在用遥控器控制时,PT2272的VT脚输出暂存高电平,相应的数据输出端D1~D4输出锁存高电平。
单片机判断VT信号,再根据D1~D4的状态输出相应的信号。
1.若D1为高电平,报警一次,L、R闪一次,三秒钟后进入防盗状态。
此时,若反馈电路(振动信号,锁头正电)有信号,则报警一次,若五秒钟内仍有反馈信号,则连续报警,直至用遥控器解除。
2.若D2为高电平,报警二次,L、R闪二次,熄火继电器动作一次,防盗解除。
3.若D3为高电平,锁头正电继电器吸合,同时启动继电器吸合两秒钟。
若此时仍然按住遥控器,则启动继电器保持吸合,直到放开遥控器。
4.若D4为高电平,则报警十六次,同时L、R闪十六次。
弄清了以上工作方式,笔者便着手用89C2051单片机替代EM78P156AP,程序流程见图3,接线如图4。
说明:
系统时钟:
11.0592MHz;输入为高电平有效;输出为低电平有效。
程序清单略。
系统调试:
焊一块89C2051电路板;将继电器的驱动管PNP换成NPN,略改电路;拆下EM78P156AP,用排线引出需要的I/O口线并与892051电路板连接;将电路接到12V稳压电源上,按动遥控器,检查继电器吸合情况,一切正常后再接到摩托车上。
读者亦可购买配件(无线遥控发射接收组件、振动传感器、报警器、其他元器件)自己组装系统。
微电脑视频运动检测报警器
《电子报》1999年第46期登载了笔者撰写的《TSD-2视频运动检测器》一文,得到了读者的广泛关注和对产品的一致肯定。
现在,我们应用单片机控制技术,做了较大的改进,使其更具可靠性、实用性和普及性。
一、视频运动检测报警器的功能
视频运动检测属于安全监控系统中的报警设备,功效与红外微波双鉴探测器没有多大区别。
红外、微波等传统探测器受环境因素影响很大、抗干扰能力差、误报率很高,造成值班人员不必要的紧张。
视频运动检测报警器使用时是串联在摄像头到视频监视器的视频信号线上的,它根据视频取样报警,即在监视器屏幕上根据图像内容开辟若干个长方形的隐形警戒区(如画面上的门窗、保险柜等重要部位),当监视器现场有异常情况发生时(如灯光、火情、烟雾、物体的移动等),可使警戒区窗口内图像的亮度、对比度及图像内容(即信号幅度)产生变化,当变化超过设定的安全值时,即可发出报警信号。
改型后的微电脑视频运动检测报警器有如下功能:
1.每路摄像头的视频信号可以通过运动检测报警器在监视器屏幕上设置四个视频报警警戒窗口。
这四个警戒窗口可由单片机控制,在屏幕范围内任意移动。
2.当四个警戒窗口中的任何一个窗口被触发报警后,该警戒区窗口将在屏幕上发生闪动,提示已被触发。
3.具有报警继电器输出,报警时间由单片机控制可调。
4.具有报警自动录像接口,可控制录像机自动录像。
5.可扩展RS-485数据接口,实现多机联动、远程设置、远程监控等功能。
二、视频运动检测报警器的工作原理
微电脑视频运动检测报警器采用模块化设计,每个模块负责处理并实现一个或多个功能,提高了系统的可靠性和应用灵活性。
图1为单路台式微电脑视频运动检测报警器电原理图。
系统主要由单片机89C51、视频处理模块、警戒窗口发生模块、运动检测模块四部分组成。
摄像机的全电视信号由视频处理模块TS1827{1}脚,经前置放大电路分成三路,其中一路与{3}脚的复合窗口脉冲混合,放大后直接送到监视器,因此监视器屏幕上显示的图像将会出现四个长方形警戒窗口。
第二路信号经同步分离电路分离出行、场同步信号,由{8}、{9}脚输出。
第三路经同步头钳位放大电路放大后由{3}脚输出。
调节{11}、{12}脚电位器可调节放大电路增益,用于改变报警检测的触发灵敏度。
警戒窗口脉冲发生模块,用于产生警戒窗口。
行、场同步信号由TS1828{1}、{2}脚输入,行、场同步信号由单片机控制经适当延时,产生延迟脉冲混合成复合窗