时钟电路和源程序

图中,年、月、日及时间选用的是1.2寸共阳数码管,星期选用的是2.3寸数码管,温度选用的是0.5寸数码管,也可根据个人的爱好选用不同规格的数码管。原理图如下图所示:



上图中,CPU选用的是AT89C2051,时钟芯片选用的是Dallas公司的DS1302,温度传感器选用的是Dallas公司的数字温度传感器DS1820,显示驱动芯片选用的是德州仪器公司的TPIC6B595,也可选用与其兼容的芯片NC595或国产的AMT9595。整个电子钟用两个键来调节时间和日期。一个是位选键,一个是数字调节键。按一下位选键,头两位数字开始闪动,进入设定调节状态,此时按数字调节键,当前闪动位的数字就可改变。全部参数调节完后,五秒钟内没有任何键按下,则数字停止闪动,退出设定调节状态。


源程序清单如下(无温度显示程序):


start:do;
$include(reg51.dcl)
   declare (sclk,io,rst) bit at (0b3h) register; /* p33,p34,p35 */
   declare (command,data,n,temp1,num) byte;
   declare a(9) byte;
   declare ab(6) byte;
   declare aco(11) byte constant (0fdh,60h,0dah,0f2h,66h,0b6h,0beh,  
   0e0h,0feh,0f6h,00h);
   declare week(11) byte constant (0edh,028h,0dch,7ch,39h,75h,0f5h,
  2ch,0fdh,7dh,00h);
  declare da literally 'p15',clk literally 'p16',ale literally 'p17',
  mk literally 'p11',sk literally 'p12';
  clear:procedure;
  sclk=0;io=0;rst=0;
  end clear;
  send1302:procedure(comm);
  declare (i,comm) byte;
  do i=0 to 7;
  comm=scr(comm,1);
  io=cy;
  call time(1);
  sclk=0;
  call time(1);
  sclk=1;
  end;
  end send1302;
  wbyt1:procedure(com,dat);/*
字节写过程
*/
  declare (com,dat) byte;
  call clear;
  rst=1;
  call send1302(com);
  call send1302(dat);
  call clear;
  end wbyt1;
  wbyt8:procedure;/*
时钟多字节突发模式写过程
*/
  declare j byte;
  call clear;
  a(7)=A(6);a(6)=a(0);
  rst=1;
  call send1302(command);
  do j=1 to 8;
  call send1302(a(j));
  end;
  call clear;
  end wbyt8;
  RBYT1:PROCEDURE;
  DECLARE I BYTE;
  CALL CLEAR;
  RST=1;
  call send1302(0c1h);
  IO=1;
  DO I=0 TO 7;
  SCLK=1;
  SCLK=0;
  CY=IO;
  N=SCR(N,1);
  END;
  A(8)=N;
  CALL CLEAR;
  END RBYT1;
  send595:procedure;
  declare k byte;
  do k=0 to 7;
  data=scr(data,1);
  da=cy;
  clk=1;
  clk=0;
   end;
  end send595;
  send595_1:procedure;
  declare k byte;
  do k=0 to 7;
  data=scr(data,1);
  da1=cy;
  clk1=1;
  clk1=0;
  end;
  end send595_1;
  rb1:procedure(abc,j);
  DECLARE (I,j,abc) BYTE;
  CALL CLEAR;
  RST=1;
