電路原理圖如下:
#include "demo.h"
#include "eeprom.h"
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
uint tcnt1=0;//用于刷新數碼管
uint qiannum1,bainum1,shinum1,genum1;
uchar qiannum2,bainum2,shinum2,genum2;
uchar qiannum3,bainum3,shinum3,genum3;
code uchar seg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數碼管字跟
uchar wei1[3]={0XDf,0XBf,0X7f};//數碼管1的位的控制端
uchar wei2[3]={0XFb,0XF7,0Xef};//數碼管2的位的控制端
uchar abcf[4]={0x88,0x83,0xc6,0xbf};//abc-
uchar abcf1,abcf2;//用于顯示特殊字符abc-
uint dispcount=0;//獲取霍爾傳感器的數據用 獲取數據
uint lck=0;//獲取霍爾傳感器的數據用 計時一秒用
uint disp=0; //獲取霍爾傳感器的數據用 顯示到數碼管用
void timer0_1init();//定時配置
void displaynum();//將數字傳到數碼管上顯示
static uchar presstime=0;//時間值按鍵用到的
uint kf0=1;//按鍵用的標志位
uint kt0=0;//按鍵用的標志位
void keycan();//按鍵
void keyflag();//按鍵結束調用,按鍵的建議使用,這樣可以減小code,但是觸發的不建議
uint abc=0,abc1=0;//abc三種狀態
uint keynum=0;//數碼管的位
uint highnum=0,downnum=0;//最大數和最小數
uchar highnum1=0,highnum2=0,downnum1=0,downnum2=0;//最大數和最小數
bit flag_eeprom1=1;//掉電存儲的標志位
void saveeepro();//掉電存儲
void main(){
timer0_1init();
highnum1=Byte_Read(0x01);//掉電存儲用到
highnum2=Byte_Read(0x02);//掉電存儲用到
downnum1=Byte_Read(0x03);//掉電存儲用到
downnum2=Byte_Read(0x04);//掉電存儲用到
genum2=highnum1%10;//個位
shinum2=highnum1%100/10;//十位
bainum2=highnum2%10;//個位
qiannum2=highnum2%100/10;//十位
genum3=downnum1%10;//個位
shinum3=downnum1%100/10;//十位
bainum3=downnum2%10;//個位
qiannum3=downnum2%100/10;//十位
highnum=qiannum2*1000+bainum2*100+shinum2*10+genum2;
downnum=qiannum3*1000+bainum3*100+shinum3*10+genum3;
while(1){
keycan();
displaynum();
}
}
void saveeepro(){//掉電存儲
highnum1=shinum2*10+genum2;
highnum2=qiannum2*10+bainum2;
downnum1=shinum3*10+genum3;
downnum2=qiannum3*10+bainum3;
Sector_Erase(0); //擦除0x01地址中的數據 一定要先擦除再寫進 同一地址
Byte_Program(0x01,highnum1); //擦除完成就可以寫入了
Byte_Program(0x02,highnum2); //擦除完成就可以寫入了
Byte_Program(0x03,downnum1); //擦除完成就可以寫入了
Byte_Program(0x04,downnum2); //擦除完成就可以寫入了
}
void keycan(){//按鍵
if(key1==0){//當按鍵1按下
if(kf0){//當標志位kf0=1的時候進行
if(presstime>100){//當時間值大于一百的時候
kf0=0;//標志位kf0=0
kt0=1;//標志位kt0=0
presstime=0;//時間清零,重新進行
keynum=0;
abc1=0;
disp=0;
abc++;
if(abc==3){//當位到3則置位0
abc=0;
}
}
}
}else{//當按鍵松開
keyflag();
}//按鍵1結束
if(abc>0){
if(key2==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
keynum++;if(keynum==5){keynum=0;
}}}}else{keyflag();
if((flag_eeprom1==1)){//加掉電存儲
flag_eeprom1=0;
saveeepro();//掉電存儲
}
}
if(key3==0){if(kf0){if(presstime>100){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;
switch(keynum){
case 1:
if(abc==1){
genum2++;//數碼管一加加
if(genum2>9){//當數碼管一加加到9時置為1
genum2=0;
}
}else if(abc==2){
genum3++;//數碼管一加加
if(genum3>9){//當數碼管一加加到9時置為1
genum3=0;
}
}
break;
case 2:if(abc==1){shinum2++;if(shinum2>9){shinum2=0;}
}else if(abc==2){shinum3++;if(shinum3>9){shinum3=0;}}
break;
case 3:if(abc==1){bainum2++;if(bainum2>9){bainum2=0;}
}else if(abc==2){bainum3++;if(bainum3>9){bainum3=0;}}
break;
case 4:if(abc==1){qiannum2++;if(qiannum2>9){qiannum2=0;}
}else if(abc==2){qiannum3++;if(qiannum3>9){qiannum3=0;}}
break;
default:break;
}
}}}else{keyflag();
if((flag_eeprom1==1)){//加掉電存儲
flag_eeprom1=0;
saveeepro();//掉電存儲
}
}
}
}
void displaynum(){//將數字傳到數碼管上顯示
if(abc==0){
abcf1=0;//a
abcf2=3;//-
genum1=disp%10;//個位
shinum1=disp%100/10;//十位
bainum1=disp%1000/100;//百位
qiannum1=disp/1000;//千位
if(abc1>2000){
if((downnum<disp)&&(disp<highnum)){out1=1;out2=1;}
if((downnum>disp)&&(disp<highnum)){out1=0;out2=1;}
if((downnum<disp)&&(disp>highnum)){out1=1;out2=0;}
}
}else if(abc==1){
abcf1=1;//b
abcf2=3;//-
highnum=qiannum2*1000+bainum2*100+shinum2*10+genum2;
genum1=genum2;//個位
shinum1=shinum2;//十位
bainum1=bainum2;//百位
qiannum1=qiannum2;//千位
}else if(abc==2){
abcf1=2;//c
abcf2=3;//-
downnum=qiannum3*1000+bainum3*100+shinum3*10+genum3;
genum1=genum3;//個位
shinum1=shinum3;//十位
bainum1=bainum3;//百位
qiannum1=qiannum3;//千位
}
}
void timer0(void)interrupt 1 {
TH0=0xe3;
TL0=0xc;
tcnt1++;
presstime++;
if(abc==0){
abc1++;
lck++;
if(lck==1000){
if(abc1>2000){
disp=dispcount;
}
lck=0;
dispcount=0;
}
}
switch(tcnt1){
case 1: P2=0XFF; P0=abcf[abcf1];P2=wei1[2];break;
case 2: P2=0XFF; P0=abcf[abcf2];P2=wei1[1];break;
case 3: P2=0XFF; P0=seg7code[qiannum1];if(keynum==4 || keynum==0){P2=wei1[0];}break;
case 4: P2=0XFF; P0=seg7code[bainum1]; if(keynum==3 || keynum==0){P2=wei2[2];}break;
case 5: P2=0XFF; P0=seg7code[shinum1]; if(keynum==2 || keynum==0){P2=wei2[1];}break;
case 6: P2=0XFF; P0=seg7code[genum1]; if(keynum==1 || keynum==0){P2=wei2[0];}break;
default: tcnt1=0; P2=0XFF; break;
}
}
void timer0_1init(){//定時配置
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
// IT0=1; //INT0下降沿中斷
// EX0=1; //允許INT1中斷
IT1=1; //INT1下降沿中斷
EX1=1; //允許INT1中斷
TR0=1;
ET0=1;
EA=1;
}
//void int0(void) interrupt 0{//P3^2//此處用于獲取霍爾傳感器的數據
// dispcount++; //每一次中斷,計數加一
//}
void int1(void) interrupt 2{//P3^3//此處用于獲取霍爾傳感器的數據
dispcount++; //每一次中斷,計數加一
}
void keyflag(){//按鍵結束調用,按鍵的建議使用,這樣可以減小code,但是觸發的不建議
if(kt0){//當標志位kt0=1的時候進行
if(presstime>100){//當時間值大于一百的時候
kf0=1;//標志位kf0=1
kt0=0;//標志位kt0=0
presstime=0;//時間清零,重新進行
}
}
}
全部資料51hei下載地址:
CX-0001_觸發繼電器吸合循環通斷時間可調.rar
(53.02 KB, 下載次數: 15)
2019-11-13 00:30 上傳
點擊文件名下載附件
數字選頻電路測試程序.rar
(50.77 KB, 下載次數: 20)
2019-11-13 00:30 上傳
點擊文件名下載附件
數字選頻電路原理圖及PCB圖.pdf
(753.93 KB, 下載次數: 13)
2019-11-13 00:30 上傳
點擊文件名下載附件
|