4位数码管时钟笔记

合集下载

单片机课程设计-4位LED数字时钟的设计

单片机课程设计-4位LED数字时钟的设计

目录一、摘要 (1)二、设计任务 (1)1、题目:4位LED数字时钟的设计 (1)2、技术指标及设计要求 (1)3、给定条件及器件 (1)三、设计方案与实现……………………………………………………2-61、硬件设计 (2)(1)相关器件介绍 (2)(2)数码管介绍 (2)(3)数码管的驱动方式 (3)(4)单片机(AT89S52)介绍.............................................4-5(5)电路设计 (6)2、软件设计………………………………………………………6-7(1)软件设计基本思想 (6)(2)程序流程图 (7)四、调试 (7)五、总结………………………………………………………………7-8六、附录………………………………………………………………8-131、元件清单 (8)2、程序清单………………………………………………………9-13七、参考文献 (13)一、摘要电子钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所。

本系统采用本系统以AT89S52为主控芯片,实现电子时钟的设计,并考虑节约系统的硬件,能用软件实现的功能尽量都用软件实现。

而且达到时钟功能为24小时的计时方式,显示时、分;具有快速校准时、分的功能;根据键盘输入调用相应键处理子程序,实现时间的调整;然后输出到4位的LED显示器显示出来。

二、设计任务1、题目: 4位LED数字时钟的设计2、技术指标及设计要求(1)显示小时、分钟时间(2)实现秒的量化显示(3)具有调整时间功能(4)开机复位显示及手动复位显示功能3、给定条件及器件(1)单片机及相关外围器件(2)直流稳压电源5V(3)万用电路板(4)4联共阳数码管三、设计方案及实现 1、 硬件设计 (1)相关器件介绍(2)数码管介绍数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

数字钟程序、

数字钟程序、

数字钟(四位,三按键)2009-12-24 14:00:55| 分类:单片机| 标签:数字钟四位显示三个按键两个定时器c语言|字号大中小订阅.//****************数字钟(四位显示)**********************//因为实验板中只提供四个数码管,三个按键,即一次只能显示四位数,解决的方案是//1、分配按键:key1为模式mode的选择,每按一下后way的值就加1;//2、选择模式:mode=0:显示小时兼设小时;mode=1:显示小时兼设分;mode=2:显示秒兼设秒;//3、显示时间:如要显示时间12:34:56 ,显示的情况为"1234"和"-56-",横杠是为了美观^_^。

#include<reg51.h>#define uchar unsigned char //定义常用数据类型uchar key,n,hou,min,sec,count,mode,led_data0,led_data1,led_data2,led_data3;voidinit(void);voidscan_key(void);voidtreat_with_key(void);void fun0(void);void fun1(void);void fun2(void);voidgive_led_data(void);void delay(intxms);char data seg[4]={0xEF,0xDF,0xBF,0x7F};char data dis[10]={0x05,0xf5,0x13,0x51,0xe1,0x49,0x09,0xd5,0x01,0x41};//共阳极0 1 2 3 4 5 6 7 8 9main(){init();give_led_data();while(1){scan_key();if(key!=0){treat_with_key();}}}/**********************************************/ voidinit(void){ hou=12;min=34;sec=56;IP=0xc2;ET0=0;TR0=0;ET1=0;TR1=0;TH0=0x3c; //TH0=(65536-50000)/256; //50ms定时TL0=0xb0;//TL0=(65536-50000)%256;TH1=0x38; //TH1=(256-200)/256; //200us×40=8ms定时TL1=0x38;TMOD=0x21; //T0工作在16位模式1 ,T1工作在8位自动重装的模式2TR0=1;ET0=1;TR1=1;ET1=1;EA=1;}voidgive_led_data(void){if(mode==0){led_data0=dis[hou/10];led_data1=dis[hou% 10];led_data2=dis[min/10];led_data3=dis[min%10];}if(mode==1){led_data0=dis[hou/10];led_data1=dis[hou% 10];led_data2=dis[min/10];led_data3=dis[min%10];}if(mode==2){led_data0=0xFB; //显示横杠“-”led_data1=dis[sec/10];led_data2=dis[sec%10];led_data3=0xFB;}}void scan_key(void) //按键扫描{key=(~P1)&0x07;if(key!=0){delay(10);key=0;while(((~P1)&0x07)!=0) //等待释放按键key=(~P1)&0x07;}}/**********************************************/voidtreat_with_key(void){switch(key){case 1:{fun0();give_led_data();break;} //选择模式case 2:{fun1();give_led_data();break;} //增时间case 4:{fun2();give_led_data();break;} //减时间default:{break;}}}void fun0(void) //0:显示小时兼设小时,1:显示小时兼设分,2:显示秒兼设秒{mode++;if(mode==3){mode=0;}}/**********************************************/ void fun1(void){switch (mode){case 0:{min++;if(min==60) min=0;break;}case 1:{hou++;if(hou==24) hou=0;break;}case 2:{sec++;if(sec==60) sec=0;break;}default:{break;}}}/**********************************************/ void fun2(void){switch (mode){case 0:{min--;if(sec==0) sec=60;break;}case 1:{hou--;if(hou==0) hou=60;break;}case 2:{sec--;if(sec==0) sec=24;break;}default:{break;}}}void timer0() interrupt 1{TH0=0x3c;TL0=0xb0;count++;if(count==20){ count=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hou++;if(hou==24){ hou=0;}} give_led_data();} give_led_data();give_led_data();}}void timer3(void) interrupt 3 //数码管逐位扫描{ET1=0;TR1=0;//TH1=0x38; //自动重装,不用此指令//TL1=0x38;TMOD=0x21;TR1=1;n++;switch(n){case 1:{P3=seg[0];P2=led_data0;break;}case 2:{P3=seg[1];P2=led_data1; break;}case 3:{P3=seg[2];P2=led_data2; break;}case 4:{P3=seg[3];P2=led_data3;n=0; break;}default:{break;}}ET1=1;EA=1;}/***************x ms延时函数**********************/ void delay(ucharxms) //延时x ms{uchari;while(xms--)for(i=0;i<123;i++);}**************************************仿真图。

DS1302三键4位1.5寸数码管时钟

DS1302三键4位1.5寸数码管时钟

说明:最初跑得不太准,把1302的电容换成7p以后,精度非常好,具体没有查误差,反正好几个月与家里的石英钟很对时。

5v供电,亮度不高,室内用正好。

本人程序基本抄袭的,其中秒是用定时器模拟闪动,各位老师多多指教,原来是显示带拐角的7,让我改了,第一位为零时也改作不显示了,请各位大大批评指正!随便挣俩钱儿(感谢江顺万老师的细心批评指正,由于自己不够严谨导致一点错误,已经在原文改过,深表歉意!)先上电路图:再上个实物图:分解图:最后上c程序,不用下载,照顾没米的大大,欢迎批评,砸点儿币过来。

三鞠躬!/**********************************DS1302 四位数码管***********************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define D P2 //段选#define D P0 //位选sbit IO=P1^1; //数据口sbit SCLK=P1^2; //控制数据时钟sbit RST=P1^0; //使能端、复位端/************按键引脚定义***********/sbit s1=P1^5; //按键加sbit s2=P1^3; //按键减sbit s3=P1^4; //按键选择sbit led=P1^7; //闪烁的小数点uchar s, knum=0,snum,fnum;标志。

/***********写时分秒地址************/#define write_shi 0x84#define write_fen 0x82#define write_miao 0x80/***********读时分秒地址************/#define read_shi 0x85#define read_fen 0x83#define read_miao 0x81bit miao_flag;char miao_num;char Dmiao;char shi,fen,miao; //读出数据存储变量uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点,共阳uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点,共阳void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如 delay(200);大约延时200ms.{ //delay(500);大约延时500ms.uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void t0_init() //定时50ms一个中断{TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}uchar read_1302(uchar add) //读函数{uchar i,date;RST=0; //禁止读写数据for(i=0;i<8;i++){RST=1;SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++){if(IO)date=date|0x80;elsedate=date|0x00;SCLK=1;date>>=1;SCLK=0;}RST=0;date=date/16*10+date%16;//进制转换16转10进制IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;}void write_1302(uchar add,uchar dat) //写函数{uchar i;RST=0; //禁止读写数据SCLK=0;for(i=0;i<8;i++) //写地址{RST=1; //允许读写数据SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++) //写数据{RST=1; //允许读写数据SCLK=0;IO=dat&0x01;dat>>=1;SCLK=1;}RST=0;}void init_1302() //初始化函数设置时间{flag=read_1302(0x81);if(flag&0x80)write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);write_1302(write_fen,0x49);write_1302(write_shi,0x14);write_1302(0x90,0xa5);write_1302(0x8e,0x80); //保护启动,不能进行读写操作}void display(uchar shi,uchar fen) //显示函数{if(knum==0){snum=30;fnum=30;}if(knum==1){fnum++;snum=30;}if(knum==2){snum++;fnum=30;}if(snum>=30){W=0xF7; //位选s=d[shi/10];//段码先给s,判断其值是否为0,if(s==0xc0){W=0xff;D=0xff;}D=s;//s不为零则给D,让其显示delay(5);D=0Xff; //消隐if(miao_flag) //小数点闪烁 {miao_flag=0;W=0xFb;D=dd[shi%10];delay(5);D=0Xff; //消隐}else{W=0xFb;D=d[shi%10];delay(5);D=0Xff;}if(snum==60)snum=0;}if(fnum>=30){W=0xFd;D=d[fen/10];delay(5);D=0Xff; //消隐W=0xFe;D=d[fen%10];delay(5);D=0Xff; //消隐if(fnum==60)fnum=0;}}void read_sf(){miao=read_1302(read_miao); /*if(miao!=Dmiao){Dmiao=miao;TR0=1;miao_flag=1;} */fen=read_1302(read_fen);shi=read_1302(read_shi);display(shi,fen);}void keyscan() //按键扫描函数{if(s3==0) //选择按键按下{delay(10);if(s3==0){while(!s3)display(shi,fen); //加上这句,按键按下就不会闪knum++;if(knum==1) //分闪烁{write_1302(0x8e,0x00); //保护取消write_1302(write_miao,0x80);}if(knum==3) //时钟启动{knum=0;write_1302(write_miao,0x00);write_1302(0x8e,0x80); //保护启动}}}if(knum==1) //分钟调节{if(s1==0) //加{delay(10);if(s1==0){while(!s1)display(shi,fen); //加上这句,按键按下就不会闪fen++;if(fen==60)fen=0;write_1302(write_fen,fen/10*16+fen%10); //写入1302 // read_sf(); //读出时间,然后显示}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen); //加上这句,按键按下就不会闪 fen--;if(fen==-1)fen=59;write_1302(write_fen,fen/10*16+fen%10);read_sf();}}}if(knum==2){if(s1==0){delay(10);if(s1==0){while(!s1)display(shi,fen); //加上这句,按键按下就不会闪 shi++;if(shi==24)shi=0;write_1302(write_shi,shi/10*16+shi%10);read_sf();}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen); //加上这句,按键按下就不会闪 shi--;if(shi==-1)shi=23;write_1302(write_shi,shi/10*16+shi%10);read_sf();}}}}void main(){init_1302();t0_init();while(1){ if(miao_num<10)led=0;if(miao_num>=10)led=1;read_sf();keyscan();}}void t0_timer() interrupt 1 {TMOD=0X01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; miao_num++;if(miao_num>=20){miao_num=0;miao_flag=1;}}。

51单片机 数码管 定时器 准确时间

51单片机 数码管 定时器 准确时间
ly_shi=0;
}
}
}
display(ly_shi,ly_fen);//显示变量内容
delay(100);
}
}
void init()//初始化定时器0函数(定时50ms)
{
ly_tt=0;
TMOD=0X01;//设置定时器0为模式一,即16位计算模式
TH0=(65536-50000)/256;//给计数寄存器赋值,50毫秒时间
TL0=(65536-50000)%256;
EA=1;//开启总中断
ET0=1;//开启定时器0中断
TR0=1;//启动定时器
}
//中断函数,关键字"interrupt",这是C语言的中断函数表示法,1表时定地器0
void timer() interrupt 1
{
TH0=(65536-50000)/256;//重新赋值
#include "reg51.h"
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管0-9
unsigned charl_posit=0;//显示位置
unsigned charly_tt=0;//作为计数时间量
}
{
init();//初始化定时器0
while(1)
{
if(ly_tt==20)//20*50ms为1秒
{
ly_tt=0;
ly_miao++;
if(ly_miao==60)
{
ly_miao=0;
ly_fen++;

4位数码管计时器程序

4位数码管计时器程序

/******************************************************************************************* **/#include<STC12C2052AD.H>//STC头文件/******************************************************************************************* ***///“程序开发调试设置项”#define DY_LI 9 //设置LED显示的亮度(值域:~9)#define DY_DELAY 12 //设置每一个点显示的时间长度(~20)/******************************************************************************************* ***/sbit DY_LED1_H1 =P3 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_H2 =P3 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_H3 =P3 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_H4 =P3 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L1 =P1 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_L2 =P1 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_L3 =P1 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_L4 =P1 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L5 =P1 ^ 4; //设置LED点阵屏连接的I/O口sbit DY_LED1_L6 =P1 ^ 5; //设置LED点阵屏连接的I/O口sbit DY_LED1_L7 =P1 ^ 6; //设置LED点阵屏连接的I/O口sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口//sbit DY_BEEP =P2 ^ 2; //扬声器//sbit DY_KEY1 =P0 ^ 2; //按键(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)//sbit DY_KEY2 =P3 ^ 0; //按键(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)//sbit DY_KEY3 =P3 ^ 6; //按键(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)#define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)#define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000#define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000#define DY_P3M1SET 0xff //设置I/O口工作方式//10010100data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区data unsigned char cou = 0; // 软计数器,对ms时基信号累加到sdata unsigned char bn;//扫描映射全局变量data unsigned char KEY_BIT = 0;//按键值data unsigned char DY_PWM;//显示亮度data unsigned char DY_PWM2;//显示暂存unsigned char code disdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)};/******************************************************************************************* **/void delay (unsigned int a){ // 用于点扫描的延时unsigned int i;while( --a != 0){for(i = 0; i < DY_DELAY; i++);}}/******************************************************************************************* **/void delay1ms (unsigned int a){ // 1ms延时程序(MHz 10倍于单片机速度时)unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}}/******************************************************************************************* **/void dis_off (void){P1 = ~DY_P1M1SET; //关所有显示P3 = ~DY_P3M1SET;delay(10-DY_PWM);}/******************************************************************************************* **/void displayHH1 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH2 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH3 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH4 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();if(i == 0x10){DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void diplay_data (unsigned char l,unsigned char d){switch (l){//显示的列位置case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//}}/******************************************************************************************* **/void init (void){ //上电初始化P1M0 = DY_P1M0SET;P1M1 = DY_P1M1SET;P3M0 = DY_P3M0SET;P3M1 = DY_P3M1SET;////dis_off();DY_PWM = DY_LI;////TMOD = 0x11; // 定时/计数器,1工作于方式TH0 = 0x3c; // 预置产生ms时基信号EA = 1; // 开总中断ET0 = 1; // 定时/计数器允许中断TR0 = 1; // 开闭定时/计数器//////TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值//TIME_MO = 5; //初始时间:年月日周一,时分秒//TIME_YY = 9;//TIME_WW = 1;//TIME_HH = 22;//TIME_MM = 13;//TIME_SS = 40;}/******************************************************************************************* **/void main (void){ //主程序init();while (1){diplay_data (1,disdata[TIME_MM/10]);diplay_data (2,disdata[TIME_MM%10]);diplay_data (3,disdata[TIME_SS/10]+0x80);diplay_data (4,disdata[TIME_SS%10]+0x80);}}/******************************************************************************************* ***/void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生ms时基信号)cou++; // 软计数器加if(cou > 19){ // 计数值到(1s)cou = 0; // 软计数器清零TIME_SS++; // 秒计数器加(进位ms*100=1s)if(TIME_SS > 59){ // 秒计数值到TIME_SS = 0; // 秒计数器清零TIME_MM++; // 分计数器加(进位s=1m)if(TIME_MM > 59){ // 分计数到TIME_MM = 0; // 分计数器清零TIME_HH++; // 时计数器加(进位m=1h)if(TIME_HH > 23){ // 时计数到TIME_HH = 0; // 时计数器清零}}}}TH0 = 0x3c; // 重置定时常数TL0 = 0xb0;}/******************************************************************************************* ***//*************************************************************/*************************************************************/。

c语言四位数码管万年历程序

c语言四位数码管万年历程序

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 万年历&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code taba[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code tabb[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uint a,b,c,i,j,n=0,nian=2010,yue=1,ri=1,shi=0,fen=0,miao=0;sbit K1=P3^2;sbit K2=P3^3;sbit K3=P3^4;sbit K4=P3^5;sbit F=P3^0;sbit D=P0^7;void int0()interrupt 1 //T0定时器中断{TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==20) i=0,miao++,P1=~P1; //定时满1秒,秒进1,流水灯明灭if(miao==60) miao=0,fen++; //秒钟数满59,秒归0,分进1if(fen==60) fen=0,shi++; //分钟数满59,分归0}void delay(uint j) //延时函数j*1ms{for(a=1;a<=j;a++) //延时j*1msfor(b=1;b<=121;b++);}void del_nian() //实现数码管动态显示年{while(miao<=5&&K1) //显示5秒,--年{P0=taba[nian/1000],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=taba[nian/100%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[nian%100/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[nian%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_yue_ri() //实现数码管动态显示月,日{while(miao<=10&&K1) //显示5秒,--月--日{P0=taba[yue/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=tabb[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[ri/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_shi_fen() //实现数码管动态显示时,分{while(miao>10&&miao<=60&&K1) //显示50秒,--分--钟{P0=taba[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=tabb[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[fen/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_tiao_nian(){while(K1) //按下K1返回{switch(n){case 2:{if(K3==0) delay(200),K3=1,nian++; //第2次按K1,按K3加,来调W2 if(K4==0) delay(200),K4=1,nian--;};break;}P0=taba[nian/1000],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[nian/100%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[nian%100/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=tabb[nian%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //用带点数组,表示调整的是哪个值---第四个点---调-年}void del_tiao_yue_ri(){ while(K1) //按下K1返回{switch(n){case 3:{if(K3==0) delay(200),K3=1,yue++; //第3次按K1,按K3加,来调W4 if(K4==0) delay(200),K4=1,yue--;P0=tabb[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;};break; //用带点数组,表示调整的是哪个值---第二个点---调-月case 4:{if(K3==0) delay(200),K3=1,ri++; //第4次按K1,按K3加,来调W4 if(K4==0) delay(200),K4=1,ri--;P0=tabb[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;};break;} //用带点数组,表示调整的是哪个值---第四个点---调-日P0=taba[yue/10],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[ri/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=taba[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;}}void del_tiao_shi_fen(){while(K1) //按下K1返回{switch(n){case 5:{if(K3==0) delay(200),K3=1,shi++; //第5次按K1,按K3加,来调W4if(K4==0) delay(200),K4=1,shi--;P0=tabb[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //P0=tabb[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;};break; //用带点数组,表示调整的是哪个值---前两个点---调-年case 6:{if(K3==0) delay(200),K3=1,fen++; //第6次按K1,按K3加,来调W4if(K4==0) delay(200),K4=1,fen--;P0=tabb[fen/10],P2=0Xfd,delay(3),P0=0xff,P2=0xff; //P0=tabb[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;};break;} //用带点数组,表示调整的是哪个值---后两个点---调-年P0=taba[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[fen/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=taba[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;}}void del_tiao() //暂停调整程序{while(n!=8) //第8次按下,调整循环了一圈,跳回主程序{if(K1==0)delay(300),K1=1,n++; //通过K1改变n值while(K1&&n!=8) //按下K2返回主程序{switch(n){case 1:P0=0x00,P1=0xff,P2=0x00;break; //第1次按下,显示管全亮case 2:del_tiao_nian();break; //第2次按下,进到调--年--状态case 3:del_tiao_yue_ri();break; //第3次按下,进到调--月--状态case 4:del_tiao_yue_ri();break; //第4次按下,进到调--日--状态case 5:del_tiao_shi_fen();break; //第5次按下,进到调--时--状态case 6:del_tiao_shi_fen();break; //第6次按下,进到调--分--状态case 7:P0=0x00,P1=0xff,P2=0x00;break;} //第7次按下,显示管全亮}}}void main() //主函数{TMOD=0X01; //TH0=(65536-50000)/256; //TL0=(65536-50000)%256; ////////定时初始化EA=1; //ET0=1; //while(1){TR0=1; //开启定时器n=0;if(yue==1^yue==3^yue==5^yue==7^yue==8^yue==10) ////实现1,3,5,7,8,10月,有31天{if(ri==32) ri=0,yue++;};if(yue==4^yue==6^yue==9^yue==11) //实现4,6,9,11月,有30天{if(ri==31) ri=0,yue++;};if(!nian%4) //实现闰年有28天{if(yue==2){if(ri==29) ri=0,yue++;}};if(nian%4) //实现平年有29天{if(yue==2){if(ri==30) ri=0,yue++;}};if(yue==12) //在12月份,满31天,年加1,月-日归0 {if(ri==32) ri=0,nian++;};if(shi==24) shi=0,ri++; //实现满24小时,时归0,日加1del_nian(); //调用-年----显示if(!K1) del_tiao(); //有按键按下,进入调整程序del_yue_ri(); //调用-月-日-显示if(!K1) del_tiao(); //有按键按下,进入调整程序del_shi_fen(); //调用-时-分-显示if(!K1) del_tiao(); //有按键按下,进入调整程序}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 抢答器&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #include<reg52.h> //头文件#define uchar unsigned char //宏定义#define uint unsigned int //宏定义uchar code table[5]={0xC0,0xF9,0xA4,0xB0,0x99};// 0 , 1 , 2 , 3 , 4 ;uchar code tab[5]={0xF7, 0xFB, 0xFD, 0xFE, 0xFF};//数码管:一亮,二亮,三亮,四亮,全灭uint i,j=0,z=5,x=5,c=5,v=5,a,b;sbit K4=P3^5;sbit L4=P1^0;sbit K3=P3^4;sbit L3=P1^1;sbit K2=P3^3;sbit L2=P1^2;sbit K1=P3^2;sbit L1=P1^3;sbit M=P3^0;void delay(uint i) //延时子函数---延时:i*1ms{for(a=0;a<+i;a++)for(b=0;b<=121;b++);}void del(void) //子函数----倒计时{ for(i=3;i>0;i--) //倒计时3,2,1{P3=0xFF,P2=0xF0;for(j=0;j<=30000;j++) //循环扫描按键{P0=table[i];if(K1==0) { while(1) //数码管二,三闪烁锁定提前抢答者1,蜂鸣器报警{P2=0xF9,P0=table[1],M=0,delay(100),P2=0xFF,M=1,delay(100);}}if(K2==0) { while(1) //数码管二,三闪烁锁定提前抢答者2,蜂鸣器报警{P2=0xF9,P0=table[2],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}if(K3==0) { while(1) //数码管二,三闪烁锁定提前抢答者3,蜂鸣器报警{P2=0xF9,P0=table[3],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}if(K4==0) { while(1) //数码管二,三闪烁锁定提前抢答者4,蜂鸣器报警{P2=0xF9,P0=table[4],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}}};}void main(){ del();if(i==0) M=0,delay(50),M=1; //蜂鸣器响后开始抢答P3=0xFF,j=0;while(1) //实现四人强答,动态显示{ if(K1==0){M=0,L1=0; //蜂鸣器响对应第一流水灯亮if(z==5) z=j++;}P2=tab[z],P0=table[1],delay(4),M=1,P0=0xFF,P2=0xFF;if(K2==0){M=0,L2=0; //蜂鸣器响对应第二流水灯亮if(x==5) x=j++;}P2=tab[x],P0=table[2],delay(4),M=1,P0=0xFF,P2=0xFF;if(K3==0){M=0,L3=0; //蜂鸣器响对应第三流水灯亮if(c==5) c=j++;}P2=tab[c],P0=table[3],delay(4),M=1,P0=0xFF,P2=0xFF;if(K4==0){M=0,L4=0; //蜂鸣器响对应第四流水灯亮if(v==5) v=j++;}P2=tab[v],P0=table[4],delay(4),M=1,P0=0xFF,P2=0xFF;}}。

设计一个4位数码管时钟电路

设计一个4位数码管时钟电路

设计一个4位数码管时钟电路了解什么是4位数码管;四位数码管是一种半导体发光器件,其基本单元是发光二极管。

能显示4个数码管叫四位数码管。

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,相应字段就不亮。

什么是时钟电路;1.就是产生像时钟一样准确的振荡电路;2.任何工作都按时间顺序。

(时钟电路一般由晶体震荡器,晶震控制芯片和电容组成)四位数码管怎么显示;利用单片机调节开关的高低电平的变化,然后显示在数码管上;四位数码管怎样驱动;1、静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O 端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O 端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

FPGA入门(一)---四位共阴数码管显示

FPGA入门(一)---四位共阴数码管显示

FPGA入门(一)---四位共阴数码管显示--2007。

4。

412--采用4X4键盘进行控制,并显示相应的数字。

3--选自AVR和CPLD的书4--串行联接的七段数码管驱动程序,用了4个数码管5--四位数码管动态显示。

6--高电平选通位选端。

共阴数码管78library i eee;9use i eee.std_logic_1164.all;10use i eee.std_logic_unsigned.all;11entity l ed_7com is12port(clock:in s td_logic;13key_num:IN integer range 0 to 9;14en:out s td_logic_vector(0 to 3);--分别接4个数码管的公共端15display:out s td_logic_vector(0 to 7 ));--接数码管的7 隹刂贫? abcdefgend;1617architecture light of l ed_7com issignal c ounter:integer range 0 to 3;1819begin20process(clock)21variable n um:integer range 0 to 9;22begin23--if rising_edge(clock) thenif c lock'event and c lock='1' then2425if c ounter =3 then26counter<=0;27else28counter<=counter+1;29end if;case counter is3031when 0 =>32en<="1000"; --点亮第一个数码管,屏蔽其它5个数码管33num:=key_num; --显示第一个数34when 1=>en<="0100";3536num:=key_num;37when 2=>38en<="0010";39num:=key_num;40when 3=>en<="0001";4142num:=key_num;43when others=>null;end case;44Page 1 of 2Revision: led_7comcase num is4546when 0=> display <="11111101";--0abcdefg段47when 1=> display <="01100000";--148when 2=> display <="11011011";49when 3=> display <="11110010";50when 4=> display <="01100111";51when 5=> display <="10110110";52when 6=> display <="00111111";53when 7=> display <="11100000";54when 8=> display <="11111111";55when 9=> display <="11100110";56when others => display <="00000000";57end case ;58end if ;59end process;60end ;6162Page 2 of 2Revision: led_7com。

四位LED数码管编程

四位LED数码管编程

设计要求:一个基于单片机89S51的可编程定时器的程序,定时器由4个8段数码管显示,可以设置分和秒定时。

可以同时对四路控制对象进行定时控制,外部控件可以用于选择控制对象,设置定时,对定时进行暂停,重置等控制。

#include <AT89X52.H>//宏定义#define uchar unsigned char#define uint unsigned int#define ulong unsigned long int/****************************************************************************** TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; ** TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器** 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时** 间为1ms*65536=65.536ms*******************************************************************************/#define V_TMOD 0x01 //工作方式1#define V_TH0 0x3C //50ms延时常数C=50000//0XDC#define V_TL0 0xB0 //50ms延时常数C=50000 /0X58 //#define V_TH1 0xFF //5ms延时常数C=5000 //0XDC//#define V_TL1 0xFB //5ms延时常数C=5000 /0X58#define V_TH1 0xDC //1ms延时常数C=1000 //0XDC#define V_TL1 0x58 //1ms延时常数C=1000 /0X58#define MAXFUN 6 //功能切换,表示最多的功能状态,sbit k10=P1^0;//sbit BEEP = P3^7; //蜂鸣器驱动线----------------请修改为sbit BEEP =P0^4;uchar bee; //蜂鸣器01开关uchar key; //键顺序吗uchar fun=10; //功能状态, <= MAXFUNuchar it0=0,it1; //Timer0中断计数uchar text=0; //数字//uchar text_ctrl[4]={0xFE,0xFD,0xFB,0xF7}; //位选通值uchar text_ctrl[4]={0xE,0xD,0xB,0x7};//位选通值, 00001110, 00001101, 00001011, 00000111//uchar text_code[11]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20,0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效//uchar text_code[17]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};//数码管代码uchar text_code[11]={ 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0,0xFE, 0xF6,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效uchar text_index=0; //当前显示第几个uchar dis_buf[4]; //显示缓存uchar refresh=0; //刷新否T1蜂鸣uchar min=0; //minutesuchar sec=0; //sccondsuchar hour=0; //sccondsuchar onsetup=0;uchar keydown0=0,keydown1=0;uchar data PWM=0xFf ;//PWM值增加,则占空比减小,LED 灯渐暗。

4位共阳数码管遥控时钟

4位共阳数码管遥控时钟
uchar naofs,naofg,naofen; //闹钟分钟 分钟十位和个位
uchar ds,dss,dsg;//继电器小时 小时十位和个位
uchar df,dfs,dfg;//继电器分钟 分钟十位和个位
//设置标志部分
uchar mode=0;//菜单
uchar yiwei=1;
dfs=df/10;//分十位
dfg=df%10;//分个位
dss=ds/10;//时十位
dsg=ds%10;//时个位
P0=table0[dfs];//分十位
P2=table2[3];
delay(10);
naofen=30;
ds=00;
df=30;
while(1)
{ if(!p30) //判断串口是不是有数据
{
iap=0x60; //执行自动下载的命令
}
jishi();//自动走时
TL0=(65535-50000)%256;
int_num++;
}
//定时器初始化函数
void inter_init()
{
EA=1; ///开总中断
ET0=1; //打开定时器T0
TMOD=0x01; //工作方式1
void de(z)//自己用的延迟
{
g n,m;
for(n=z;n>0;n--)
for(m=110;m>0;m--);
}
//初始化T0函数
void time0(void) interrupt 1 // 定时器T0服务子程序
{
TH0=(65535-50000)/256;

Arduino 入门到精通 例程16-四位数码管

Arduino 入门到精通 例程16-四位数码管

Arduino 入门到精通例程16这次我们进行的实验是使用arduino驱动一块共阳四位数码管。

驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阳极接,总共接4颗。

这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。

另外一种接法就是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。

本次实验使用8颗220Ω电阻(因为没有100Ω电阻,所以使用220Ω的代替,100欧姆亮度会比较高)。

4位数码管总共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。

左上角为最大的12号管脚。

下图为数码管的说明手册下面是硬件连接图ARDUINO CODECOPY1.//设置阴极接口2.int a = 1;3.int b = 2;4.int c = 3;5.int d = 4;6.int e = 5;7.int f = 6;8.int g = 7;9.int p = 8;10.//设置阳极接口11.int d4 = 9;12.int d3 = 10;13.int d2 = 11;14.int d1 = 12;15.//设置变量16.long n = 0;17.int x = 100;18.int del = 55; //此处数值对时钟进行微调19.20.void setup()21.{22.pinMode(d1, OUTPUT);23.pinMode(d2, OUTPUT);24.pinMode(d3, OUTPUT);25.pinMode(d4, OUTPUT);26.pinMode(a, OUTPUT);27.pinMode(b, OUTPUT);28.pinMode(c, OUTPUT);29.pinMode(d, OUTPUT);30.pinMode(e, OUTPUT);31.pinMode(f, OUTPUT);32.pinMode(g, OUTPUT);33.pinMode(p, OUTPUT);34.}35.36.void loop()37.{38. clearLEDs();39. pickDigit(1);40. pickNumber((n/x/1000)%10);41.delayMicroseconds(del);42.43. clearLEDs();44. pickDigit(2);45. pickNumber((n/x/100)%10);46.delayMicroseconds(del);47.48. clearLEDs();49. pickDigit(3);50. dispDec(3);51. pickNumber((n/x/10)%10);52.delayMicroseconds(del);53.54. clearLEDs();55. pickDigit(4);56. pickNumber(n/x%10);57.delayMicroseconds(del);58.59. n++;60.61.if(digitalRead(13) == HIGH)62.{63. n = 0;64.}65.}66.67.void pickDigit(int x)//定义pickDigit(x),其作用是开启dx端口68.{69.digitalWrite(d1, LOW);70.digitalWrite(d2, LOW);71.digitalWrite(d3, LOW);72.digitalWrite(d4, LOW);73.74.switch(x)75.{76.case1:77.digitalWrite(d1, HIGH);78.break;79.case2:80.digitalWrite(d2, HIGH);81.break;82.case3:83.digitalWrite(d3, HIGH);84.break;85.default:86.digitalWrite(d4, HIGH);87.break;88.}89.}90.91.void pickNumber(int x)//定义pickNumber(x),其作用是显示数字x92.{93.switch(x)94.{95.default:96. zero();97.break;98.case1:99. one();100.break;101.case2:102. two();103.break;104.case3:105. three();106.break;107.case4:108. four();109.break;110.case5:111. five();112.break;113.case6:114. six();115.break;116.case7:117. seven();118.break;119.case8:120. eight();121.break;122.case9:123. nine();124.break;125.}126.}127.128.void dispDec(int x)//设定开启小数点129.{130.digitalWrite(p, LOW);131.}132.133.void clearLEDs()//清屏134.{135.digitalWrite(a, HIGH);136.digitalWrite(b, HIGH);137.digitalWrite(c, HIGH);138.digitalWrite(d, HIGH);139.digitalWrite(e, HIGH);140.digitalWrite(f, HIGH);141.digitalWrite(g, HIGH);142.digitalWrite(p, HIGH);143.}144.145.void zero()//定义数字0时阴极那些管脚开关146.{147.digitalWrite(a, LOW);148.digitalWrite(b, LOW);149.digitalWrite(c, LOW);150.digitalWrite(d, LOW);151.digitalWrite(e, LOW);152.digitalWrite(f, LOW);153.digitalWrite(g, HIGH);154.}155.156.void one()//定义数字1时阴极那些管脚开关157.{158.digitalWrite(a, HIGH);159.digitalWrite(b, LOW);160.digitalWrite(c, LOW);161.digitalWrite(d, HIGH);162.digitalWrite(e, HIGH);164.digitalWrite(g, HIGH);165.}166.167.void two()//定义数字2时阴极那些管脚开关168.{169.digitalWrite(a, LOW);170.digitalWrite(b, LOW);171.digitalWrite(c, HIGH);172.digitalWrite(d, LOW);173.digitalWrite(e, LOW);174.digitalWrite(f, HIGH);175.digitalWrite(g, LOW);176.}177.178.void three()//定义数字3时阴极那些管脚开关179.{180.digitalWrite(a, LOW);181.digitalWrite(b, LOW);182.digitalWrite(c, LOW);183.digitalWrite(d, LOW);184.digitalWrite(e, HIGH);185.digitalWrite(f, HIGH);186.digitalWrite(g, LOW);187.}188.189.void four()//定义数字4时阴极那些管脚开关190.{191.digitalWrite(a, HIGH);192.digitalWrite(b, LOW);193.digitalWrite(c, LOW);194.digitalWrite(d, HIGH);195.digitalWrite(e, HIGH);196.digitalWrite(f, LOW);197.digitalWrite(g, LOW);198.}199.200.void five()//定义数字5时阴极那些管脚开关201.{202.digitalWrite(a, LOW);204.digitalWrite(c, LOW);205.digitalWrite(d, LOW);206.digitalWrite(e, HIGH);207.digitalWrite(f, LOW);208.digitalWrite(g, LOW);209.}210.211.void six()//定义数字6时阴极那些管脚开关212.{213.digitalWrite(a, LOW);214.digitalWrite(b, HIGH);215.digitalWrite(c, LOW);216.digitalWrite(d, LOW);217.digitalWrite(e, LOW);218.digitalWrite(f, LOW);219.digitalWrite(g, LOW);220.}221.222.void seven()//定义数字7时阴极那些管脚开关223.{224.digitalWrite(a, LOW);225.digitalWrite(b, LOW);226.digitalWrite(c, LOW);227.digitalWrite(d, HIGH);228.digitalWrite(e, HIGH);229.digitalWrite(f, HIGH);230.digitalWrite(g, HIGH);231.}232.233.void eight()//定义数字8时阴极那些管脚开关234.{235.digitalWrite(a, LOW);236.digitalWrite(b, LOW);237.digitalWrite(c, LOW);238.digitalWrite(d, LOW);239.digitalWrite(e, LOW);240.digitalWrite(f, LOW);241.digitalWrite(g, LOW);242.}243.244.void nine()//定义数字9时阴极那些管脚开关245.{246.digitalWrite(a, LOW);247.digitalWrite(b, LOW);248.digitalWrite(c, LOW);249.digitalWrite(d, LOW);250.digitalWrite(e, HIGH);251.digitalWrite(f, LOW);252.digitalWrite(g, LOW);253.}把下面代码复制下载到控制板中,看看效果。

四位共阳数码管的使用剖析

四位共阳数码管的使用剖析

四位数码管的探究 (1)硬件准备 (1)软件准备 (2)控制思路: (2)卞面是实际的焊接之中,考虑到实际电路的连接顺序,采用下面的连接。

(4)两位数码管源程序:00-99 (4)异曲同工:000 -------- 9999 (5)更进一步:四位数字时钟 (7)四位数码管的探究硬件准备四位共阳数码管一块,1K 电阻4只。

数码管的引脚图如下所示:四位共阳数码管使用的单片机是STC12C2052,位选町以使用P1接I I 控制。

参照下面数据手册的内容,可以看出P3・5, 3.4, 3.3, 3.2均能够作为I/O 接口以推挽方式使 用。

由于数码管所能承受的电流较小,所以外加1K 的限流电阻。

单片机P3.5, 3.4, 3.3, 3.2四个接口可以作为数码阳极一端,利用推挽方式输出高电平,PI 接11作为数码管的段选,输出低电平,驱动每一段数码管,这就为设想的实现取得了理 论的基础。

证明了使用20脚单片机控制数码管产生时钟的效果是切实可行的。

下面关键的 部分就成了数码管的编程阶段了。

P1 P1M0 (7: 0] P1M1 [7: 0] I/O Ul 模式(Pl.K 如做AQ 使用,需先将英设置成开漏或高阻输入〉0 0 准双向口(传统8051 I/O 口模式> ・ 灌电流可达20mA •拉电流为230uA ・由于制造误差,实际为250uA 〜150uA0 1 推挽输出(强上拉输出.可达20mA.要加限流电阻)10 仅为输入(奇阻),如果该UO 口需作为A/D 使用,可选此模式 11开jW (Open Drain ).如果该IS 口需作为A/D 使用.可选此換式P3 口设定 ・无口〉P3M0 [ 7: 0]P3M1 [ 7: 0]I/O 口模式0 0 准双向口(传统8051 I/O 口模式). 淞电流可达20mA ・拉电流为230pA ・ 由于制造误差•实际为250uA~ 15 Ou A 0 1 推挽输出(强卜•拉输出・可达20mA.耍加限流电R1) 1 0 仅为输入(高阻)11JTi^fOpen Drain ),内部上拉电阻断开,耍外加卜面将使用单片机控制数码管产生时钟的效果。

基于5单片机的4位数码管秒表之欧阳数创编

基于5单片机的4位数码管秒表之欧阳数创编

原理图:源法度:/******************************************************* ******题目:按时器中断精确到00.01的秒表效果:能清零重新开始,暂停,继续计时,能精确到0.01秒作者:皖绩小挺说明:使用12M晶振,四位数码管,3个按键******************************************************** ********/#include<reg52.h>#define uint unsigned int#define uchar unsigned charuint temp,tt,qian,bai,shi,ge;sbit smg_q=P1^0;sbit smg_b=P1^1;sbit smg_s=P1^2;sbit smg_g=P1^3;sbit key1 = P3^7;sbit key2 = P3^6;sbit key3 = P3^5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点void keyscan();void display(uint shi,uint ge);void delay(uint z);void init();/******************************************************* *******主函数******************************************************** **********/void main(){init();//初始化子法度while(1){if(tt==1){tt=0;temp++;if(temp==10000){temp=0;}qian=temp/1000;bai=temp%1000/100;shi=temp%100/10;ge=temp%10;}keyscan();display(shi,ge);}}/******************************************************* **************延时******************************************************** ***************/void delay(uint z){uint x,y;for(x=z;x>0;x)for(y=110;y>0;y);}/******************************************************* **************按键控制******************************************************** ***************/void keyscan(){if(key1==0) //清零偏重新开始计时{temp=0;TR0=1;}if(key2==0) //暂停计时{TR0=0;}if(key3==0) //继续计时{TR0=1;}}/******************************************************* **************显示******************************************************** ***************/void display(uint shi,uint ge){smg_q=0;P0=table[qian];delay(1);smg_q=1;P0=0xff;smg_b=0;P0=table1[bai];delay(1);smg_b=1;P0=0xff;smg_s=0;P0=table[shi];delay(1);smg_s=1;P0=0xff;smg_g=0;P0=table[ge];delay(1);smg_g=1;P0=0xff;}/******************************************************* **************初始化******************************************************** ***************/void init(){smg_q=1;smg_b=1;smg_s=1;smg_g=1;temp=0;TMOD=0x01;TH0=(6553610000)/256;TL0=(6553610000)%256;EA=1;ET0=1;TR0=1;}/******************************************************* **************中断******************************************************** ***************/void t0() interrupt 1{TH0=(6553610000)/256;TL0=(6553610000)%256;tt++;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4位数码管做时钟
制作人:陈彦彧
制作时间:2012年7月28日
原件清单:
使用知识:定时/计数器、中断
I/O口的连接:
功能介绍:
使用定时器T0扫描数码管显示,使用定时器T1计时;使用键盘扫描来实现时间的调整;
焊接电路图:
源程序:
/***************************************************** 程序设计:陈彦彧
*****************************************************/ #include "iom16.h"
#include "intrinsics.h"
#define uchar unsigned char
#define uint unsigned int
#define s0 (PIND&0x01)
#define s1 (PIND&0x02)
#define s2 (PIND&0x04)
#define s3 (PIND&0x08)
__flash uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uintcnt=0;
uinti=0,j=0,a;
/**************************/
void delay_10nms(uint n)
{
uinta,b,c;
for(c=0;c<n;c++)
{
for(b=15;b>0;b--)
{
for(a=1;a>0;a--)
;
}
}
}
/**************************/
#pragma vector=TIMER0_OVF_vect
__interrupt void time0_ovf_isr(void)
{
SREG=0x80;
TCNT0=0X7d;
if(++i>4)
{
i=0;
}
switch(i)
{
case 0:PORTA=SEG7[cnt%10];PORTB=0xfe;//break; case 1:PORTA=SEG7[(cnt/10)%10];PORTB=0xfd;//break; case 2:PORTA=SEG7[(cnt/100)%10];PORTB=0xfb;//break; case 3:PORTA=SEG7[cnt/1000];PORTB=0xf7;//break;
case 4:PORTA=SEG7[cnt/1000];PORTB=0xff;break; }
}
/**************************/
#pragma vector=TIMER1_OVF_vect
__interrupt void time1_ovf_isr(void)
{
TCNT1H=0X85;
TCNT1L=0Xee;
j++;
PORTA=0X80;PORTB=0xfb;
}
/**************************/
voidinit_devices(void)
{
__disable_interrupt();
TCNT0=0x7d;
TCCR0=0x03;
TCCR1B = 0x04;
TCNT1H=0X85;
TCNT1L=0Xee;
DDRA=0xff;
DDRB=0xff;
DDRC=0xff;
DDRD=0xff;
PORTB=0x00;
PORTA=0x00;
PORTC=0xff;
PORTD=0xff;
DDRD=0x00;
TIMSK=0X05;
__enable_interrupt();
}
/**************************/
void scan_s0(void)
{
if(s0==0)
{
delay_10nms(1000);
if(s0==0)
{
a=cnt%100;
cnt=(cnt/100+1)*100+a;
}
delay_10nms(1000);
}
}
/**************************/
void scan_s1(void)
{
if(s1==0)
{
delay_10nms(1000);
if(s1==0)
{
a=cnt%100;
cnt=(cnt/100-1)*100+a;
}
delay_10nms(1000);
}
}
/**************************/
void scan_s2(void)
{
if(s2==0)
{
delay_10nms(1000);
if(s2==0)
{
++cnt;
}
delay_10nms(1000);
}
}
/**************************/
void scan_s3(void)
{
if(s3==0)
{
delay_10nms(1000);
if(s3==0)
{
--cnt;
}
delay_10nms(1000);
}
}
/**************************/
void main(void)
{
init_devices();
while(1)
{
scan_s0();
scan_s1();
scan_s2();
scan_s3();
if(j==60)
{
++cnt;
j=0;
}
if(cnt%100==99)
{
cnt=cnt/100*100+59;
}
if(cnt%100==60)
{
cnt=(cnt/100+1)*100;
}
if(cnt>=2400)
{ cnt=0; }
}
}。

相关文档
最新文档