call send1302(abc);
IO=1;
DO I=0 TO 7;
SCLK=1;
SCLK=0;
CY=IO;
N=SCR(N,1);
END;
ab(j)=N;
ab(j)=dec(ab(j));
CALL CLEAR;
end rb1;
rbyt6:procedure;
call rb1(0f1h,0);
call rb1(0f3h,1);
call rb1(0f5h,2);
call rb1(0f7h,3);
call rb1(0f9h,4);
call rb1(0fbh,5);
call rb1(0fdh,6);
end rbyt6;
wbyt6:procedure;
call wbyt1(8eh,0); /* write enable */
call wbyt1(0f0h,ab(0));
call wbyt1(0f2h,ab(1));
call wbyt1(0f4h,ab(2));
call wbyt1(0f6h,ab(3));
call wbyt1(0f8h,ab(4));
call wbyt1(0fah,ab(5));
call wbyt1(0fch,ab(6));
call wbyt1(8eh,80h); /* write disable */
end wbyt6;
rbyt8:procedure;/*
时钟多字节突发模式读过程
*/
declare (i,j) byte;
call clear;
rst=1;
call send1302(command);
io=1;
do j=1 to 8;
do i=0 to 7;
sclk=1;
call time(1);
sclk=0;
cy=io;
n=scr(n,1);
end;
a(j)=n;
end;
call clear;
a(0)=a(6);a(6)=A(7);
a(0)=a(0) and 0fh;
if a(0)>6 then a(0)=0;
CALL RBYT1;
if (a(1)=0 and a(2)=0 and a(3)=0) then
do;
do num=0 to 35;
call time(250);
end;
temp1=1;
end;
if temp1=1 then
do;
temp1=0;
ab(4)=ab(4)+1;
if ab(4)>99h then
do;
ab(4)=0;
ab(5)=ab(5)+1;
if ab(5)>99h then ab(5)=0;
end;
call wbyt6;
end;
end rbyt8;
display:procedure; /*jieya,yima,fasong*/
declare (i,n,m) byte;
n=a(0) and 0fh; /* send week */
data=week(n);
call send595;
n=a(4); /* send date */
n=n and 0fh;
data=aco(n);
call send595;
n=a(4);
n=shr(n,4);
data=aco(n);
call send595;
do i=1 to 3; /* send second,minute,hour */
n=a(i);
n=n and 0fh;
data=aco(n);
call send595;
n=a(i);
n=shr(n,4);
data=aco(n);
call send595;
end;
do i=5 to 6; /* send month,year */
n=a(i);
n=n and 0fh;
data=aco(n);
call send595;
n=a(i);
n=shr(n,4);
data=aco(n);
call send595;
end;
n=a(8); /* send 19 or 20 */
n=n and 0fh;
data=aco(n);
call send595;
n=a(8);
n=shr(n,4);
data=aco(n);
call send595;
do m=0 to 5;
n=ab(m);
n=n and 0fh;
data=aco(n);
call send595_1;
n=ab(m);
n=shr(n,4);
data=aco(n);
call send595_1;
end;
ale=0;
ale=1;
end display;
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; /* set date/time (1997,7,1,8:00:00,week 3) */
call wbyt1(8eh,0); /* write enable*/
call wbyt1(80h,00h);/* start colock */
call wbyt1(0beh,0abh);/*
两个二极管与8K电阻串联充电
*/
command=0beh; /* write colock/date */
call wbyt8;
call wbyt1(0c0h,a(8));
call wbyt1(8eh,80h); /* set write protect bit */
end beginset;
key:procedure;
declare (i,time1,k1,tem) byte;
call time(100);
k1=7;time1=30;
if mk=0 then
do;
do while time1>0;
week: if k1=0 then
do;
do i=0 to 5;
/* call hz(a(0)); */
end;
do i=0 to 3;
/* call hz0; */
end;
end;
tem=a(k1);
if k1=7 then tem=a(8);
a(k1)=0aah;
if k1=7 then a(8)=0aah;
call display;
call time(254);
call time (254);
a(k1)=tem;
if k1=7 then a(8)=tem;
call display;
call time(254);
call time(254);
call time(254);
time1=time1-1;
if mk=0 then
do;call time(100); /*MOD KEY PROCESS*/
TIME1=30;
IF MK=0 THEN
DO;
k1=k1-1;
DO WHILE K1=0FFH;
K1=7;
END;
END;
end;
IF SK=0 THEN
DO;CALL TIME(100); /*SET KEY PROCESS*/
TIME1=30;
IF SK=0 THEN
DO;
tem=tem+1;
tem=dec(tem);
DO CASE K1;
DO WHILE tem=7;/*week*/
tem=0;
END;
DO WHILE tem=60H;/*scond*/
tem=0;
END;
DO WHILE tem=60H;/*minute*/
tem=0;
END;
DO WHILE tem=24H;/*hour*/
tem=0;
END;
DO WHILE tem=32H;/*date*/
tem=1;
END;
DO WHILE tem=13H;/*month*/
tem=1;
END;
DO while tem=100h; /* YEAR */
tem=00;
END;
DO WHILE TEM>=21H;
tem=19H;
END;
END;
A(K1)=tem;
if k1=7 then a(8)=tem;
END;
END;
END;
END;
end key;
main$program:
mk=1;sk=1;temp1=0;num=0;p32=1;
if sk=0 then call beginset;
clk=0;da=0;ale=1;
loop:
do while mk=1 ;
if a(0)>6 then a(0)=0;
command=0bfh;
call rbyt8;
call display;
do while mk=0;
call key;
call wbyt1(8eh,0);
command=0beh;
call wbyt8;
call wbyt1(0C0H,A(8));
call wbyt1(8eh,80h);
end;
end;
goto loop;
end start;

 

