单片机C语言电子时钟加日历显示编程

发布者:WhisperingWish最新更新时间:2015-10-10 来源: eefocus关键字:单片机  C语言  电子时钟  日历显示 手机看文章 扫描二维码
随时随地手机看文章
一、 任务和要求
设计制作一个电子表并且能够显示日历,用LED数码管直接显示,并且能够通过按键调整时间、年月日,功能为按第一个键被调整的相应调整区域开始闪烁,第二个键加一,第三个减一,第四个确认,最后一个在时分秒和年月日中间相互切换。


二、方案论证
我们在这里选用了C8051F单片机,它是完全集成的混合信号系统级芯片(SoC),具有与8051兼容的高速CIP-51内核,与MCS-51指令集完全兼容,片内集成了数据采集和控制系统中常用的模拟、数字外设及其他功能部件;内置FLASH程序存储器、内部RAM,大部分器件内部还有位于外部数据存储器空间的RAM,即XRAM。C8051F单片机具有片内调试电路,通过4脚的JTAG接口可以进行非侵入式、全速的在系统调试。


三、 系统硬件电路设计
该系统分为两个部分,主控电路和扫描电路,其中键盘扫描和LED扫描为今后节省I/O口线,我将键盘的扫描和LED的扫描共用,在扫描LED的同时也扫描键盘,这样不但方便,而且为今后的扩展留下了相当大的余地。
3.1主控制器
单片机使用c8051f310,并且使用它的开发板易于烧录,改变程序和外围电路。
3.2显示电路
显示板因为常用,是我自己画出来交给工厂做的,采用4个两位共阳数码管,从P0口输出,8位段码分别和P0相接,通过定时器实现秒钟的加一,又因为310有推挽输出,所以不必再加外部电路对数码管进行驱动,直接将它们与P0口相连就可以
3.3键盘电路
键盘是是与数码管的位选相连,通过二极管使它们具有单向性,同时将开头最终通过三极管接单片机的P3.4,只要有按键按下,P3.4就一定会发生变化,通过这个变化在去扫描位就可以得出是哪个按键了。
附电路图:

单片机C语言电子时钟加日历显示编程

四、系统程序设计
系统和程序主要包括:显示程序,键盘扫描程序,自动加秒,分,时,日,月,年,
附程序:

#include "c8051f310.h"
#define uchar unsigned char
#define unchar unsigned char
uchar code duan[10] ={0xa0,0xbd,0x26,0x2c,0x39,0x68,0x60,0xad,0x20,0x28};
//段码表 0 1 2 3 4 5 6 7 8 9
uchar code wei[8]={0x02,0x01,0x08,0x04,0x20,0x10,0x80,0x40};//位码表
uchar code week1[7]={0xbd,0x26,0x2c,0x39,0x68,0x60,0xad} ;//星期一到星期日
uchar dataa,sec,min,hour,ymd,year,year1=9,year2=20,month=8,day=22,week=6;//初始值是7-00:00:00,日期是2009-08-22;
uchar n,cnt,sw1=0,sw2,sw3,cnt1,sw5;
uchar key1,key2,key3,key4=0,key5=0;
sbit P3_4=P3^4;
void scan_key(void);
void delay(ms);

void init(void)
{
IE =0x8A;
TCON =0x50;
TMOD =0x11;
IP =0x0A;
TH0 =(65536-1270)/256;
TL0 =(65536-1270)%256;
TH1 =(65536-500)/256;
TL1 =(65536-500)%256;
}

