楼主你是用立创EDA画的原理图吧。看着像。。。 |
谢谢分享,下载来学习下 |
好,学习了 |
#include <REG52.H> #include<intrins.h> #define uint unsigned char uint time = 100; //定时时间 uint time1; uint num = 0; //计时达1s标志位 bit state = 0; //工作状态标志位 unsigned char LED7Code[]={ 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C, // B 0x39, // C 0x5E, // D 0x79, // E 0x71 // F }; sbit RELAY = P3^6; //继电器,高电平有效 sbit BUZY = P3^6; //蜂鸣器,高电平有效 //按键声明 sbit KeyFunction = P3^2; //功能按键,开始/暂停 sbit KeyAdd = P3^3; //按键加 sbit KeyMinus = P3^4; //按键减 //数码管位声明 ----段选为P2口 sbit duan1 = P1^0; //从左往右,第一位 sbit duan2 = P1^1; //从左往右,第二位 sbit duan3 = P1^2; //从左往右,第三位 sbit duan4 = P1^3; //从左往右,第四位 //子函数声明 void display(void); //数码管扫描函数 void Delay2ms(void); //@12.000MHz,延时5ms void Delay10ms(void); //@12.000MHz,延时10ms void Delay150ms(void); //@12.000MHz,延时150ms void Delay200ms(void); //@12.000MHz,延时200ms void testKey(); //按键检测 void main() { //中断寄存器操作 TMOD = 0x01; //设置定时器0工作方式(M1,M0为0,1) TH0 = (65536-45872)/256; //装初值 TL0 = (65536-45872)%256; //装初值 EA = 1; //开总中断 ET0 = 1; //开定时器0中断 //开机音效 BUZY = 1; Delay200ms(); ; BUZY = 0; Delay200ms(); BUZY = 1; Delay200ms(); BUZY = 0; while(1) { time1 = time; display();//数码管显示 testKey(); //按键检测 //进入计时模式 if(state) { time1 = time; TR0 = 1; //开启定时器0 RELAY = 1; //打开继电器 while(state) { testKey(); display(); //判断计时是否完成 if(time1 == 0) { TR0 = 0; //关闭定时器 state = 0; //蜂鸣器响三声,表示计时结束 BUZY = 1; Delay200ms();Delay200ms(); BUZY = 0; Delay200ms();Delay200ms(); BUZY = 1; Delay200ms();Delay200ms(); BUZY = 0; Delay200ms();Delay200ms(); BUZY = 1; Delay200ms();Delay200ms(); BUZY = 0; } } RELAY = 0; } } } void display(void) { uint j, ge, shi, bai; // 个位 十位 百位 ge = time1%10; shi = time1%100/10; bai = time1/100; //数码管动态扫描 for(j=0;j<4;j++) { switch(j) { //个位显示 case 0: duan1 = 0; duan2 = 0; duan3 = 0; duan4 = 1; P2 = LED7Code[ge]; break; //十位显示 case 1: duan1 = 0; duan2 = 0; duan3 = 1; duan4 = 0; P2 = LED7Code[shi]; break; //百位显示 case 2: duan1 = 0; duan2 = 1; duan3 = 0; duan4 = 0; P2 = LED7Code[bai]; break; //第四位显示 case 3: //设置模式显示C if(state) { duan1 = 1; duan2 = 0; duan3 = 0; duan4 = 0; P2 = LED7Code[14]; } //计时模式显示E else { duan1 = 1; duan2 = 0; duan3 = 0; duan4 = 0; P2 = LED7Code[12]; } break; } Delay2ms(); //@12.000MHz ,延时5ms P2 = 0x00; duan1 = 0; duan2 = 0; duan3 = 0; duan4 = 0; } } //按键检测函数 void testKey() { //功能键检测 if(~KeyFunction) { Delay10ms(); if(~KeyFunction) { state = ~state; BUZY = 0; } while(~KeyFunction); } //按键加检测 if(~KeyAdd) { Delay10ms(); if(~KeyAdd) { if(~state && time<999) { time++; } Delay10ms(); if(~KeyAdd) Delay150ms(); } } //按键减检测 if(~KeyMinus) { Delay2ms(); if(~KeyMinus) { if(~state && time>0) { time--; } Delay10ms(); if(~KeyMinus) Delay150ms(); } } } void Delay2ms() //@12.000MHz { unsigned char i, j; _nop_(); i = 32; j = 40; do { while (--j); } while (--i); } void Delay10ms() //@12.000MHz { unsigned char i, j; _nop_(); _nop_(); i = 156; j = 213; do { while (--j); } while (--i); } void Delay150ms() //@12.000MHz { unsigned char i, j, k; i = 10; j = 34; k = 160; do { do { while (--k); } while (--j); } while (--i); } void Delay200ms() //@12.000MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 13; j = 45; k = 214; do { do { while (--k); } while (--j); } while (--i); } //中断函数 void T0time() interrupt 1 { TH0 = (65536-45872)/256; //装初值 TL0 = (65536-45872)%256; //装初值 //5毫秒一次中断,满20次表示1秒已到 num++; if(num == 20) { num = 0; time1--; } } |