→ 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单片机控制MOS管电路图通常是指将单片机与MOS管进行连接,通过单片机的控制来改变MOS管的导通与截止状态。下面是一个简单的单片机控制MOS管的电路图示例: 该电路图中,单片机通过GPIO口控制MOS管的输入端,使得MOS管在适当的时候导通或截止。具体电路图如下: ┌───┐ │ │ │ MCU │ │ │ └───┘ │ │(GPIO口) │ ▼ ┌───┐ │ │ ─│ MOS │─ │ 管 │ ┌│ │┐ 控制信号 │ │ 输出负载 └┬───┬┘ │ │ │ │ ─│ Q │─ │ │ ─│ R │─ │ │ ────── 在单片机控制下,当GPIO口输出高电平时,MOS管的Q端与R端之间形成通路,电流可以通过MOS管,从而控制输出负载。当GPIO口输出低电平时,MOS管的Q端与R端之间断开,电流无法通过MOS管,从而截断输出负载。 通过单片机控制MOS管的导通与截止状态,可以实现对电路的开关控制。这可以用于许多应用中,如电子设备的电源控制、电机控制、照明等。此外,还可以通过调整单片机的控制信号的频率和占空比来实现对MOS管的调光、调速等功能。 以上就是一个简单的单片机控制MOS管电路图的介绍,希望对您有所帮助。 ### 回答2: 单片机控制mos管电路图主要由以下几个部分组成:单片机主控芯片、mos管、输入输出口、电源和配套电路。 单片机主控芯片是整个电路的核心,它可以控制mos管的开关状态,通过编程控制电流的通断。常见的单片机主控芯片有51系列、AVR系列、ARM系列等。 mos管(金属氧化物半导体场效应晶体管)是一种常用的功率开关元件,具有高速开关特性和低开关损耗。通常使用N沟道MOS管或P沟道MOS管,根据设计需求选择。 输入输出口是单片机与mos管之间的连接通道,负责接收外部信号并输出控制信号。通常使用GPIO(通用输入输出口)来实现。 电源是为整个电路提供电能的装置,需要根据mos管的工作电压和电流要求进行选型。 配套电路包括电阻、电容、二极管等元件,用于限制电流、稳定电压、保护电路等。例如,可以使用电阻和电容组成的低通滤波电路,用于稳定输入信号。 单片机控制mos管电路图的设计需要根据具体应用场景和要求进行调整,同时还需要考虑单片机的输入输出口与mos管的电压电流要求匹配,以及电路的稳定性、安全性等因素。设计完成后,可以通过编程控制单片机的输出口来控制mos管的开关状态,实现对外部设备的控制。 ### 回答3: 单片机控制MOS管电路图是一种常见的电路设计,它通常由单片机、MOS管、外围电路和电源组成。 首先,单片机是整个系统的核心控制器。它接收输入信号,并且根据预设的程序和算法对MOS管进行控制。单片机通常由一组输入/输出引脚、中央处理器(CPU)、存储器(RAM和ROM)以及时钟电路组成。 其次,MOS管是一种常用的电子元件,主要用于电子开关和放大电路。它通常由沟道、栅极和源/漏极组成。在单片机控制下,通过控制MOS管的栅极电压,可以实现电流的开关和放大功能。 外围电路主要用于连接单片机和MOS管之间的信号传输和电源供应。它通常包括电阻、电容、电感等元件,用于限流、滤波和保护电路。 最后,电源提供所需的电压和电流,以保证整个电路正常工作。在单片机控制MOS管电路中,电源的电压通常需要满足MOS管和单片机的工作要求。 总结来说,单片机控制MOS管电路图是一种由单片机、MOS管、外围电路和电源组成的电路设计。通过单片机的控制,可以实现对MOS管的开关和放大功能,从而实现各种电子设备的控制和各种应用的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值