STC单片机四位数码管时钟程序

合集下载

单片机—实时时钟实验(汇编版)

单片机—实时时钟实验(汇编版)

实验二实时时钟实验一、实验目的1)数码管动态显示技术2)定时器的应用3)按键功能定义二、实验实现的功能实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。

三、系统硬件设计四、系统软件设计说明:1键进入和退出设置模式,4键选择调分或秒,2键加,3键减。

P1M1 EQU 91HP1M0 EQU 92HSEC0 DA TA 30H ;秒显示SEC1 DA TA 31HMIN0 DA TA 32H ;分显示MIN1 DA TA 33HDELAY_1 DA TA 34H ;延时参数DELAY_2 DA TA 35H ;延时参数ORG 0000HLJMP 0030HORG 001BHLJMP INTR0ORG 0030HMAIN: MOV P1M1,#00000000BMOV P1M0,#11111111BMOV R7,#000 ;记中断次数,R7=100为1秒MOV R6,#000 ;记秒MOV R5,#000 ;记分MOV R4,#0FFH ;按键位置MOV R1,#000 ;确定是否有按键按下的参数MOV TMOD,#10H ;定时器初始化MOV TH1,#0D8H ;定时时间10msMOV TL1,#0F0HSETB EASETB ET1SETB TR1LOOP0: CJNE R4,#000H,LOOP01 ;实时时钟显示MOV R4,#0FFHLJMP LOOP1LOOP01: LCALL TIMELCALL KEY0LJMP LOOP0LOOP1: CJNE R4,#000H,LOOP11 ;调秒MOV R4,#0FFHLJMP LOOP0LOOP11: CJNE R4,#003H,LOOP12MOV R4,#0FFHLJMP LOOP2LOOP12: CJNE R4,#001H,LOOP13MOV R4,#0FFHINC R6LOOP13: CJNE R6,#060,LOOP14MOV R6,#000HLOOP14: CJNE R4,#002H,LOOP16MOV R4,#0FFHCJNE R6,#000,LOOP15MOV R6,#060LOOP15: DEC R6LOOP16: LCALL TIMELCALL KEY1LJMP LOOP1LOOP2: CJNE R4,#000H,LOOP21 ;调分MOV R4,#0FFHLJMP LOOP0LOOP21: CJNE R4,#003H,LOOP22MOV R4,#0FFHLJMP LOOP1LOOP22: CJNE R4,#001H,LOOP24MOV R4,#0FFHINC R5LOOP23: CJNE R5,#060,LOOP24MOV R5,#000HLOOP24: CJNE R4,#002H,LOOP26MOV R4,#0FFHCJNE R5,#000,LOOP25MOV R5,#060LOOP25: DEC R5LOOP26: LCALL TIMELCALL KEY2LJMP LOOP2/*********中断服务程序(原始时间分秒的确定)**********/INTR0: PUSH PSWMOV TH1,#0D8HMOV TL1,#0F0HINC R7MOV TH1,#0D8HMOV TL1,#0F0HCJNE R7,#100,INTR01MOV R7,#000HINC R6CJNE R6,#60,INTR01MOV R6,#000HINC R5CJNE R5,#60,INTR01MOV R5,#000HINTR01: POP PSWRETI/*****************时间分秒显示计算***************/TIME: MOV A,R6 ;计算秒MOV B,#10DIV ABMOV SEC1,AMOV SEC0,BMOV A,R5 ;计算分MOV B,#10DIV ABMOV MIN1,AMOV MIN0,BRET/*****************按键扫描消抖及确定***************/KEY0: LCALL KS ;扫描有无按键按下KEY01: LCALL DISPLAY0 ;CJNE R1,#000H,KEY02 ; 通过(控制数码管的扫描频率,LJMP KEY05 ; 延时进而控制其扫描周期,以KEY02: MOV R1,#000H ; 消抖达到所需摸延时时间)LCALL KS ;CJNE R1,#000H,KEY03 ;确定有按键按下?LJMP KEY05 ;KEY03: LCALL KS0 ;调用计算物理位置子函数KEY04: LCALL TIME ;LCALL DISPLAY0 ;LCALL KS ;检查按键是否松开CJNE R1,#000H,KEY04 ;KEY05: RET ;KEY1: LCALL KS ;同上KEY11: LCALL DISPLAY1 ;CJNE R1,#000H,KEY12 ;LJMP KEY15 ;KEY12: MOV R1,#000HLCALL KSCJNE R1,#000H,KEY13LJMP KEY15KEY13: LCALL KS0KEY14: LCALL TIMELCALL DISPLAY1LCALL KSCJNE R1,#000H,KEY14KEY15: RETKEY2: LCALL KS ;同上KEY21: LCALL DISPLAY2 ;CJNE R1,#000H,KEY22 ;LJMP KEY25 ;KEY22: MOV R1,#000HLCALL KSCJNE R1,#000H,KEY23LJMP KEY25KEY23: LCALL KS0KEY24: LCALL TIMELCALL DISPLAY2LCALL KSCJNE R1,#000H,KEY24KEY25: RET/*****检查有无按健闭合*****/KS: CLR P3.6CLR P3.7SETB P0.5SETB P0.6SETB P0.7MOV A,P0ORL A,#01FHCPL AMOV R1,ARET/****确定按键的物理位置****/KS0: MOV R4,#000H ;行号扫描初值SETB P3.7CLR P3.6 ;行扫描初值KS1: MOV A,P0ORL A,#01FHMOV R3,A ;保存列1CJNE A,#0FFH,KS2MOV R4,#003H ;行首值SETB P3.6CLR P3.7MOV A,P0ORL A,#01FHMOV R3,A ;保存列2CJNE A,#0FFH,KS2LJMP KS4KS2: MOV A,R3 ;计算按键的物理位置RRC ASWAP AKS3: RRC AJNC KS4INC R4SJMP KS3KS4: RET/******************数码管显示*****************/DP1: MOV A,MIN1 ;前两位数码管显示MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.0MOV P1,ALCALL DL0MOV P1,#000HSETB P0.0MOV A,MIN0MOV DPTR,#TAB1MOVC A,@A+DPTRCLR P0.1MOV P1,ALCALL DL0MOV P1,#000HSETB P0.1RETDP2: MOV A,SEC1 ;后两位数码管显示MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.2MOV P1,ALCALL DL0MOV P1,#000HSETB P0.2MOV A,SEC0MOV DPTR,#TAB0MOVC A,@A+DPTRCLR P0.3MOV P1,ALCALL DL0MOV P1,#000HSETB P0.3RET/******************显示方式函数*****************/DISPLAY0: LCALL DP1 ;实时时钟模式的显示函数LCALL DP2RETDISPLAY1: LCALL DP1 ;调秒模式的显示函数CJNE R7,#001H,DISPLAY11MOV R2,#000HDISPLAY11:CJNE R7,#032H,DISPLAY12MOV R2,#001HDISPLAY12:CJNE R2,#000H,DISPLAY13LCALL DP2LJMP DISPLAY14DISPLAY13:LCALL DL0LCALL DL0DISPLAY14:RETDISPLAY2: LCALL DP2 ;调分模式的显示函数CJNE R7,#001H,DISPLAY21MOV R2,#000HDISPLAY21:CJNE R7,#032H,DISPLAY22MOV R2,#001HDISPLAY22:CJNE R2,#000H,DISPLAY23LCALL DP1LJMP DISPLAY24DISPLAY23:LCALL DL0LCALL DL0DISPLAY24:RET/********************延时********************//*说明:延时所用的三条令,stc10f08xe中与常用的51单片机中的指令执行时间不同*/ DL0: MOV DELAY_1,#16 ;延时时间:[2+(2+250*4+4)×16+4] /11.0592DL01: MOV DELAY_2,#250 ; =16102/11.0592DJNZ DELAY_2,$ ; =1.456msDJNZ DELAY_1,DL01 ;RET ; ;TAB0: DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,067H ;无小数点的LED字模表TAB1: DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0E7H ;有小数点的LED字模表END五、实验过程中遇到的问题及解决方法1、怎么让选中的数码管闪烁?通过记秒的参数,设置前半秒扫描相关数码管,后半秒不扫描。

四位电子钟电路和汇编源程序

四位电子钟电路和汇编源程序

RS T1P3.0(R XD)2P3.1(TXD)3XTAL24XTAL15P3.2(INT0)6P3.3(INT1)7P3.4(T0)8P3.5(T1)9GND 10P3.711P1.012P1.113P1.214P1.315P1.416P1.517P1.618P1.719VC C 20IC1AT89C 2051JTC130P C230PR110KVC CAN 2AN 1R2R3R4R5R6R7R8R9A 1B 2C 3D 4E 5F 6G 7DP8P19P210P311P4128.8.8.8.LEDDPY_7_SEGAVC CR10 4.7K R13 4.7KR11 4.7K R12 4.7K Q18550Q28550Q38550Q4855012JXZ CON2C5104C4470UF VC CC310UFA FB GC DPDE A B C D EFG DP 四位电子钟设计与制作电路原理图:此作品为四位电子钟,主要由单片机编程实现其功能,所以分有两部分一个硬件,一个是软件,硬件方面的电路图如上图,单片机采用ATMEL 公司生产的芯片AT89C2051里面有2K 字节的可反复擦写的Flash 程序存储器和128字节的随机存取数据存储器。

显示部分为0.56共阳极四位数码管,在电路中P1口输出段码数据送入四位数码管,P3口做扫描控制,控制数码管的显示。

Q1、Q2、Q3为8550三极管,信号经过放大送入P1、P2、P3、P4也就是数码管显示部分,AN1调整小时,AN2为调整分钟它们都接10脚然后接地.10脚接地,20脚接正电源,它们由3-6V 电源供电,可以用两节1.5V 的电池供电,也可以接USB 接口5V 供电.软件方面,程序里先定义两个中断定时器T0和T1,一个作为秒记数用,另一个作为调整时闪烁用,编程时先将P1和P3口数据清零,然后P1和P3作为动态扫描显示,由于人的眼睛有延迟性,当扫描频率非常高时人就感觉数码管一直亮着,而同时计数器在遵循时间的变化方式执行着分到了60分钟加1,时间为24小时制,就是到了24小时后自动为00:00. 元件清单:名称 型号 数量 单片机 AT89C2051 1 数码管 0.56四位共阳极 1三极管8550 4电阻4.7K 4 10K 1 220 8电容30PF 2 10uf 1 104 1石英晶体振荡器12M 1 电子钟源程序(汇编):MIAO BIT P2.0 ;秒点位HOU_S BIT P3.0 ;时十位HOU_G BIT P3.1 ;时个位MIN_S BIT P3.2 ;分十位MIN_G BIT P3.3 ;分个位H_KEY BIT P3.4 ;时调整键M_KEY BIT P3.5 ;分调整键SHAN BIT 0 ;秒点闪烁LEDBUS EQU P1 ;显示数据总线SECOND EQU 30H ;秒寄存器MINUTE EQU 31H ;分寄存器HOUR EQU 32H ;时寄存器TIM_1 EQU 33H ;定时器0中断次数TIM_2 EQU 34H ;定时器0中断次数;********************************ORG 0000H ;程序开始LJMP INITORG 000BH ;定时器0中断入口地址LJMP TIMER0ORG 0030H ;程序从30H开始;********************************; 单片机初始化INIT:MOV SECOND, #0 ;秒置0MOV MINUTE, #0 ;分置0MOV HOUR, #0 ;开机后显示0点MOV TIM_1, #10 ;中断10次为0.5秒MOV TIM_2, #2 ;0.5*2=1秒MOV SP, #60H ;堆栈指针指向60HMOV TMOD, #01H ;定时器0为模式1(16位)MOV TH0, #03CHMOV TL0, #0B0H ;50毫秒初值(晶振12M)SETB ET0 ;定时器0中断允许SETB TR0 ;启动定时器0SETB EA ;开总中断;********************************; 主程序MAIN:JNB H_KEY, HT ;时调整键按下转到HTJNB M_KEY, MT ;分调整键按下转到MTACALL DISP ;调用显示子程序AJMP MAIN ;转LOOP继续检测按键状态;********************************; 时间调整;----- 分调整 -----------------MT: ACALL DISP ;调用显示子程序JNB M_KEY, MT ;判断按键是否松开INC MINUTE ;分加一MOV A, MINUTECJNE A,#60, MAIN ;判断分是否加到60MOV MINUTE, #0 ;分到60变为0MOV SECOND, #0 ;秒置0AJMP MAIN;----- 时调整 -----------------HT: ACALL DISP ;调用显示子程序JNB H_KEY, HT ;判断按键是否松开INC HOUR ;时加1MOV A, HOURCJNE A,#24, MAINMOV HOUR, #0 ;判断时是否到24,时到24变0 AJMP MAIN;********************************; 显示子程序DISP:MOV DPTR, #LEDTAB ;数码管段码表首地址送DPTR MOV A, MINUTE ;分放入ACCMOV B, #10 ;B放入10DIV AB ;A/B,商在A余数在BMOVC A, @A+DPTR ;查表取分十位段码MOV LEDBUS, A ;段码送LEDBUS口显示MOV C, SHANMOV MIAO, C ;秒点闪烁CLR MIN_S ;打开分十位显示ACALL D1MS ;延时1毫秒SETB MIN_S ;关闭分十位显示MOV A, BMOVC A, @A+DPTR ;查表取分个位段码MOV LEDBUS, AMOV C, SHANMOV MIAO, C ;秒点闪烁CLR MIN_G ;打开分个位显示ACALL D1MS ;延时1毫秒SETB MIN_G ;关闭分十位显示MOV A, HOURMOV B, #10DIV AB ;拆分小时的十位和个位JZ DISP0 ;十位为0不显示十位MOVC A, @A+DPTRMOV LEDBUS, ACLR HOU_S ;打开时十位显示DISP0:ACALL D1MSSETB HOU_S ;关闭时十位显示MOV A, BMOVC A, @A+DPTRMOV LEDBUS, ACLR HOU_G ;打开时个位显示ACALL D1MSSETB HOU_G ;关闭时个位显示RET;********************************; 定时器0中断服务程序TIMER0:MOV A, #0B1H ;定时器0中断服务子程序ADD A, TL0 ;同步修正(参考本人的<如何是自制的单片机电子钟走时精准>)MOV TL0, AMOV TH0, #03CH ;重装定时器0初值PUSH ACC ;入栈保护ACC和PSWPUSH PSWDJNZ TIM_1, RETI_1MOV TIM_1, #10 ;中断10次为0.5秒CPL SHAN ;取反闪烁位DJNZ TIM_2, RETI_1MOV TIM_2, #2 ;1秒时间到INC SECOND ;秒加1MOV A, SECONDCJNE A,#60, RETI_1MOV SECOND, #0 ;秒到60变0INC MINUTE ;分加1MOV A, MINUTECJNE A,#60, RETI_1MOV MINUTE, #0 ;分到60变0INC HOUR ;时加1MOV A, HOURCJNE A,#24, RETI_1MOV HOUR, #0 ;时到24变0RETI_1: POP PSW ;出栈POP ACCRETI;********************************; 延时子程序D1MS: MOV R7, #2 ;延时1毫秒子程序D_1: MOV R6, #250 ;延时时间估算250*2*2=1000微秒=1毫秒DJNZ R6, $DJNZ R7, D_1RET;********************************; 数码管段码表LEDTAB:DB 14H,0D7H,4CH,45H,87H; 0 1 2 3 4DB 25H,024H,57H,04H,05H; 5 6 7 8 9END。

单片机 4位时钟数码管

单片机 4位时钟数码管

单片机控制4位时钟数码管的方法如下:
连接硬件:将4位数码管的共阳(或共阴)引脚连接到单片机的I/O口,连接数码管的段选引脚到单片机的另外4个I/O口。

同时,连接一个晶振和相关的电容电阻到单片机的时钟输入引脚和地。

设置引脚:在代码中定义每个数码管引脚对应的I/O口为输出模式,用于控制数码管的显示。

编写代码:使用单片机的定时器功能,通过编程计算出每个数码管显示的数字对应的段选编码,并在定时器中断服务程序中更新数码管的显示。

调试程序:将程序下载到单片机中,通过观察数码管的显示效果,调整程序中的参数或代码,以达到预期的显示效果。

需要注意的是,具体的实现方式可能因单片机的型号和数码管的类型而有所不同,需要根据实际情况进行相应的调整。

四位共阳数码管的使用

四位共阳数码管的使用
P1M0=0X00;
P1M1=0XFF;//设置P1,P3接口的工作方式为推挽输出。
P3M0=0X00;
P3M1=0XFF;
/*****************************************************************/
a=0;b=0;c=0;d=0;
while(1)
#include<stc12c2052.h>
#define weixuan P1
sbit a= P3^5;
sbit b =P3^4;
sbit c =P3^3;
sbit d= P3^2;
void yanshi(unsigned int a )
{
unsigned int i;
while(--a)
{
for(i=0;i<600;i++) ;
P1.4
P1.3
P1.2
P1.1
P1.0
十六
引脚
1
2
4
5
7
10
11
Dp
0
0
0
0
1
0
0
0
1
11
1
1
1
0
1
0
1
1
1
D7
2
0
0
1
0
0
1
0
1
25
3
1
0
0
0
0
1
0
1
85
4
1
1
0
0
0
0
1
1
C3
5
1
0
0
0

自制四位数码管显示的数字钟c程序

自制四位数码管显示的数字钟c程序
}
}
void ys()
{for(qw=255;qw>0;qw--)
for(qe=255;qe>0;qe--);
for(qw=255;qw>0;qw--)
for(qe=50;qe>0;qe--);
}
ቤተ መጻሕፍቲ ባይዱ
if(zz==120){zz=0;ss++;}
if(ss==10){ss=0;dd++;}
if(dd==6){dd=0;ff++;}
if(ff==10){ff=0;gg++;}
if(gg==2) {if(ff>=4){ff=0;gg=0;}}
if(gg>=3) {gg=0;}
}
}
void zhongduan() interrupt 1 //中断函
{ TH0=(65535-50000)/256; //定时器复初值
TL0=(65535-50000)%256;
z++;
if(z==80)
{z=0;
e=!e;
zz++;
sbit f=P2^5;//时间指示灯
sbit g=P2^6;//设置指示灯
sbit h=P2^7;//....
sbit i=P1^0;//时间设置按键
sbit j=P1^1;//返回
sbit k=P1^2;//加
sbit l=P1^3;//减
sbit m=P1^4;//定时设置
sbit y=P1^5;//启动定时
P0=shuzi[gg];d=1;d=0;

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;

STC12C2052AD驱动DS18B20四位共阳极数码管显温程序

STC12C2052AD驱动DS18B20四位共阳极数码管显温程序

/***********************************************函数名:DS18B20温度读取程序编写人:寒江学钓时间:2021.7.8接口:调用:数码管显示函数,共阳极数码管参数:返回值:结果:备注:DS18B20温度探测/********************************************/#include<STC12C2052AD.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define X_PWM 9 //LED的亮度设置#define X_DELAY 12 //每点显示时长#define X_P1M0SET 0x00 //I\0口工作方式选择(从左到右,从高到低)#define X_P1M1SET 0x00sbit dq = P3 ^ 5;sbit X_LED_H1 = P3 ^ 0;sbit X_LED_H2 = P3 ^ 1;sbit X_LED_H3 = P3 ^ 2;sbit X_LED_H4 = P3 ^ 3;sbit X_LED_L1 = P1 ^ 0;sbit X_LED_L2 = P1 ^ 1;sbit X_LED_L3 = P1 ^ 2;sbit X_LED_L4 = P1 ^ 3;sbit X_LED_L5 = P1 ^ 4;sbit X_LED_L6 = P1 ^ 5;sbit X_LED_L7 = P1 ^ 6;sbit X_LED_L8 = P1 ^ 7;bit flag;//初始化标志bit negative;//负温度标志uint temp;uchar code disdata[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //无小数点数码管断码表0-9 0x40,0x09,0x72 //特殊标记符号};/******数码管函数***********************/void delay(uint a);//点扫描延时程序声明void dis_off(void);//关所有显示void displayHH1(uchar b); //横向显示程序void displayHH2(uchar b); //横向显示程序void displayHH3(uchar b); //横向显示程序void displayHH4(uchar b); //横向显示程序void displaydata(uchar L, uchar b); //数码管显示void display(uint T);//总显示程序void init(void); //上电初始/***************************************//*******DS18B20函数********************/void delay_1us();//1 us 延时@12.000MHzvoid delay_aus(uint a);//a us延时@12.000MHzvoid delay_a10us(uchar a);//a*10 us延时@12.000MHz void DS18B20_init(void);//初始化bit ds_read_bit(); //位读取uchar ds_read_byte(); //读字节void ds_write_byte(uchar dat); //写字节uint read_temperature(); //读温度void temperature_conversion();//温度转换先行/************************************************/int main(){uint L;temp = 0;flag = 0;init();while (1){temperature_conversion();//温度转换L = read_temperature();//读温度display(L);delay_aus(500);}}/*************延时区*************************/ void delay(uint a) //点扫描延时子程序{uchar i;while (--a != 0){for (i = 0; i < X_DELAY; i++);}}void Delay_1us()//@12.000MHz{_nop_();_nop_();}void delay_us(uint a){uint i, j;for (i = 0; i < a; i++){for (j = 0; j < 1; j++);}}void delay_10us(uint a){uint i, j;for (i = 0; i < a; i++){_nop_();for (j = 0; j < 19; j++){_nop_();}}}/**********************************************//*****************初始化**********************/void DS18B20_init(void){uint i;i = 0;dq = 1;delay_us(10);dq = 0;delay_10us(50);dq = 1;delay_us(16);for (i = 0; i < 1000; i++)//在反馈时间内判断DP=0时有响应{if (dq == 0){flag = 1;break;//跳出循环}elseflag = 0;}delay_10us(48);//凑延时}/*******************************************//*****************位读取********************/ bit ds_read_bit(){bit dat;dq = 0;delay_1us();dq = 1;delay_1us();delay_1us();dat = dq;delay_us(80);return dat;}/*******************************************//****************** 读字节******************/ uchar ds_read_byte() //数据传输地位在先{uchar i, j, k;for (i = 0; i < 8; i++){j = ds_read_bit();k = (j << 7) | (k >> 1);}return k;delay_us(2);}/****************************************//****************写字节******************/void ds_write_byte(uchar dat){uchar i;for (i = 0; i < 8; i++){dq = 0;delay_1us();dq = dat & 0x01;delay_us(60);dq = 1;dat = dat >> 1;}delay_us(60);}/*****************************************//***************读温度*******************/uint read_temperature(){uchar a, b,c;DS18B20_init();ds_write_byte(0xcc);//跳过ROMds_write_byte(0xbe);//读温度a = ds_read_byte();//读取温度低八位b = ds_read_byte();//读取温度高八位temp = b;temp = temp << 8;temp = temp | a;c = b & 0xf8;if (c==0xf8){negative = 1;//负温度标记temp = ~temp;//补吗取反temp += 1;//反码加1,获得负温度值temp = temp & 0xfff;}else{negative = 0;//正温度标记temp = temp & 0x7ff;//过滤负温度标识位temp = temp * 0.625 + 0.5;//取正温度到0.1显示精度}return temp;}/******************************************//***************温度转换先行***************/ void temperature_conversion(){DS18B20_init();ds_write_byte(0xcc);ds_write_byte(0x44);//温度转换}/*****************************************/ /******数码管函数************************/void dis_off(void)//数码管全关程序{P1 = ~X_P1M1SET;X_LED_H1 = 0;X_LED_H2 = 0;X_LED_H3 = 0;X_LED_H4 = 0;delay(10 - X_PWM);}void displayHH1(uchar b)//第一列横向显示程序{uchar i;i = b & 0x01;if (i == 0x01){X_LED_H1 = 1;X_LED_L1 = 0;}delay(X_PWM);dis_off();i = b & 0x02;if (i == 0x02){X_LED_H1 = 1;X_LED_L2 = 0; }delay(X_PWM); dis_off();i = b & 0x04;if (i == 0x04){X_LED_H1 = 1;X_LED_L3 = 0; }delay(X_PWM); dis_off();i = b & 0x08;if (i == 0x08){X_LED_H1 = 1;X_LED_L4 = 0; }delay(X_PWM); dis_off();i = b & 0x10;if (i == 0x10){X_LED_H1 = 1;X_LED_L5 = 0; }delay(X_PWM); dis_off();i = b & 0x20;if (i == 0x20){X_LED_H1 = 1;X_LED_L6 = 0; }delay(X_PWM); dis_off();i = b & 0x40;if (i == 0x40){X_LED_H1 = 1;X_LED_L7 = 0;}delay(X_PWM);dis_off();i = b & 0x80;if (i == 0x80){X_LED_H1 = 1;X_LED_L8 = 0;}delay(X_PWM);dis_off();}void displayHH2(uchar b)//第二列横向显示程序{uchar i;i = b & 0x01;if (i == 0x01){X_LED_H2 = 1;X_LED_L1 = 0;}delay(X_PWM);dis_off();i = b & 0x02;if (i == 0x02){X_LED_H2 = 1;X_LED_L2 = 0;}delay(X_PWM);dis_off();i = b & 0x04;if (i == 0x04){X_LED_H2 = 1;X_LED_L3 = 0;}delay(X_PWM); dis_off();i = b & 0x08;if (i == 0x08){X_LED_H2 = 1;X_LED_L4 = 0; }delay(X_PWM); dis_off();i = b & 0x10;if (i == 0x10){X_LED_H2 = 1;X_LED_L5 = 0; }delay(X_PWM); dis_off();i = b & 0x20;if (i == 0x20){X_LED_H2 = 1;X_LED_L6 = 0; }delay(X_PWM); dis_off();i = b & 0x40;if (i == 0x40){X_LED_H2 = 1;X_LED_L7 = 0; }delay(X_PWM); dis_off();i = b & 0x80;if (i == 0x80){X_LED_H2 = 1;X_LED_L8 = 0;}delay(X_PWM);dis_off();}void displayHH3(uchar b)//第三列横向显示程序{uchar i;i = b & 0x01;if (i == 0x01){X_LED_H3 = 1;X_LED_L1 = 0;}delay(X_PWM);dis_off();i = b & 0x02;if (i == 0x02){X_LED_H3 = 1;X_LED_L2 = 0;}delay(X_PWM);dis_off();i = b & 0x04;if (i == 0x04){X_LED_H3 = 1;X_LED_L3 = 0;}delay(X_PWM);dis_off();i = b & 0x08;if (i == 0x08){X_LED_H3 = 1;X_LED_L4 = 0;}delay(X_PWM);dis_off();i = b & 0x10;if (i == 0x10){X_LED_H3 = 1;X_LED_L5 = 0;}delay(X_PWM);dis_off();i = b & 0x20;if (i == 0x20){X_LED_H3 = 1;X_LED_L6 = 0;}delay(X_PWM);dis_off();i = b & 0x40;if (i == 0x40){X_LED_H3 = 1;X_LED_L7 = 0;}delay(X_PWM);dis_off();i = b & 0x80;if (i == 0x80){X_LED_H3 = 1;X_LED_L8 = 0;}delay(X_PWM);dis_off();}void displayHH4(uchar b)//第四列横向显示程序{uchar i;i = b & 0x01;if (i == 0x01){X_LED_H4 = 1;}delay(X_PWM); dis_off();i = b & 0x02;if (i == 0x02){X_LED_H4 = 1;X_LED_L2 = 0; }delay(X_PWM); dis_off();i = b & 0x04;if (i == 0x04){X_LED_H4 = 1;X_LED_L3 = 0; }delay(X_PWM); dis_off();i = b & 0x08;if (i == 0x08){X_LED_H4 = 1;X_LED_L4 = 0; }delay(X_PWM); dis_off();i = b & 0x10;if (i == 0x10){X_LED_H4 = 1;X_LED_L5 = 0; }delay(X_PWM); dis_off();i = b & 0x20;if (i == 0x20){X_LED_L6 = 0;}delay(X_PWM);dis_off();i = b & 0x40;if (i == 0x40){X_LED_H4 = 1;X_LED_L7 = 0;}delay(X_PWM);dis_off();i = b & 0x80;if (i == 0x80){X_LED_H4 = 1;X_LED_L8 = 0;}delay(X_PWM);dis_off();}void displaydata(uchar L, uchar b)//显示程序{switch (L)//显示的列位置{case 1:displayHH1(b);//将显示数据送入break;case 2:displayHH2(b);break;case 3:displayHH3(b);break;case 4:displayHH4(b);break;}}void init(void)//初始化{P1M0 = X_P1M0SET;//P1M0:P1M1=0:0准双向一般输出P1M1 = X_P1M1SET;P3M0 = 0x00;//P3M0:P3M1=0:1 强推挽输出电流可达20mAP3M1 = 0x0f;dis_off();}void display(uint T){if (flag ==1){if (negative == 1){displaydata(1, disdata[T / 100]);displaydata(2, disdata[T % 100 / 10] + 0x80);//+0x80是为了点亮“:”号,作为小数点用displaydata(3, disdata[T % 100 % 10]);displaydata(4, disdata[10]);//特殊符号显示位‘-’代表负温度}else{displaydata(1, disdata[T / 100]);displaydata(2, disdata[T % 100 / 10] + 0x80);//+0x80是为了点亮“:”号,作为小数点用displaydata(3, disdata[T % 100 % 10]);displaydata(4, disdata[11]);//特殊符号显示位‘二’代表正温度}}elsedisplaydata(4, disdata[12]);//特殊符号显示位‘r’代表初始化失败}。

四位秒表程序

四位秒表程序

重赏之下心有勇夫^_^;汇编时钟程序。

4位共阳管。

P0口段码,P2.0~P2.3位码。

显示毫秒和秒。

三个按键一个控制时钟开始走,一个控制暂停和继续。

一个按键清0;12M晶振 2011 04 20 调试完成STRT EQU P3.2STP EQU P3.3CLRR EQU P3.5ORG 00HSJMP MAINORG 0BHAJMP T0INTORG 30HMAIN: MOV SP,#60HMOV R3,#10MOV R4,#20MOV TMOD,#01H ;定时器T0工作方式1MOV TH0,#0D8H ;10MS定时初值MOV TL0,#0F0HSETB ET0SETB EAk1: LCALL DISPJB STRT,K2LCALL DISPJNB STRT,$-3AJMP STARTk2: LCALL DISPJB STP,K3LCALL DISPJNB STP,$-3AJMP SSK3: LCALL DISPJB CLRR,K1LCALL DISPJNB CLRR,$-3AJMP CLEARSTART: SETB TR0CLR F0 ;如无此条,暂停后,不是按继续键,而是按开始键继续走时,下次按暂停键时,不能暂停AJMP K1SS: CPL F0JNB F0,STARTSTOP: CLR TR0AJMP K2CLEAR: CLR TR0MOV A,#0MOV 20H,AMOV 21H,AMOV 22H,AMOV 23H,AMOV 24H,AMOV 25H,AAJMP K3DISP: MOV A,24HMOV B,#10DIV ABMOV 20H,B ;余数(MS个位数)MOV 21H,A ;商(MS十位数)MOV A,25HMOV B,#10DIV ABMOV 22H,B ;余数(S个位数)MOV 23H,A ;商(S十位数)MOV A,20H ;MS个位ACALL SEG7MOV P0,ASETB P2.4ACALL DLYCLR P2.4MOV A,21H ;MS十位ACALL SEG7MOV P0,ASETB P2.5ACALL DLYCLR P2.5MOV A,22H ;S个位ACALL SEG7MOV P0,ACLR P0.7SETB P2.6ACALL DLYCLR P2.6MOV A,23H ;S十位ACALL SEG7MOV P0,ASETB P2.7ACALL DLYCLR P2.7RETT0INT: MOV TH0,#0D8H MOV TL0,#0F0HINC 24HMOV A,24HCJNE A,#99,T0INTRMOV 24H,#0INC 25HMOV A,25HCJNE A,#60,T0INTRMOV 25H,#0T0INTR: RETIDLY: MOV R7,#10D1: MOV R6,#50DJNZ R6,$DJNZ R7,D1RETSEG7: INC AMOVC A,@A+PCRETDB 0C0H;0DB 0F9H;1DB 0A4H;2 DB 0B0H;3 DB 099H;4 DB 092H;5 DB 082H;6 DB 0F8H;7 DB 080H;8 DB 090H;9 END2STRT EQU P1.0CLRR EQU P1.1ORG 00HAJMP MAINORG 0BHAJMP T0INT0ORG 30HMAIN:MOV SP,#60HMOV R4,#20MOV TMOD,#01HMOV TH0,#3CH;12M晶振时定时初值取#3CB0H,还可细调如TL=#0B7H,可以更准MOV TL0,#0B0HSETB ET0SETB EAk1:ACALL DISP ;开始/暂停键JB STRT,K2ACALL DISPJNB STRT,$-2AJMP K1K2:JB CLRR,K1ACALL DISPJNB CLRR,$-2MOV A,#0CLR TR0MOV 26H,AMOV 27H,AMOV 28H,AAJMP K2DISP:MOV A,26HMOV B,#10DIV ABMOV 20H,B ;余数(百分秒位数)MOV 21H,A ;商(十分秒位数)MOV A,27HMOV B,#10DIV ABMOV 22H,B ;余数(秒个位数)MOV 23H,A ;商(秒十位数)MOV A,28HMOV B,#10DIV ABMOV 24H,B ;余数(分个位数)MOV 25H,A ;商(分十位数)MOV A,20H ;百分秒?ACALL SEG7MOV P0,ACLR P2.3ACALL DLYSETB P2.3MOV A,21H ;十分秒ACALL SEG7MOV P0,AACALL DLYSETB P2.2DISP1:MOV A,22H ;秒个位ACALL SEG7MOV P0,ASETB P0.7CLR P2.1ACALL DLYSETB P2.1MOV A,23H ;秒十位ACALL SEG7MOV P0,ACLR P2.0ACALL DLYSETB P2.0RETT0INT0:MOV TH0,#3CH; ;定时中断子程序。

四位电子时钟

四位电子时钟

一、实训任务1、通过实训增强自己找材料,自主学习的能力。

2、通过实训学会焊接,测试电路的基本能力,学会熟练的运用Protues的使用。

3、通过实训锻炼自己并成功的制作四位数字时钟。

4、通过实训学会遇到问题解决问题的方法,能够调整心态,认真找到出错原因。

二、实训条件1、需要工具:电烙铁、万用表、剪刀。

2、需要软件:protues、Viso、电脑。

3、需要材料:集电极电容10uF、陶瓷片电容两个30PF、560k电阻8个、4.7K电阻6个、数码管4个、三极管4个、AT89C2051单片机1个、开关2个、石英晶提体1个。

三、实训要求1.学习掌握各种制作软件,熟练焊接。

2.利用Protues软件画出所设计电路的原理图、PCB板图。

3.撰写实训报告,并进行答辩。

四、实训内容(一)设计的总体思路1.资料查找,根据所要设计的题目查找相关资料,了解其设计原理及个元器件功能,掌握电子产品的设计流程。

2.原理图与 PCB,通过Protues软件制作原理图,若出现无封装库的情况则自行进行封装,建立新的元器件库,进而完成电路的仿真与PCB的制作。

3.焊接,焊接过程应注意电烙铁的温度,将元器件按照大小依次焊接于电路板上,焊接时避免烙铁过长时间的接触元器件,以免烫坏元器件,焊接工艺关系到电路能否顺利调试与运行,因此需耐心对待。

4.调试,调试目的是验证电路各部分的正确性,确定产品功能以及产品应用的可行性,调试时应先静态调试,利用万用表测量电路是否接通,检查元器件是否因焊接不当造成损坏,之后再加相应电压,分级测量各部分电压与电流与理论值是否相符,最后整调检验产品功能。

(二)设计方案1.设计要求1)要求每位成员收集资料,整理资料。

2)了解电路原理图,了解每个电路器件的功能。

3)要求焊接精细,注意串线。

2.设计流程图1 四位数字时钟设计流程图图2 四位数字时钟内部功能流程图图3 加一子程序流程图3. 元器件清单3.设计原理本设计为四位数字时钟,其主控芯片为AT89C2051单片机,使用3-6V直流电源供电。

STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序

STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(3),STC8A系列可参考STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序/**************************************************/ main主函数程序:#include "Library.h"unsigned char code orgval[7]={0x00,0x00,0x00,0x20,0x01,0x04,0x20,};unsigned char set_buf[13]={0,0,0,0,0,0,1,0,0,0,0,0,0,}; unsigned char t_buf[7];unsigned char t_rec[7];unsigned char time_buf[15];unsigned char x_value;unsigned char y_value;bit enter_flag;bit tmr200ms_flag=0;void Write_original(unsigned char *originalval);void Timer0_config(unsigned int ms);void Display_time(unsigned char *tm_buf);void main(){unsigned char sec_bkp;unsigned char testbuf[7];P1M1 &= 0x3F; P1M0 &= 0x3F;P2M1 &= 0x3F; P2M0 &= 0x3F;P5M1 &= 0xF3; P5M0 &= 0xF3;P4M1 &= 0x0F; P4M0 &= 0x0F;P2M1 &= 0xE5; P2M0 &= 0xE5;P0M1 = 0x00; P0M0 = 0x00;Timer0_config(1);LCD1602_init();EA = 1;//F0 = 0;//LCD1602_wbyte(0,0,"hi",sizeof("hi")-1);//test LCD1602//P0 = 0xFF;Read_time(0x02,testbuf);if(testbuf[0]&0x80){Write_original(orgval);}while(1){Key_driver();if(tmr200ms_flag){tmr200ms_flag=0;Read_time(0x02,t_rec);//Display_time(t_buf);//test}if(enter_flag==0){if(sec_bkp!=t_rec[0]){sec_bkp = t_rec[0];Display_time(t_rec);}}}}void Display_time(unsigned char *tm_buf){time_buf[0] = ((tm_buf[2])>>4)+'0';time_buf[1] = ((tm_buf[2])&0x0F)+'0';time_buf[2] = ':';time_buf[3] = ((tm_buf[1])>>4)+'0';time_buf[4] = ((tm_buf[1])&0x0F)+'0';time_buf[5] = ':';time_buf[6] = ((tm_buf[0])>>4)+'0';time_buf[7] = ((tm_buf[0])&0x0F)+'0';LCD1602_wbyte(0,0,time_buf,8);time_buf[0] = 0x02 + '0';time_buf[1] = 0x00 + '0';time_buf[2] = (tm_buf[6]>>4)+'0';time_buf[3] = (tm_buf[6]&0x0F)+'0';time_buf[4]= '-';time_buf[5] = (tm_buf[5]>>4)+'0';time_buf[6] = (tm_buf[5]&0x0F)+'0';time_buf[7]= '-';time_buf[8] = (tm_buf[3]>>4)+'0';time_buf[9] = (tm_buf[3]&0x0F)+'0';LCD1602_wbyte(0,1,time_buf,10);time_buf[0] = (tm_buf[4]&0x0F)+'0';LCD1602_wbyte(10,0,time_buf,1);}void Write_original(unsigned char *originalval) {Display_time(originalval);Write_time(0x02,originalval);}void KeyAction(unsigned char kc){unsigned int tmp;if(kc==0x26)//up{}else if(kc==0x28)//down{}else if(kc==0x25)//left:set x,y{if(enter_flag){if(y_value==0){if(x_value<10){x_value++;if(x_value==7){x_value = 10;}}else{x_value = 0;y_value = 1;}}else if(y_value==1){if(x_value<9){x_value++;}else{x_value = 0;y_value = 0;}}Setcursor(x_value,y_value);}}else if(kc==0x27)//right:set value{if(enter_flag){if(y_value==0){if(x_value==0||x_value==1){if(x_value==0){if(set_buf[0]<2){set_buf[0]++;}else{set_buf[0]=0;}}else if(x_value==1){if(set_buf[1]<9){set_buf[1]++;}else{set_buf[1]=0;}}if((set_buf[0]==2)&&(set_buf[1]>3)){set_buf[1] = 0;}t_buf[2] =( set_buf[0]<<4) |( set_buf[1]&0x0F);}else if(x_value==3||x_value==4){if(x_value==3){if(set_buf[2]<5){set_buf[2]++;}else{set_buf[2]=0;}}else if(x_value==4){if(set_buf[3]<9){set_buf[3]++;}else{set_buf[3]=0;}}t_buf[1] =(set_buf[2]<<4 )|( set_buf[3]&0x0F);}else if(x_value==6||x_value==7){if(x_value==6){if(set_buf[4]<5){set_buf[4]++;}else{set_buf[4]=0;}}else if(x_value==7){if(set_buf[5]<9){set_buf[5]++;}else{set_buf[5]=0;}}t_buf[0] = (set_buf[4]<<4 )|( set_buf[5]&0x0F);}else if(x_value==10){if(set_buf[6]<7){set_buf[6]++;}else{set_buf[6] = 0x01;}t_buf[4] = set_buf[6]&0x0F; }}else if(y_value==1){if(x_value==2||x_value==3){if(x_value==2){if(set_buf[7]<9){set_buf[7]++;else{set_buf[7]=0;}}else if(x_value==3){if(set_buf[8]<9){set_buf[8]++;}else{set_buf[8]=0;}}t_buf[6] = (set_buf[7]<<4)|( set_buf[8]);}else if(x_value==5||x_value==6){if(x_value==5){if(set_buf[9]<1){set_buf[9]++;else{set_buf[9]=0;}}else if(x_value==6){if(set_buf[10]<9){set_buf[10]++;}else{set_buf[10]=0;}if((set_buf[9]==1)&&(set_buf[10]>2)){set_buf[10] = 0;}}t_buf[5] = (set_buf[9]<<4)| set_buf[10];}else if(x_value==8||x_value==9){if(x_value==8){if(set_buf[11]<3){set_buf[11]++;}else{set_buf[11]=0;}}else if(x_value==9){if(set_buf[12]<9){set_buf[12]++;}else{set_buf[12]=0;}if((set_buf[11]==3)&&(set_buf[12]>0)&&((t_buf[5]==0x04)| |(t_buf[5]==0x06)||(t_buf[5]==0x09)||(t_buf[5]==0x11))){set_buf[12] = 0;}elseif((set_buf[11]==3)&&(set_buf[12]>1)){set_buf[12] = 0;}}t_buf[3] = (set_buf[11]<<4)|set_buf[12];}if((t_buf[5]==0x02)&&(t_buf[3]>=0x29)){tmp = set_buf[7]*10 + set_buf[8];tmp = tmp + 2000;if((tmp%4==0)&&(tmp%100!=0)){t_buf[3] = 0x29;}else{t_buf[3] = 0x28;}}if(((t_buf[5]==0x04)||(t_buf[5]==0x06)||(t_buf[5]==0x09) ||(t_buf[5]==0x11))&&(t_buf[3]==0x31)){t_buf[3]=0x30;}}Display_time(t_buf);}}else if(kc==0xC0)//esc{OffCursor();Setcursor(0,0);enter_flag = 0;}else if(kc==0x0D)//enter{if(enter_flag==0){enter_flag = 1;OnCursor();Setcursor(0,0);}else{enter_flag = 0;OffCursor();Setcursor(0,0);Write_time(0x02,t_buf); }}else{}}void Timer0_config(unsigned int ms){unsigned long tmp;tmp = (MAIN_Fosc*ms)/1000;tmp = 65536 - tmp;TL0 = (unsigned char)tmp;TH0 = (unsigned char)(tmp>>8);TMOD &= 0xF0;AUXR |= 0x80;ET0 = 1;TR0 = 1;}void Timer0_interrupt() interrupt 1{static unsigned int tmr200ms=0;Key_scan();tmr200ms++;if(tmr200ms>500){tmr200ms = 0;tmr200ms_flag=1; }}/**************************************************/ PCF8563程序及简要说明:/*****************************1.IIC-bus slave address:read A3h and write A2h2.16 8-bit registers3.Binary coded Decimal->BCD4.registers describe1>Control_status_1 address 00h-> 0000 00002>Control_status_2 address 01h-> 0000 00003>VL_seconds address 02h-> VL 000(5) 0000(9)defualt VL = 14>Minutes address 03h-> x 000(5) 0000(9)5>Hours address 04h-> xx 00(2) 0000(9)6>Days address 05h-> xx 00(3) 0000(9)7>Weekdays address 06h-> xxxx x000(6):000->sunday 110->saturday8>Century_months address 07h-> 0xx 0(1) 0000(9)9>Years address 08h-> 0000(9) 0000(9)->99Access time for read/write operations->start->slave address->data/data...->stop->10>~13> alarm registers omitted:default value,min_alarm->0b1000 0000, hour_alarm->0b1000 0000,day_alarm->0b1000 0000,week_alarm->0b1000 0000,14> clkout control register omitted:default value,0b1000 0000,15>Timer_control address 0Eh->default value,0b0000 0000,16>Tiemr address 0Fh->default value,0b0000 0000*******************************/ #include "Library.h"//struct t_truct//{// unsigned char sec;// unsigned char min;// unsigned char hor;// unsigned char day;// unsigned char mon;// unsigned int year;// unsigned char week;//};void Delay1us() //@11.0592MHz {unsigned char i;_nop_();_nop_();i = 8;while (--i);}void IIC_start(){SDA = 1;SCL = 1;Delay1us();SDA = 0;Delay1us();SCL = 0;}void IIC_stop(){SCL = 0;SDA = 0;Delay1us();SCL = 1;Delay1us();SDA = 1;Delay1us();}unsigned char IIC_readAck(){unsigned char val;unsigned char mask;SDA = 1;for(mask=0x80;mask!=0;mask>>=1) {Delay1us();SCL = 1;if(SDA)val |= mask;elseval &= ~mask;Delay1us();SCL = 0;}SDA = 0;Delay1us();SCL = 1;Delay1us();SCL= 0;return val;}unsigned char IIC_readNack(){unsigned char val;unsigned char mask;SDA = 1;for(mask=0x80;mask!=0;mask>>=1) {SCL = 1;Delay1us();if(SDA)val |= mask;elseval &= ~mask;SCL = 0;Delay1us();}SDA = 1;Delay1us();SCL = 1;Delay1us();SCL= 0;return val;}bit IIC_write(unsigned char dat) {unsigned char mask;bit ack;for(mask=0x80;mask!=0;mask>>=1) {//Delay1us();if((dat&mask)==0)SDA = 0;elseSDA = 1;Delay1us();SCL = 1;Delay1us();SCL = 0; ////////}SDA = 1;Delay1us();//SCL = 0;SCL = 1;ack = SDA;Delay1us();// SCL = 1;// Delay1us();SCL = 0;return ~ack;}void Read_time(unsigned char addr,unsigned char *tm_buf) { do{IIC_start();if(IIC_write(0xA2))break;IIC_stop();}while(1);IIC_write(addr);IIC_start();//or IIC_stop()IIC_write(0xA3);tm_buf[0] = IIC_readAck();tm_buf[1] = IIC_readAck();tm_buf[2] = IIC_readAck();tm_buf[3] = IIC_readAck();tm_buf[4] = IIC_readAck();tm_buf[5] = IIC_readAck();tm_buf[6] = IIC_readNack();IIC_stop();}void Write_time(unsigned char addr,unsigned char *tm_buf) {do{IIC_start();if(IIC_write(0xA2))break;IIC_stop();}while(1);IIC_write(addr);IIC_write(tm_buf[0]);IIC_write(tm_buf[1]);IIC_write(tm_buf[2]);IIC_write(tm_buf[3]);IIC_write(tm_buf[4]);IIC_write(tm_buf[5]);IIC_write(tm_buf[6]);IIC_stop(); }/**************************************************/4×4键盘程序:#include "Library.h"/**********************************if enter key down 3second ,into time setting mode,else calculator mode**********************************/unsigned char code keycode[4][4]={{0x31,0x32,0x33,0x26},//up{0x34,0x35,0x36,0x28},//down{0x37,0x38,0x39,0x25},//left{0x30,0xC0,0x0D,0x27},//right};unsigned char keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};//bit enter3s;//down 3svoid Key_scan(){static unsigned char keyout = 0;static unsigned char keybuf[4][4]={{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},};unsigned char i;keybuf[keyout][0]=(keybuf[keyout][0]<<1)|keyin_1;keybuf[keyout][1]=(keybuf[keyout][1]<<1)|keyin_2;keybuf[keyout][2]=(keybuf[keyout][2]<<1)|keyin_3;keybuf[keyout][3]=(keybuf[keyout][3]<<1)|keyin_4;for(i=0;i<4;i++){if((keybuf[keyout][i]&0x0F)==0x00){keysta[keyout][i] = 1;}else if((keybuf[keyout][i]&0x0F)==0x0F){keysta[keyout][i] = 0;}}keyout++;keyout &= 0x03;switch(keyout){case 0:keyout_4=1;keyout_1=0;break;case 1:keyout_1=1;keyout_2=0;break;case 2:keyout_2=1;keyout_3=0;break;case 3:keyout_3=1;keyout_4=0;break;default:break;}}void Key_driver(){unsigned char i,j;static unsigned char stabkp[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};for(i=0;i<4;i++){for(j=0;j<4;j++){if(stabkp[i][j]!=keysta[i][j]){if(stabkp[i][j]==0){KeyAction(keycode[i][j]); }}stabkp[i][j] = keysta[i][j]; }}}/**************************************************/ LCD1602程序:#include "Library.h"void LCD1602_rsta(){unsigned char tmp;P0 = 0xFF;//this is a mustrs = 0;rw = 1;do{en = 1;//Delay1us();tmp = P0;//Delay1us();en = 0;}while(tmp&0x80);}void LCD1602_wdat(unsigned char dat){LCD1602_rsta();rs=1;rw=0;P0 = dat;en = 1;//Delay1us();en = 0;}void LCD1602_wcmd(unsigned char cmd){LCD1602_rsta();rs=0;rw=0;P0 = cmd;en = 1;//Delay1us();en = 0;}void Setcursor(unsigned char x,unsigned char y){if(y==0)x = x + 0x00;else if(y==1)x = x + 0x40;LCD1602_wcmd(x|0x80);}void LCD1602_wbyte(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len){Setcursor(x,y);while(buf_len>0){LCD1602_wdat(*buf++); buf_len--;}}void OnCursor(){LCD1602_wcmd(0x0F);}void OffCursor(){LCD1602_wcmd(0x0C);}void LCD1602_init(){// Delay15ms();// LCD1602_wcmd(0x38);// Delay5ms();LCD1602_wcmd(0x38);// LCD1602_wcmd(0x08);LCD1602_wcmd(0x06);LCD1602_wcmd(0x0C);LCD1602_wcmd(0x01);}/**************************************************/Library.h#ifndef _Library_H#define _Library_H#include "STC15.h"#include "intrins.h"#define MAIN_Fosc 11059200L//PCF8563sbit SCL = P1^6;sbit SDA = P1^7;//sbit SDA = P5^3;//sbit SCL = P5^2;void Read_time(unsigned char addr,unsigned char *tm_buf); void Write_time(unsigned char addr,unsigned char *tm_buf); void Delay1us();//4x4Keysbit keyin_1 = P2^7;sbit keyin_2 = P2^6;sbit keyin_3 = P5^3;sbit keyin_4 = P5^2;sbit keyout_1 = P4^7;sbit keyout_2 = P4^6;sbit keyout_3 = P4^5;sbit keyout_4 = P4^4;void Key_driver();void Key_scan();void KeyAction(unsigned char kc);//LCD1602sbit rs = P2^4;sbit rw = P2^3;sbit en = P2^1;void LCD1602_init();void LCD1602_wbyte(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len);void OnCursor();void OffCursor();void Setcursor(unsigned char x,unsigned char y);void LCD1602_wdat(unsigned char dat);#endif。