void time0(void) interrupt 1
{
TH0 =(65536-1270)/256;
TL0 =(65536-1270)%256;
dataa++;
if(sw1!=0&&key4==0) //第一个按键按下,且第四个没有按下
{
if(++cnt1==40)
{
cnt=0;
if(sw5==0&&sw1==1)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xf3; //闪烁程序
P0 =duan[sec%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[sec/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[hour%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[hour/10];
P1 =wei[5];
delay(8);
P1=0x00;
P0 =0x7f;
P1 =wei[6];
delay(8);
P1=0x00;
P0 =week1[week];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==0&&sw1==2)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xcf;
P0 =duan[sec%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[sec/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[min%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[min/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =0x7f;
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =week1[week];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==0&&sw1==3)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0x7f;
P0 =duan[sec%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[sec/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[min%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[min/10];
P1 =wei[3];
delay(8);
P1=0x00;
P0=duan[hour%10];
P1=wei[4];
delay(8);
P1 =0x00;
P0 =duan[hour/10];
P1 =wei[5];
delay(8);
P1 =0x00;
P0 =0x7f;
P1 =wei[6];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==9)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0x3f;
P0 =duan[month%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[month/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =duan[year1%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[year1/10];
P1 =wei[5];
delay(8);
P1 =0x00;
P0 =duan[year2%10];
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =duan[year2/10];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==8)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xf3;
P0 =duan[day%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[day/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[year1%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[year1/10];
P1 =wei[5];
delay(8);
P1 =0x00;
P0 =duan[year2%10];
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =duan[year2/10];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==7)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xc3;
P0 =duan[day%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[day/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[month%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[month/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =duan[year2%10];
P1 =wei[6];
delay(8);
P1 =0x00;
P0 =duan[year2/10];
P1 =wei[7];
delay(8);
}
scan_key();
}
if(sw5==1&&sw1==6)
{
for(n=0;n<20;n++)
{
P1 =0x00;
P1 =P1&0xc3;
P0 =duan[day%10];
P1 =wei[0];
delay(8);
P1 =0x00;
P0 =duan[day/10];
P1 =wei[1];
delay(8);
P1 =0x00;
P0 =duan[month%10];
P1 =wei[2];
delay(8);
P1 =0x00;
P0 =duan[month/10];
P1 =wei[3];
delay(8);
P1 =0x00;
P0 =duan[year1%10];
P1 =wei[4];
delay(8);
P1 =0x00;
P0 =duan[year1/10];
P1 =wei[5];
delay(8);
}
scan_key();
}
}

}
}

void time1(void) interrupt 3
{
TH1 =(65536-500)/256;
TL1 =(65536-500)%256;
if(++cnt>8) cnt=0;
if(sw5==0) //显示时分秒
{switch(cnt)
{
case 0: P1 =0x00;
P0 =duan[sec%10];
P1 =wei[cnt]; break;
case 1: P1 =0x00;
P0 =duan[sec/10];
P1 =wei[cnt];break;
case 2: P1 =0x00;
P0 =duan[min%10];
P1 =wei[cnt]; break;
case 3: P1 =0x00;
P0 =duan[min/10];
P1 =wei[cnt];
scan_key(); break;
case 4: P1 =0x00;
P0 =duan[hour%10];
P1 =wei[cnt];
scan_key();break;
case 5: P1 =0x00;
P0 =duan[hour/10];
P1 =wei[cnt];
scan_key();break;
case 6: P1 =0x00;
P0 =0x7f;
P1 =wei[cnt];
scan_key(); break;
case 7: P1 =0x00;
P0 =week1[week];
P1 =wei[cnt];
scan_key();break;
default: break;
}
}
if(sw5==1) //显示年月日
{switch(cnt)
{
case 0: P1 =0x00;
P0 =duan[day%10];
P1 =wei[cnt]; break;
case 1: P1 =0x00;
P0 =duan[day/10];
P1 =wei[cnt];break;
case 2: P1 =0x00;
P0 =duan[month%10];
P1 =wei[cnt]; break;
case 3: P1 =0x00;
P0 =duan[month/10];
P1 =wei[cnt];
scan_key(); break;
case 4: P1 =0x00;
P0 =duan[year1%10];
P1 =wei[cnt];
scan_key();break;
case 5: P1 =0x00;
P0 =duan[year1/10];
P1 =wei[cnt];
scan_key();break;
case 6: P1 =0x00;
P0 =duan[year2%10];
P1 =wei[cnt];
scan_key(); break;
case 7: P1 =0x00;
P0 =duan[year2/10];
P1 =wei[cnt];
scan_key();break;
default: break;
}
}
}

void conv(void)
{
if(dataa>=201)
{dataa=0;sec++;}
if(sec>=60)
{sec=0;min++;}
if(sw1==0&&min>=60)
{min=0;hour++;}
if(sw1==0&&hour>=24)
{
if(year%4==0)
{
if(month==2)
{
if(day==29)
{
day =1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day =1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day =1;
month++;
if(month==13)
{
month =1;
year++;
}
}
else day++;
}
}
}[page]
else
{
if(month==2)
{
if(day==28)
{
day =1;
month++;
}
else day++;
}
else
{
if(month==4||month==6||month==9||month==11)
{
if(day==30)
{
day =1;
month++;
}
else day++;
}
else
{
if(day==31)
{
day =1;
month++;
if(month==13)
{
month =1;
year1++;
if(year1==100)
{
year2++;
}
}
}
else day++;

}
}
}
hour=0;
week++;
}
if(sw1==0&&week>=7)
week=0;
}

void delay(ms)
{
uchar i, k;
while(ms--)
for(k=0;k<123;k++);
for(i=0;i<123;i++);
}

void scan_key(void)
{
if(cnt==7&&P3_4==0)
{
delay(3);
if(cnt==7&&P3_4==0)
{
key4 =0;
key1 =1; //检查是第一个键按下
}
}
if(sw5==0&&key1==1&&cnt==7&&P3_4==1) //按键松手时表示真的按下,sw5判断此时是什么显示状态,时间还是年月日
{
sw1 =1; //闪烁分针
}
if(sw5==1&&key1==1&&cnt==7&&P3_4==1) //若为年月日则闪烁第一二位
{
sw1 =9;
}
if(sw1==1&&P3_4==0&&cnt==7) //在时间状态第一个键又一次按下
{
delay(3);
if(sw1==1&&P3_4==0&&cnt==7)
{
key1 =2; //在时间状态第一个键的第二种状态
}
}
if(sw1==9&&P3_4==0&&cnt==7) //在年月日状态第一个键第二次按下
{
delay(3);
if(sw1==9&&P3_4==0&&cnt==7)
{
key1 =9; //在年月日状态第一个键的第二种状态
}
}
if(key1==2&&cnt==7&&P3_4==1) //在时间确认第一个键第二次按下
{
sw1 =2; // 并闪烁时针
}
if(key1==9&&cnt==7&&P3_4==1) //年月日状态确认第一个键第二次按下
{
sw1 =8; // 并闪烁月分
}
if(sw1==8&&P3_4==0&&cnt==7) //在年月日状态第一个键第三次按下
{
delay(3);
if(sw1==8&&P3_4==0&&cnt==7)
{
key1 =8; //在年月日状态第一个键的第三种状态
}
}
if(key1==8&&cnt==7&&P3_4==1) //年月日状态确认第一个键第三次按下
{
sw1 =7; // 并闪烁年的后两位 ///////////////////
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 =3;
}
}
if(sw1==7&&P3_4==0&&cnt==7) //在年月日状态第一个键第四次按下
{
delay(3);
if(sw1==7&&P3_4==0&&cnt==7)
{
key1 =7; //在年月日状态第一个键的第四种状态
}
}
if(key1==7&&cnt==7&&P3_4==1) //年月日状态确认第一个键第四次按下
{
sw1 =6; // 并闪烁年的前两位 ///////////////////
}
if(sw1==2&&P3_4==0&&cnt==7)
{
delay(3);
if(sw1==2&&P3_4==0&&cnt==7)
{
key1 =3;
}
}
if(key1==3&&cnt==7&&P3_4==1)
{
sw1 =3; // 并闪烁星期
}
if(sw5==0&&P3_4==0&&cnt==6) //检查第二个键是否按下
{
delay(3);
if(sw5==0&&P3_4==0&&cnt==6)
{
key2 =1;
}
}
if(key2==1&&cnt==6&&P3_4==1)
{
key2 =0;
sw2 =1; //在时间状态确认第二个键按下
if(sw2==1&&sw1==1) //和sw1的值对比,加分
{
min++;
if(min>=60)
min =0;
}
if(sw2==1&&sw1==2) //和sw1的值对比,加时
{
hour++;
if(hour>=24)
hour =0;
}
if(sw2==1&&sw1==3)
{
week++;
if(week>6)
week =0;
}
}
if(sw5==1&&P3_4==0&&cnt==6) //在年月日检查第二个键是否按下
{
delay(3);
if(sw5==1&&P3_4==0&&cnt==6)
{
key2 =7;
}
}
if(key2==7&&cnt==6&&P3_4==1)
{
key2 =0;
sw2 =1; //确认第二个键按下
if(sw2==1&&sw1==9) //和sw1的值对比,加day
{
day++;
if(day>31)
day =0;
}
if(sw2==1&&sw1==8) //和sw1的值对比,加month
{
month++;
if(month>12)
month =0;
}
if(sw2==1&&sw1==7)
{
year1++;
if(year1>100)
year1 =0;
}
if(sw2==1&&sw1==6)
{
year2++;
if(year2>100)
year2 =20;
}
} //检查时间状态第三个键是否按下
if(sw5==0&&P3_4==0&&cnt==5) //检查第三个键是否按下
{
delay(3);
if(sw5==0&&P3_4==0&&cnt==5)
{
key3 =1;
}
}
if(key3==1&&cnt==5&&P3_4==1)
{
key3 =0;
sw3 =1;
if(sw3==1&&sw1==1)
{
if(min<=0)
min =60;
min--; //分针减
}
if(sw3==1&&sw1==2)
{
if(hour<=0)
hour =24;
hour--; //时针减
}
if(sw3==1&&sw1==3)
{
if(week<=0)
week =7;
week--;
}
}
if(sw5==1&&P3_4==0&&cnt==5) //在年月日检查第三个键是否按下
{
delay(3);
if(sw5==1&&P3_4==0&&cnt==5)
{
key3 =7;
}
}
if(key3==7&&cnt==5&&P3_4==1)
{
key3 =0;
sw3 =7;
if(sw3==7&&sw1==9)
{
if(day<=0)
day =32;
day--; //day减
}
if(sw3==7&&sw1==8)
{
if(month<=0)
month =13;
month--; //month减
}
if(sw3==7&&sw1==7)
{
if(year1<=0)
year1 =100; //year减
year1--;
}
if(sw3==7&&sw1==6)
{
if(year2<=20)
year2 =100; //year减
year2--;
}
}
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0)
{
delay(3);
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0)
{
sw1=0;sec=0;key4=1;key1=0;
}
}
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1)
{
delay(3);
if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1)
{
sw1=0;key4=1;key1=0;
}
}
if(P3_4==0&&cnt==3)
{
delay(3);
if(P3_4==0&&cnt==3)
{
key5 =1;
}
}
if(key5==1&&P3_4==1&&cnt==3)
{
sw5 =1;
}
if(P3_4==0&&sw5==1&&cnt==3)
{
delay(3);
if(P3_4==0&&sw5==1&&cnt==3)
{
key5 =0;
}
}
if(P3_4==1&&key5==0&&cnt==3)
{
sw5 =0;
}
}

void main(void)
{
PCA0MD =0 ;
XBR1 =0x40 ;
P0MDOUT =0xFF ;
P1MDOUT =0xFF ;
init();
while(1)
{
conv();
year=year1+year2*100;
}
}

五、调试及性能分析
5.1 硬件调试:主要检查电路的焊接,有无虚焊,漏焊,然后检查电路与单片机的联线,为了方便自己做了一根数据线,然后用万用表测试,全部导通后进行通电检测,上电后排查电路板的各点电平是否正常,测试完毕后进行软件调试。
5.2 软件调试:主要以以编程序为主,并进行单片机输出口线高低电平的检验。本程序采用C语言编写,用Keil C51编译器编程调试,本程序的难点之一在于让它闪烁,也就是再其它灯不变的情况下闪烁需要调整的部分。
经过测试,任务以及要求全部达到,初始化时,时间是1-00:00:00,切换后是20096.08.15,由于时间关系没能经过长时间的验证性测试,短期测试发现每一个小时快一秒钟,只进行了粗调。

关键字:单片机  C语言  电子时钟  日历显示 引用地址:单片机C语言电子时钟加日历显示编程

上一篇:单片机与PLC的关系
下一篇:单片机PID调节的通俗讲解

推荐阅读最新更新时间:2024-03-16 14:34

下一代MachXO3D FPGA 让汽车更安全
我们生活在一个高度互连的世界,很容易受到各种来源的网络攻击。仅 2018 年,硬件攻击让超过 30 亿系统暴露在数据盗窃、非法操作和其它安全隐患中 1。 在汽车领域,如今的智能联网汽车则加剧了这类安全问题。若网络攻击造成汽车失控不仅会对目标车辆中的人员造成伤害,更有可能危及附近的车辆、行人和财产。 因此,汽车的设计人员和厂商正极力寻找保障系统安全之道。正如本文所述,解决方法之一是采用莱迪思半导体的 MachXO3D™ FPGA。 老式汽车时代已经过去 汽车市场在不断演变,近些年来的变化尤其剧烈,变化速度极快。 以微处理器单元( MPU )和微控制器单元( MCU )为主的计算器件在 20 世纪七八十年代晚期开始
[汽车电子]
下一代MachXO3D FPGA 让汽车更安全
基于51单片机的微波脉冲功率测试系统
1工作原理   本系统充分利用89C51单片机的控制和计算能力,采用MCS-51汇编语言,设计了一种基于平均功率法的微波脉冲测试系统。   平均功率法测量的是射频脉冲复重周期的平均功率,并采用辅助方法测出脉冲的占空系数。设脉冲为矩形,宽度为τ,重复周期为T。则脉冲峰值功率为: 上式中,Q=τ/T是射频脉冲的占空系数。   测量时,用示波器显示其脉冲波形,并测量脉冲重复周期T和宽度τ。用测量连续波功率的方法测出脉冲的平均功率Pav。   当使用衰减器和定向耦合器时,若衰减器两端匹配时的衰减量为A(dB),定向耦合器的过渡衰减量为C(dB),方向性为无穷大,则脉冲峰值功率为     当脉冲为非理想矩形时,须乘以修正系数K进行修
[单片机]
基于51<font color='red'>单片机</font>的微波脉冲功率测试系统
单片机是怎么工作的
我们大概的了解了单片机的结构、特点,下面我们主要讲解单片机如何工作,有那些工作方式。 单片机共有复位、程序执行、低功耗和编程与加密四种工作方式,下面分别加以介绍。 1.复位方式 (1)为什么要复位 大家知道,单片机执行程序时总是从地址0000H 开始的,所以在进入系统时必须对CPU 进行复位,也叫初始化;另外由于程序运行中的错误或操作失误使系统处于死锁状态时,为了摆脱这种状态,也需要进行复位,就象电脑死机了要重新启动一样。 (2)复位的原理 单片机复位的方法其实很简单,只要在RST 引脚(9 脚)上加一个持续时间为24 个振荡周期(即两个机器周期)的高电平就可以了。如果晶振为12M,计算一下这个持续脉冲需要多长时间?
[单片机]
<font color='red'>单片机</font>是怎么工作的
STC8951单片机的外部中断资源
以程序为例: #include reg52.h sbit led=P3^0; void main() { IT0=1; //设置外部中断0的触发方式为下降沿 EX0=1; //开启外部中断0 //中断的设置,首先设置中断的触发方式,再设置开启终端,最后开启总中断。 IT1=1; //设置外部中断1的触发方式为下降沿 //顺序保证:最后开启总中断 EX1=1; //开启外部中断1 EA =1; //总中断开关 wh
[单片机]
STC8951<font color='red'>单片机</font>的外部中断资源
STM32F1系列单片机USB外设相关寄存器的定义
Keil MDK网站上下载的Keil.STM32F1xx_DFP.2.2.0.pack包中的stm32f10x.h头文件里面没有USB_TypeDef的定义,只有寄存器位的定义,是不完整的头文件。没有USB的数据结构就会给访问USB寄存器带来一定的困难。虽然可以参照STM32参考手册中的USB register map自己编写出USB_TypeDef结构体,但是这样比较麻烦。 不过,STM32CubeMX工具生成的STM32F103工程中的头文件stm32f103xe.h中就有完整的USB数据结构,该头文件的版本是V4.2.0,日期为31-March-2017,作者仍然是Keil里面的MCD Application Team,
[单片机]
51单片机制作简易电风扇定时控制器
自己的床头风扇的机械定时器坏掉了,准备51单片机给设计了一个.程序在实验板初步调试通过,等待元件寄到就可以做板子了,只是有点浪费单片机的资源。 一,设计思路: 开始通过手动键给单片机供电。直到电源指示灯LED4亮.单片机运行,继电器2工作给单片机供电。通过按键设置继电器2的工作时间,实现系统的自动断电,通过设置继电器1的工作时间,实现风扇的间歇转动,实现节能。 1. 显示部分:通过按键,在风扇转动时间,暂停时间,和系统关闭剩余时间切换显示。数码显示两位,为“分”走时,其中系统关闭剩余时间为“小时”走时,LED为红,黄,蓝,分别点亮对应的风扇转动,暂停,和系统关闭剩余时间的状态。 2. 按键部分: lK1为时间调整移位键,按
[单片机]
51<font color='red'>单片机</font>制作简易电风扇定时控制器
基于51单片机的八路抢答器设计
一.硬件方案 本设计 利用STC89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。 主要由51单片机+最小系统+数码管+蜂鸣器+按键模块;如图: 二.设计功能 (1)采用4位数码管设计;下排按键一一对应八位选手。 (2)竖排三个按键,从上到下依次为:开始、暂停、复位。 (3)操作流程:上电后数码管显示“--
[单片机]
基于51<font color='red'>单片机</font>的八路抢答器设计
自动图像报警系统研究及单片机实现
    摘要:全面介绍了基于图像的自动报警系统的实现方法,克服了传统单点信号报警的缺陷,并采用先进的RISC结构单片机和高密度FLASH、CPLD技术,使系统具有实时响应和自适应能力。     关键词:图像报警 RISC FLASH CPLD 自适应     报警系统广泛应用于银行、饭店、交通管理以及智能大厦等场所和领域。传统的自动报警装置,大多采用单点信号报警,即在某一特定位置安放传感器,当该采集点处的物理量达到报警门限时,就向中心控制计算机发出报警请求信号。这种报警装置的优点是安装便利,反应迅速,但其适用范围较小,对单点噪声过分敏感而导致误报,在防止误报和漏报两方面不可兼得等先天缺陷,限制了它不能被应用于情
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved