已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
时时钟-闹钟-智能控制程序/*-时钟_闹钟_智能控制(C程序)* 定时器T0中断服务中产生时钟数据* 用动态扫描显示8个数码管。* P0口接七段数码管的段码,P2.2、P2.3、P2.4口接数码管的位控制码。* 按键接在P1口,按下按键,对应的端口位就是0.* 采用多功能按键设计,A、B个按键调节功能代码,选择要调节的参数;C、D按键循环调节选中的参数的值。* 闹铃声音信号从P1.5口输出;时间控制接口从P1.6输出,控制指示灯接P3.7口。-*/#include #define uint unsigned int#define uchar unsigned charchar hour,min,sec,flag,num0,num;uchar c1_hour,c1_min;uchar cont1_sh,cont1_sm;uchar cont1_eh,cont1_em;sbit sound=P15;sbit cont_led=P37;sbit control=P16;sbit key_a=P10;sbit key_b=P11;sbit key_c=P12;sbit key_d=P13;uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xbf;void delayms(uint xms) /延时xms uint i,j; for(i=xms;i0;i-) for(j=120;j0;j-);void init() hour=13; min=31; sec=30; c1_hour=12; c1_min=33; cont1_sh=12; cont1_sm=32; cont1_eh=12; cont1_em=33; TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256;/ TH1=(65536-5000)/256;/ TL1=(65536-5000)%256; EA=1; ET0=1;/ ET1=1; TR0=1;/ TR1=1;void display(uchar num,uchar dat) P0=tabledat;/P0口为段码接口 P2=0xe3+4*num;/74ls138输出端作为位码接口 delayms(2);void dis_time() uchar i; i=hour/10; display(0,i); i=hour%10; display(1,i); display(2,27); i=min/10; display(3,i); i=min%10; display(4,i); display(5,27); i=sec/10; display(6,i); i=sec%10; display(7,i);void dis_adj(uchar sj1,uchar sj2,uchar sj3 ) uchar t; display(0,26); t=sj1/10; display(1,t); t=sj1%10; display(2,t); display(3,27); t=sj2/10; display(4,t); t=sj2%10; display(5,t+10); t=sj3/10; display(6,t); t=sj3%10; display(7,t);void dis_all() switch(flag) case 0: dis_time();break;case 1: case 2: dis_adj(flag,hour,min);break;case 3: case 4: dis_adj(flag,c1_hour,c1_min);break;case 5: case 6: dis_adj(flag,cont1_sh,cont1_sm);break;case 7: case 8: dis_adj(flag,cont1_eh,cont1_em);break; void t_control() if(!flag) if(c1_hour=hour)&(c1_min=min) sound=0; if(min=c1_min+1)&(c1_hour=hour) sound=1;if(cont1_sh=hour)&(cont1_sm=min) cont_led=0;control=0; if(cont1_eh=hour)&(cont1_em=min) cont_led=1;control=1; /*-A键处理:调节功能标志flag循环增加-*/void key_scan() if(key_a=0) delayms(10); if(key_a=0) flag+; if(flag=1|flag=2) TR0=0; else TR0=1; if(flag=9) flag=0;/ while(!key_a); /*-B键处理:调节功能标志flag循环减少-*/ if(key_b=0) delayms(10); if(key_b=0) flag-; if(flag=1|flag=2) TR0=0; else TR0=1; if(flag=-1) flag=8; /while(!key_b); /*-C键处理:根据功能标志flag的值进行判断 调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的增加-*/ if(key_c=0) delayms(10); if(key_c=0) if(flag=1) hour+; if(hour=24) hour=0; if(flag=2) min+; if(min=60) min=0; if(flag=3) c1_hour+; if(c1_hour=24) c1_hour=0; if(flag=4) c1_min+; if(c1_min=60) c1_min=0; if(flag=5) cont1_sh+; if(cont1_sh=24) cont1_sh=0; if(flag=6) cont1_sm+; if(cont1_sm=60) cont1_sm=0; if(flag=7) cont1_eh+; if(cont1_eh=24) cont1_eh=0; if(flag=8) cont1_em+; if(cont1_em=60) cont1_em=0; / while(!key_c); /*-D键处理:根据功能标志flag的值进行判断 调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的减少-*/ if(key_d=0) delayms(10); if(key_d=0) if(flag=1) if(hour=0) hour=23; else hour-; if(flag=2) if(min=0) min=59; else min-; if(flag=3) if(c1_hour=0) c1_hour=23; else c1_hour-; if(flag=4) if(c1_min=0) c1_min=59; else c1_min-; if(flag=5) if(cont1_sh=0) cont1_sh=23; else cont1_sh-; if(flag=6) if(cont1_sm=0) cont1_sm=59; else cont1_sm-; if(flag=7) if(cont1_eh=0) cont1_eh=23; else cont1_eh-; if(flag=8) if(cont1_em=0) cont1_em=59; elsecont1_em-; / while(!key_d); void timer0() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; num0+; if(num0=20) num0=0; sec+; if(sec=60) sec=0; min+; if(min=60) min=0; hour+; if(hour=24) hour=0; /void timer1() interrupt 3/ / TH1=(65536-5000)/256;/ TL1=(65536-5000)%256;/ key_scan(); / void main() init(); while(1) dis_all(); num+; if(num8) num=0; key_scan(); t_control(); ;-; 时钟_闹钟_智能控制(汇编程序):; 定时器T0中断服务中产生时钟数据.; 在定时器T1中断服务程序中动态显示8个数码管。; P0口接七段数码管的段码,P2.2、P2.3、P2.4口接数码管的位控制码。; 按键接在P1口,按下按键,对应的端口位就是0.; 采用多功能按键设计,A、B个按键调节功能代码,选择要调节的参数;C、D按键循环调节选中的参数的值。; 闹铃声音信号从P1.5口输出;时间控制接口从P1.6输出,控制指示灯接P3.7口。;-;定义变量名称 flag equ 20h ;功能单元 hour EQU30H ;时间单元 min EQU31H sec EQU32H MS EQU 2FH c1_hour equ 50h ;闹铃1的小时 c1_min equ 51h ;闹铃1的分钟 cont1_sh equ 52h ;时段1起控小时单元 cont1_sm equ 53h ;时段1起控分钟单元 cont1_eh equ 54h ;时段1终控小时 cont1_em equ 55h ;时段1终控分钟 W1 EQU33H ;显示数码管的第1位 W2 EQU34H ;显示数码管的第2位 37H;实验板用37H W3 EQU35H ;显示数码管的第3位 W4 EQU36H ; 39H;实验板用39H W5 EQU37H ; 34H;实验板用36H W6 EQU38H W7 EQU39H ; 36H;实验板用36H W8 EQU3AH ;显示数码管的第8位 SJ1 EQU 3BH ;中间数据 SJ2 EQU 3CH SJ3 EQU 3DH LED1 EQU40H LED2 EQU41H LED3 EQU42H LED4 EQU43H LED5 EQU44H LED6 EQU45H LED7 EQU46H LED8 EQU47H soud equ p1.5 ;闹铃声音输出端口 control equ p3.1 ;控制输出端口 con_led equ p3.4 ;控制输出指示灯 ORG 0000H LJMP MAIN ORG 000BH LJMP CREATE_DATA ;定时器T0中断处理,完成时间基准产生与时间、日期处理。 ORG 001BH LJMP DISPLAY ;定时器T1中断处理,完成动态显示功能。 ORG 0030HMAIN: LCALL INITIAIL ;初始化程序模块MM0: LCALL CHANGE_DATA ;数据转换模块 LCALL CHANGE_DIS ;显示段码转换模块 LCALL KEY ;按键处理模块 LCALL T_CONTROL ;功能控制模块 LJMP MM0;-;初始化程序模块;-INITIAIL: MOV SP, #68H ;设置堆栈指针为68H。 MOV flag,#0 MOV hour,#12 ;设置要小时初始值为23 MOV min, #31 ;设置要分钟初始值为56 MOV sec, #56 ;设置要秒初始值值为28 MOV MS,#8 MOV c1_hour,#12 ;闹铃1的小时,初始状态设置为24,关闭闹钟。 MOV c1_min, #32 ;闹铃1的分钟 MOV cont1_sh,#12 ;时段1起控小时单元,初始状态关闭。 MOV cont1_sm,#33 ;时段1起控分钟单元 MOV cont1_eh,#12 ;时段1终控小时,初始状态关闭。 MOV cont1_em,#34 ;时段1终控分钟 MOV IE,#8AH ;开中断,开定时器T1,T0中断 MOV IP,#02H ;置T0为最高优先级,T1为最低 MOV TMOD,#11H ;T0、T1为定时方式1 MOV TH0,#3CH ;定时50ms初始值,校正后是460AH MOV TL0,#0B0H MOV TH1,#0F8H ;定时2ms初始值 MOV TL1,#30H SETB TR0 ;启动定时器T0 SETB TR1 ;启动定时器T1 RET;-;T0中断服务程序;产生时钟数据;产生秒钟、分钟和小时数据;-CREATE_DATA: PUSH Acc ;累加器ACC入栈,在中断服务中用到A,保护A的值。 PUSH PSW MOV TH0,#46H ;定时50ms初始值的计算值是3CE8H,由于有中断过程时间消耗、 MOV TL0,#0Ah ;晶体频率不准等原因,校正后的初值是460AH MOV A,MS CJNE A, #20,MS_INC ;毫秒MS不是20,去毫秒增一。 MOV MS,#00 ; 毫秒MS是20,毫秒单元清0. MOV A,sec CJNE A, #59,SEC_INC ; 秒S EC不是59,去秒增一 MOV sec, #0 ; 秒SEC是59,秒单元清0. MOV A,min CJNE A, #59,MIN_INC ;分MIN不是59,去分增一。 MOV min,#0 ;分MIN是59,分单元清0. MOV A,hour CJNE A, #23,HOUR_INC ;小时HOUR不是23,去分增一。 MOV hour, #00 ;小时是23,小时单元清0 JMP CREATE_RET ;返回MS_INC: INC MS ;毫秒增1 JMP CREATE_RET ;SEC_INC: INC sec ;秒增1 JMP CREATE_RET ;MIN_INC: INC min ;分增1 JMP CREATE_RETHOUR_INC: INC hour ;小时增1CREATE_RET: POP PSW POP ACC ;出栈,恢复A的值。 RETI ;返回;-;数据转换模块;将数据转换为十位和个位。转换结果保存到显示内容保存区。;-CHANGE_DIS: MOV A,flagCC0: CJNE A,#0,CC1 ;正常显示时间 MOV SJ1,hour MOV SJ2,min MOV SJ3,sec LJMP CCDCC1: CJNE A,#1,CC2 ;显示调节小时-分钟CC10H: MOV SJ1,flag MOV SJ2,hour MOV SJ3,min LJMP CCTCC2: CJNE A,#2,CC3 JMP CC10HCC3: CJNE A,#3,CC4 ;显示调节的闹铃1的小时-分钟CC30: MOV SJ1,flag MOV SJ2,c1_hour MOV SJ3,c1_min LJMP CCTCC4: CJNE A,#4,CC5 JMP CC30CC5: CJNE A,#5,CC6 ;显示时段1起控时间CC50: MOV SJ1,flag MOV SJ2,cont1_sh MOV SJ3,cont1_sm LJMP CCTCC6: CJNE A,#6,CC7 JMP CC50CC7: CJNE A,#7,CC8 ;显示时段1终控时间CC70: MOV SJ1,flag MOV SJ2,cont1_eh MOV SJ3,cont1_em LJMP CCTCC8: CJNE A,#8,CC14 JMP CC70CC14: RET;正常工作时的显示:小时-分钟-小时CCD: MOV A,SJ1 ;小时转换个位和十位 MOV B,#10 DIV AB MOV W1,A ;保存小时十位 MOV W2,B ;保存小时个位 MOV W3,#20 ;横杆1的代码 MOV A,SJ2 ;分转换个位和十位 MOV B,#10 DIV AB MOV W4,A ;保存分的十位 MOV W5, B ;保存分的个位 MOV W6,#20 ;横杆2的代码 MOV A,SJ3 ;秒小时转换个位和十位 MOV B,#10 DIV AB MOV W7,A ;保存秒的十位 MOV W8, B ;保存秒的个位 RET ;调节参数时的显示模式:P参数代码_小时.分钟CCT: MOV W1,#18 ;调节状态下,第1位显示P. MOV A,SJ1 ;flag调节参数转换个位和十位 MOV B,#10 DIV AB MOV W2,A ;保存参数十位 MOV W3, B ;保存参数个位 MOV W4,#20 ;横杆2的代码 MOV A,SJ2 ;分转换个位和十位 MOV B,#10 DIV AB MOV W5,A ;保存分的十位 MOV W6, B ;保存分的个位 MOV A,SJ3 ;秒转换个位和十位 MOV B,#10 DIV AB MOV W7,A ;保存秒的十位 MOV W8, B RET;-;数据转换模块;将要显示的数据转换为共阳极显示段码,保存到显示段码区保存 ;显示内容转换为显示段码;-CHANGE_DATA: MOV DPTR, #DISCODE ;设置显示段码表的表头指针 MOV R2, #8 ;用R2做循环计数器,8个数码管显示8次为初始值 MOV R1, #33H ;设置数据指针,指向要显示的第1个数 MOV R0, #40H ;设置显示段码区指针,CD0: MOV A, R1 ;取显示数据 MOVC A, A+DPTR ;查表,获取共阳极数码管显示代码 MOV R0, A ;显示段码送LED代码区保存 INC R1 INC R0 DJNZ R2,CD0 ;8位转换没有完毕,跳转到DD0,完毕返回。 MOV A,flag CJNE A,#0,CD1 ;当flag为非0时,LED6显示小数点。 RET ;当flag为0时,LED6不显示小数点。CD1: ;MOV A,LED6 ;取LED6的共阳极显示代码 ANL LED6,#7FH ;将LED6的共阳极显示代码的最高位置0,点亮小数点 ;MOV LED6,A RET;-;T1中断,完成显示功能;在T1中断服务程序中进行显示,显示很稳定。;每2ms中断一次,每次中断显示一个位的数字,8次一个循环。;-DISPLAY: SETB RS0 ;修改寄存器区。在中断服务中用区1的寄存器,保护区0的寄存器不受影响。 MOV TH1,#0F8H ;定时2ms初始值 MOV TL1,#30H CJNE R4,#8,DISP0 MOV R4, #0 ;用R4做循环计数器,8个数码管显示8次为初始值 MOV R3, #11100011B ;用R3做为显示位码指针,设置指向第1位LED ;MOV R3, #11111000B ;实验板的位码初始值 MOV R1, #40H ;设置数据指针,指向要显示的第1个数DISP0: MOV P0, R1 ;取显示代码数据,送接在端口P0的数码管 MOV P2, R3 ;送显示位码 INC R1 ;修改数据指针,指向下一个要显示的数据 INC R4 ;修改显示位数指针,下次中断显示下一个位 INC R3 ;增4,修改显示位码,指向下一个要显示的位 INC R3 INC R3 INC R3 CLR RS0 ;恢复寄存器区0。 RETI;-;按键处理模块;-KEY: MOV A,P1 ;读键盘 CPL A ANL A,#0FH;A键处理:调节功能标志flag循环增加KEY1: CJNE A,#01H,KEY2 MOV A,flag CJNE A,#08,KEY11 MOV flag,#0 LJMP KEYEKEY11:INC flag LJMP KEYE;B键处理:调节功能标志flag循环减少KEY2: CJNE A,#02H,KEY3 MOV A,flag CJNE A,#0,KEY21 MOV flag,#08 LJMP KEYEKEY21:DEC flag LJMP KEYE;-;C键处理:根据功能标志flag的值进行判断;调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的循环增加;-;时钟-小时、分钟循环增加调节KEY3: CJNE A,#04H,KEY400 MOV A,flag CJNE A,#1,KEY32 MOV A,hour CJNE A,#23,KEY311 MOV hour,#00 LJMP KEYEKEY311:INC hour LJMP KEYEKEY400:LJMP KEY4KEY32:CJNE A,#2,KEY33 MOV A,min CJNE A,#59,KEY321 MOV min,#00 LJMP KEYEKEY321:INC min LJMP KEYE;闹钟1-小时、分钟循环增加调节KEY33:CJNE A,#3,KEY34 MOV A,c1_hour CJNE A,#23,KEY331 MOV c1_hour,#00 LJMP KEYEKEY331:INC c1_hour LJMP KEYEKEY34:CJNE A,#4,KEY35 MOV A,c1_min CJNE A,#59,KEY341 MOV c1_min,#00 LJMP KEYEKEY341:INC c1_min LJMP KEYE;时段1起始控制-小时、分钟循环增加调节KEY35:CJNE A,#5,KEY36 MOV A,cont1_sh CJNE A,#23,KEY351 MOV cont1_sh,#00 LJMP KEYEKEY351:INC cont1_sh LJMP KEYEKEY36:CJNE A,#6,KEY37 MOV A,cont1_sm CJNE A,#59,KEY361 MOV cont1_sm,#00 LJMP KEYEKEY361:INC cont1_sm LJMP KEYE;时段1终止控制-小时、分钟循环增加调节KEY37:CJNE A,#7,KEY38 MOV A,cont1_eh CJNE A,#23,KEY371 MOV cont1_eh,#00 LJMP KEYEKEY371:INC cont1_eh LJMP KEYEKEY38:CJNE A,#8,KEY111 MOV A,cont1_em CJNE A,#59,KEY381 MOV cont1_em,#00KEY111:LJMP KEYEKEY381:INC cont1_em LJMP KEYE;-;D键处理:根据功能标志flag的值进行判断;调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的循环减少;-;时钟-小时、分钟循环减少调节KEY4: CJNE A,#08H,KEY222 MOV A,flag CJNE A,#1,KEY42 MOV A,hour CJNE A,#0,KEY411 MOV hour,#23KEY222:LJMP KEYEKEY411:DEC hour LJMP KEYEKEY42:CJNE A,#2,KEY43 MOV A,min CJNE A,#0,KEY421 MOV min,#59 LJMP KEYEKEY421:DEC min LJMP KEYE;闹钟1-小时、分钟循环减少调节KEY43:CJNE A,#3,KEY44 MOV A,c1_hour CJNE A,#0,KEY431 MOV c1_hour,#23 LJMP KEYEKEY431:DEC c1_hour LJMP KEYEKEY44:CJNE A,#4,KEY45 MOV A,c1_min CJNE A,#0,KEY441 MOV c1_min,#59 LJMP KEYEKEY441:DEC c1_min LJMP KEYE;时段1起始控制-小时、分钟循环减少调节KEY45:CJNE A,#5,KEY46 MOV A,cont1_sh CJNE A,#0,KEY451 MOV cont1_sh,#23 LJMP KEYEKEY451:DEC cont1_sh LJMP KEYEKEY46:CJNE A,#6,KEY47 MOV A,cont1_sm CJNE A,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年南充辅警招聘考试真题含答案详解(突破训练)
- 2024年商丘辅警招聘考试真题含答案详解(模拟题)
- 2024年安顺辅警协警招聘考试备考题库及答案详解(真题汇编)
- 2024年大兴安岭辅警协警招聘考试真题及答案详解(名师系列)
- 2024年宁德 辅警招聘考试真题附答案详解(典型题)
- 2023年蚌埠辅警招聘考试题库附答案详解(轻巧夺冠)
- 2023年营口辅警招聘考试真题含答案详解(夺分金卷)
- 2023年璧山县辅警协警招聘考试真题含答案详解(考试直接用)
- 2024年宜春辅警协警招聘考试真题附答案详解(a卷)
- 2023年酉阳土家族苗族自治县辅警协警招聘考试真题及答案详解(典优)
- 校园不文明行为实训记录
- 无人机在野生动物保护中的监控与追踪可行性分析报告
- 2025内蒙古巴彦淖尔市五原县招聘社区工作者50人笔试考试参考试题及答案解析
- 2025贵州毕节市中医医院招聘暨人才引进编外聘用专业技术人员78人考试笔试模拟试题及答案解析
- 2025年中远海运招聘1189人(含社招)笔试参考题库附带答案详解
- 禾川x3系列伺服说明书
- 企业培训5W2H分析法(31P PPT)
- 《风电防雷接地》word版
- 《杯杯英雄》课件
- 专用集成电路设计基础教程(来新泉 西电版)第4章 数字集成电路设计技术
- 项目部各岗位工程质量考核表
评论
0/150
提交评论