STC单片机四位数码管时钟程序

STC单片机四位数码管时钟程序

STC单片机四位数码管时钟程序STC单片机四位数码管时钟程序——运行成功了#include#define uint unsigned int#define uchar unsigned charuchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; sbit d1=P1^0;//定义d1sbit d2=P1^7;//定义d1sbit key1=P3^2;//按键定义sbit key2=P3^3;sbit key3=P3^4;sbit key4=P3^5;sbit LED1=P2^3;sbit LED2=P2^2;sbit LED3=P2^1;sbit LED4=P2^0;uchar temp,aa,miaos,miaog,qian,bai,shi,ge,fen,sh,bb,mh;void display(uchar qian,uchar bai,uchar shi,uchar ge);void delay(uint z) //uint z 传递的是延时毫秒的数,比如延时10毫秒则为10 {uint x,y;for(x=z;x>0;x--) //这个循环是毫秒数for(y=110;y>0;y--);//这个循环是1毫秒循环次数}void init();void main(){init();//初始化子程序mh=1;while(1){if(key1==0){delay(200);//延时200ms避开抖动时期while(key1==0);//等待按键释放fen++;if(fen==59){fen=0;}}if(key2==0){delay(200);while(key2==0);if(fen!=0){fen--;}if(fen==0){fen=59;}}if(key3==0){delay(200); while(key3==0); sh++;if(sh==23){sh=0;}}if(key4==0) {delay(200); while(key4==0); if(sh!=0){sh--;}if(sh==0){sh=23;}}if(aa==20){bb++;aa=0;miaog=bb%10; miaos=bb/10%6; mh=~mh;}if(bb==60){fen++;bb=0;}ge=fen%10;shi=fen/10%6;if(fen==60){ sh++;fen=0;fen=0;}bai=sh%10;qian=sh/10;if(bai==10)bai=0;if(qian==2){if(bai==4){qian=0;bai=0;}}if(sh==24){sh=0;}display(qian,bai,shi,ge); }}void display(uchar qian,uchar bai,uchar shi, uchar ge) {LED1=1;P0=table[qian];LED1=0;delay(1);LED1=1;LED2=1;P0=table[bai];LED2=0;delay(1);LED2=1;LED2=1;if(mh==1){P0=0x7F;}else P0=0xFF;LED2=0;delay(3);LED2=1;LED3=1;P0=table[shi];LED3=0;delay(1);LED3=1;LED4=1;P0=table[ge];LED4=0;delay(1);LED4=1;}void init(){d1=1;d2=1;fen=0;sh=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1;void timer0() interrupt 1 {TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++;}。

一个单片机4键控制四个数码管显示的程序或思路

一个单片机4键控制四个数码管显示的程序或思路
/*********************************************************
164串行输出段码:
P4.4 U164CP
P4.5 U164D
138输出位选
P4.3选通138
P4.0对应138A
P4.1对应138A
P4.2对应138A
*********************************************************/
Tags:,单片机,控制,数码
}
&= ~BIT3;
}
首先你要看你的数码管是哪类啊?是共阳极还是共阴极。如果你全部都是亮的话,而且是显示个8字的。那么你控制位选,可以改变数码管的显示个数。如果你想改变数码管显示的数字,就改变段选吧。其实你这个一接电源就亮着是有原因的,你接上电源时,单片机的输出端口P0,P1,P2,P3都是复位的。除了P0口外,其他都处于高电平输出。当然,你的板子上也是肯定有个反相器,使高电平变成低电平。例如你刚上电,单片机复位,你的单片机先是P1口输出高电平到数码管的段选,然后P2口输出高电平到反相器,然后再输出低电平到数码管的位选。这样数码管就亮着啦。(我举例的数码管是共阴极的)
[单片机][控制][数码ห้องสมุดไป่ตู้求一个单片机4键控制四个数码管显示的程序或思路
应该是P2.0-P2.3控制四个位选码 P2.0-P2.78个段选码
使用两个74HC573 锁存器 并另外用两个端口入P1.0 P1.1分别控制段选使能和位选使能 1^0 1^1 写程序时,先开位选dula=1 再送数P2=0xxx 关段选dula=0 位选操作如上
)
{
=0,j=0;
=0x0,=0;

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;}/******************************************************************************************* ***//*************************************************************/*************************************************************/。

c51单片机外接四个数码管时钟显示汇编

c51单片机外接四个数码管时钟显示汇编

;p0端口接数码显示p0.0-a.....p0.7-h;p1.0-p1.3接位选p1.0-第4个数码管.....p1.3-第1个;p2.0-p2.3接列...p2.4-p2.6接行qq equ 26hqq1 equ 28hx equ 30Hy equ 32Hz0 equ 34H ;数码显示最高位z1 equ 36H ; 数码显示次高位key equ P2 ;键盘控制key1 equ p3.2 ;时分调整控制键org 0000hajmp mainorg 000bhljmp td0org 0100hmain:mov tmod,#01h ;初始化mov tl0,0b0hmov th0,3chsetb easetb et0mov r0,#00mov r1,#00mov r2,#00mov r3,#00mov r4,#00mov r5,#00mov r6,#00mov r7,#00mov x,#00mov y,#00mov z0,#00mov z1,#00mov dptr,#tabsetb tr0;---------------------------------------main1:call a1 ;判断是否有键按下,,jz main2 ;无键按下,跳main2,call b1 ;有键按下,扫描按键确定哪一个被按下,call c0 ;把对应按键设置键码,main2:jnb key1,guangljmp main4guang:call delayjnb key1,guang1ljmp main4guang1:inc r7jnb key1,$main4:call xianshicjne r0,#20,main1 ;一秒定时mov r0,#00cpl p3.0inc r5cjne r5,#60,main1 ;秒mov r5,#00inc r1cjne r1,#10,main1 ;分个位mov r1,#00inc r2cjne r2,#6,main1 ;分十位mov r2,#00inc r3cjne r6,#1,main3cjne r3,#2,main1 ;时十位mov r3,#00mov r4,#00ljmp main1main3:cjne r3,#10,main1 ;时个位mov r3,#00inc r4inc r6ljmp main1 ;主程序循环;----------------------------------------------------- a1:mov key,#0fH ;判断键按下mov a ,keyanl a ,#0fhcjne a,#0fh,a2 ;有键按下跳转mov a,#0 ;无键按下跳转a2:retb1:mov b,#7fh ;判断哪一个键b2:mov a,brr amov b,amov p2,amov a,p2 ;依次判断哪一行anl a,#0fhcjne a,#0fh,B3ajmp b2b3:mov a,key ;把P1的值移出retc0:mov b,key ;处理行数据从下往上为X1,X2,X3.mov a,keyanl a,#0f0hc1:cjne a,#0e0h,c2mov x,#1c2:cjne a,#0d0h,c3mov x,#2c3:cjne a,#0b0h,d0mov x,#3d0:mov a,B ;处理列数据从右往左为Y1,Y2,Y3,Y4 anl a,#0fhd1:cjne a,#0eh,d2mov y,#1d2:cjne a,#0dh,d3mov y,#2d3:cjne a,#0bh,d4mov y,#3d4:cjne a,#7h ,e1mov y,#4e1:dec x ;键码设置mov a,xmov b,#4mul abadd a,yclr cycjne a,#10,e2e2:jc e3mov b,#10div abmov z0,amov z1,bajmp e4e3:mov z0,acjne r7,#0,dier ;当r7=0时调分针个位mov r1,z0dier:cjne r7,#1,dier1 ;当r7=1时调分针十位mov r2,z0dier1:cjne r7,#2,dier2 ;当r7=2时调时针个位mov r3,z0dier2:cjne r7,#3,dier3 ;当r7=3时调时针十位mov r4,z0dier3:cjne r7,#4,e4mov r7,#00e4:ret; --------------------------------------------------------------------- xianshi:clr p1.3 ;第一个数码管显示mov a,r4movc a,@a+dptrmov p0,acall delaysetb p1.3mov dptr,#tab1 ;第二个数码管显示clr p1.2mov a,r3movc a,@a+dptrmov p0,acall delaysetb p1.2mov dptr,#tab ;第三个数码管显示clr p1.1mov a,r2movc a,@a+dptrmov p0,acall delaysetb p1.1clr p1.0 ;第四个数码管显示mov a,r1movc a,@a+dptrmov p0,acall delaysetb p1.0ret; -------------------------------------------------------- delay: ;延时程序mov qq,#10mov qq1,#10del:djnz qq,deldjnz qq1,delret;定时中断td0:inc r0mov tl0,0b0hmov th0,3chretitab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h tab1: db 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h end。

用STC系列单片机制作四位可预置计时器

用STC系列单片机制作四位可预置计时器

⽤STC系列单⽚机制作四位可预置计时器⽤STC系列单⽚机制作四位可预置计时器_⽤UM5140X计时器电路改装#:当使⽤的EEPROM起始地址不是C2~C7的IC时请到STC_EEPROM.h⽂件中注释#define EEPROM_C2_C7这⾏宏定义功能:具有⼆个按键,四位红⾊共阳极数码显⽰P3.6长按 = 模式键、短按 = 移位、保存P3.7长按 = 开始键、短按 = 加数、停⽌计时具有正、倒;计分或计秒预设选择具有预约、倒计时;开机功能分别输出⼀个1S低电平信号和⼀个长通低电平信号使⽤说明:A: 上电前若P1.0对地则为倒计秒//P1.1对地则为倒计分//其它状态组合未定义,建议不使⽤。

1: 长按P3.6⼝开关则先重新调出存在eeprom在的计时停⽌计时显⽰P***且第⼀个*以125ms闪烁此时若依次短按P3.6⼝开关则移向下⼀位闪烁,在该位闪烁若短按P3.7⼝的开关则此位加1。

当第三个*闪烁时如果再短按⼀次P3.6⼝开关则保存此次设定值并退出设置状态,显⽰***。

若在闪烁10s内没有新键按下则⾃动退出设置状态并不保存此次设定值,显⽰***。

2: 长按P3.7⼝开关则开始计时显⽰***且最后⼀个dp点闪烁,在计时器运⾏中若短按P3.7⼝开关则停⽌计时,10s内没有新键按下则⾃动重载预设值,显⽰***。

3: 当时间从预设值倒计到 000 时停⽌倒计时且P1^2⼝输出1S低电平信号(后⾃动变⾼)、P1.3⼝长通低电平信号(短按P3.7⼝开关可关闭),10s后⾃动重载预设值。

程序设计:LBQ691477940 2018-03-10升级记录:增加上电⾃动选择设置正计时与倒计时的初步程序编写。

2018-3-11 23:08P1.0 & P1.1 对地时为倒计秒P1.0 对地时为倒计分P1.1 对地时为正计秒P1.0 & P1.1 不接时为正计分 2018-3-11 09:331. /*********************************************************************/2. #include3. #include4. #include5. #define nop _nop_()6. #define uint unsigned int7. #define uchar unsigned char8. #define ulong unsigned long9. #define SBI(Y,X) Y |= (1 << X) //让Y的X位置110. #define CBI(Y,X) Y &= ~(1 << X) //让Y的X位清011. #define set_key P1 //定义键盘⼝12. #define KEY P3 //定义键盘⼝13. #define set_djm 0x00 //P1.0 & P1.1 对地时为倒计秒14. #define set_zjm 0x01 //P1.0 对地时为倒计分15. #define set_djf 0x02 //P1.1 对地时为正计秒16. //#define set_zjf 0x03 //P1.0 & P1.1 不接时为正计分17. sbit P1_4 = P1^4; //位驱动18. sbit P1_5 = P1^5; //位驱动19. sbit P1_6 = P1^6; //位驱动20. sbit P1_7 = P1^7; //位驱动21. sbit OUT1S = P1^2; //到时间后输出约1S低电平24. sbit sw_mode = P3^6; //长按为模式键、短按移位25. sbit sw_strat = P3^7; //长按为开始键、短按加数26. bit DPP = 0, g_shi = 0,up_dn; //闪烁标志位、千位是否显⽰标志位、正计时与倒计时标志位为1时倒计。

4位单片机数字钟电子钟制作

4位单片机数字钟电子钟制作

1
PCB
专用 PCB
1
21
4 位数字电子钟调试说明
代码(冒号左边两 位,按 S1 加 1)
功能名称
01秒显示与调整
调位试,内按容S(2 加冒号1)右边两说明
按 S2 秒加 1
可以作为秒表使用
02走时分钟调整
走时分钟调整
03走时小时调整
走时小时调整
走时小时调整
04整点报时设置调整
05时间快慢调整 06第 1 路闹铃分钟调整 07第 1 路闹铃小时调整 08第 2 路闹铃分钟调整 09第 2 路闹铃小时调整
元件清单如下:
元件名称
规格型号
瓷片电容
30P
瓷片电容
104
电解电容
10uF/16-50V
电解电容
220uF/10V
四位绿色阴数码管 ORS-5463BG
20P IC 座
DIP 20
写入程序的芯片 STC11F02
12mm 电磁无源蜂鸣

12RT04CC
9P 排阻
200-
0 为所有整点报时,1
为 7-22 点报时,2 为
不整点报时
有 1-5 档,默认 2 档,
数字越大走时越快
第 1 路闹铃分钟显示
并设定
第 1 路闹铃小时显示
并设定
第 2 路闹铃分钟显示
并设定
第 2 路闹铃小时显示 并设定
此状态后进入正常走时
1/4W 电阻
10K
编号 C1, C2 C5 C3 C4 DS IC1 IC1
数量 2 1 1 1 1 1 1
LS1
1
PR1
1
Q1
1
R1, R2, R3, 4 R4

基于定时器的四位数码管时钟程序代码

基于定时器的四位数码管时钟程序代码

实验名称:SUMA & BUZZER实验描述:一个带有闹钟的数码时钟,加三个键,一个调小时键一个调分钟键,一个设置闹钟时间键实验方法:TIMER0中断用来计时,控制数码时钟的时间显示还可设置半秒或四分之一秒,用来控制音调TIMER1用来控制音普,,timer0用MODE2自动加载模式*/# include<reg52.h>sbit speaker=P2^3 ;sbit AA=P2^2 ; //调时用sbit BB=P2^1 ; //调分用sbit CC=P2^0 ; // 设置闹钟用sbit P1_7=P1^7; //小数点// int code seven_reg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0123456789int code seven_reg[]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x00,0x10};// int code scan[]={0x1F,0x2F,0x4F,0x8F}; //1110,1101,1011,0111int code scan[]={0x1,0x2,0x4,0x8}; //0001,0010,0100,1000unsigned int timer0_times;unsigned int timer1_times;unsigned int timer0_times_AA; //按纽AA用unsigned int timer0_times_BB; //按纽BB用unsigned int timer0_times_CC; // 半秒计时用unsigned int timer0_times_DD; //四分之一秒用unsigned int timer0_times_EE; // 闹钟用typedef struct{unsigned char second;unsigned char minute;unsigned char hour;unsigned char half_second;unsigned char alarm_hour;unsigned char alarm_minute;unsigned char quarter_second ;} time; //此处是固定格式,不能改time now;char mode=0;int i=0,j=0,k=0;int code tone[]={1012,956,852,759,716,638,568,506,478,426,379};//7()低音)1234567(中音)123(高音)int code song[22][2]={ {6,2},{6,2},{7,4},{6,2},{6,2}, {7,4},{6,2},{7,2},{8,2},{7,2},{6,2},{7,1},{6,1},{4,4},{3,2},{1,2},{3,2},{4,2},{3,2},{3,1},{1,1},{0,4}} ;/********************************************************************/void timer1_isr() interrupt TF1_VECTOR using 2{ TR1=0;TL1=(65536-tone[(song[j][0])])%256;TH1=(65536-tone[(song[j][0])])/256;TR1=1;speaker=~speaker;}/*******************************************************************/void timer0_isr() interrupt TF0_VECTOR using 1{/***************************************************/if(CC!=0) timer0_times_EE=0;else{ timer0_times_EE++;if(CC==0&&timer0_times_EE==4000) //按1S进入设置闹钟模式{mode++;//500 ~0.125sif(mode==2) mode=0;}}/**=调时键设置=*/if(AA!=0) timer0_times_AA=0;else{ timer0_times_AA++;if(AA==0&&timer0_times_AA==500&&mode==0)//500*0.25ms=0.125s{ now.hour++;// timer0_times_AA=0;if (now.hour==24) now.hour=0;//后边代码不会达到此效果}if(AA==0&timer0_times_AA==500&&mode==1) //设置闹钟时间HOUR{ now.alarm_hour++;if(now.alarm_hour==24) now.alarm_hour=0;}}/***=调分键设置=***/if (BB!=0) timer0_times_BB=0;else{ timer0_times_BB++;if(BB==0&&timer0_times_BB==500&&mode==0) //0.125s{ //timer0_times_BB=0;now.minute++;if(now.minute==60) now.minute=0;}if(BB==0&&mode==0){ if(timer0_times_BB==2000) //0.5s{ now.minute++;timer0_times_BB=1000;if(now.minute==60) now.minute=0;}}if(BB==0&&timer0_times_BB==500&&mode==1) //设置闹钟时间MINUTE { now.alarm_minute++;if(now.alarm_minute==60) now.alarm_minute=0;}if(BB==0&&mode==1){ if(timer0_times_BB==2000) //0.5s{ now.alarm_minute++;timer0_times_BB=1000;if(now.minute==60) now.minute=0;}}}/*=自然时间设置=*/timer0_times_DD++; //四分之一秒if(timer0_times_DD==1000){ now.quarter_second++;timer0_times_DD=0;if(now.quarter_second==60) now.quarter_second=0;} //二分之timer0_times_CC++;if(timer0_times_CC==2000){now.half_second++;timer0_times_CC=0;if(now.half_second==60) now.half_second=0;}timer0_times++; //一秒一分一时if (timer0_times==4000){ now.second++;timer0_times=0;if(now.second==60){ now.minute++;now.second=0;if(now.minute==60){ now.hour++;now.minute=0;if(now.hour==24) now.hour=0;} } }/******************扫描显示******************************/switch(mode){case 0 :{switch(i){ /*0.005秒选一次*/ case 0:P1=seven_reg[now.minute%10] ;if(now.half_second%2==0)P1_7=1; /*实现让它0.5秒闪一次*/break;case 1:P1=seven_reg[now.minute/10];//小数点不亮同,P1_7=1if(now.half_second%2==0)P1_7=1; /*为什么不能放在上一句前面昵????*/ break;case 2:P1=seven_reg[now.hour %10];break;case 3:P1=seven_reg[now.hour /10];break;}} break;case 1:{switch(i){case 0:P1=seven_reg[now.alarm_minute%10] ;break;case 1:P1=seven_reg[now.alarm_minute/10];break;case 2: P1=seven_reg[now.alarm_hour %10];break;case 3: P1=seven_reg[now.alarm_hour /10];break; }} break;}P3=scan[i];i++;if (i==4) i=0;if(now.quarter_second%2==0){ k++;if(k==(song[j][1]*4)){ j++;k=0;if(j==22) j=0;} } }/****************************************************************/void timer0_initialize(){ EA=0;TR0=0;TMOD=0X12;TL0=(256-250); //0.025ms 自动加载模式0.025*4000=1sTH0=(256-250);ET0=1;TR0=1;EA=1;}void timer1_initialize(){TR1=0;TL1=(65536-tone[song[j][0]])%256;TH1=(65536-tone[song[j][0]])/256;TMOD=0X12;ET1=1;}main(){ unsigned char m1=0;speaker=0;now.alarm_minute=1;timer0_initialize();timer1_initialize();while(1){if(now.alarm_minute!=0)//将闹钟设置为0时,相当于取消闹钟,不会响{ if(now.hour==now.alarm_hour&&now.minute==now.alarm_minute) { if(CC==0&&timer0_times_EE==500) m1=1;switch (m1){ case 0:TR1=1 ;break;case 1 :TR1=0;speaker=0;break;}}else{TR1=0;speaker=0;m1=0;} } } }#include<reg52.h>sbit P10=P1^0; //第0位数码管sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;#define THCO 0xee#define THLO 0x00unsigned char miao=0,fen=0,shi=0;unsigned char code duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; main(void){TMOD=0x11;TH0=THCO;TL0=THLO;EA=1;ET0=1;TR0=1;while(1);}void timw0() interrupt 1{static unsigned char c=0,k=0;TH0=THCO;TL0=THLO;P1|=0xff;c++;if(c>200) {miao++;if(miao>=60){miao=0;fen++;}if(fen>=60){shi++;fen=0;}c=0;}if(k>3){k=0;}k++;switch(k-1){case(0):P10=0;P0=duan[shi/10];break;case(1):P11=0;P0=duan[shi%10];break;case(2):P12=0;P0=duan[fen/10];break;case(3):P13=0;P0=duan[fen%10];break;}}这是时钟程序,可以运行,无小数点,显示时分,小数点断码是0x80,其余的只有靠你自己了。

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

STC单片机四位数码管时钟程序
——运行成功了
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; sbit d1=P1^0;//定义d1
sbit d2=P1^7;//定义d1
sbit key1=P3^2;//按键定义
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;
sbit LED1=P2^3;
sbit LED2=P2^2;
sbit LED3=P2^1;
sbit LED4=P2^0;
uchar temp,aa,miaos,miaog,qian,bai,shi,ge,fen,sh,bb,mh;
void display(uchar qian,uchar bai,uchar shi,
uchar ge);
void delay(uint z) //uint z 传递的是延时毫秒的数,比如延时10毫秒则为10 {
uint x,y;
for(x=z;x>0;x--) //这个循环是毫秒数
for(y=110;y>0;y--);//这个循环是1毫秒循环次数
}
void init();
void main()
{
init();//初始化子程序
mh=1;
while(1)
{
if(key1==0)
{
delay(200);//延时200ms避开抖动时期
while(key1==0);//等待按键释放
fen++;
if(fen==59)
{
fen=0;
}
}
if(key2==0)
{
delay(200);
while(key2==0);
if(fen!=0)
{
fen--;
}
if(fen==0)
{
fen=59;
}
}
if(key3==0)
{
delay(200);
while(key3==0);
sh++;
if(sh==23)
{
sh=0;
}
}
if(key4==0)
{
delay(200);
while(key4==0);
if(sh!=0)
{
sh--;
}
if(sh==0)
{
sh=23;
}
}
if(aa==20)
{
bb++;
aa=0;
miaog=bb%10;
miaos=bb/10%6;
mh=~mh;
}
if(bb==60)
{
fen++;
bb=0;
}
ge=fen%10;
shi=fen/10%6;
if(fen==60)
{ sh++;
fen=0;
fen=0;
}
bai=sh%10;
qian=sh/10;
if(bai==10)
bai=0;
if(qian==2)
{
if(bai==4)
{
qian=0;
bai=0;
}
}
if(sh==24)
{
sh=0;
}
display(qian,bai,shi,ge);
}
}
void display(uchar qian,uchar bai,uchar shi, uchar ge)
{
LED1=1;
P0=table[qian];
LED1=0;
delay(1);
LED1=1;
LED2=1;
P0=table[bai];
LED2=0;
delay(1);
LED2=1;
LED2=1;
if(mh==1)
{
P0=0x7F;
}
else P0=0xFF;
LED2=0;
delay(3);
LED2=1;
LED3=1;
P0=table[shi];
LED3=0;
delay(1);
LED3=1;
LED4=1;
P0=table[ge];
LED4=0;
delay(1);
LED4=1;
}
void init()
{
d1=1;
d2=1;
fen=0;
sh=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}。

相关文档
最新文档