本帖最后由 xbox007 于 2020-2-24 21:19 編輯
設定鬧鐘時間到了蜂鳴器不響 麻煩大家?guī)臀铱纯丛创a哪里出了問題,幫忙改正下謝謝! 蜂鳴器接的P1.7 PNP管
#include"reg52.h"
#include"ds1302.h"
#include"intrins.h"
//#include"EEP.h"
#define uchar unsigned char
#define uint unsigned int
#define on 1
#define off 0
#define NOP(N) NOP##N()
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
sfr ADC_RESL = 0xBE; //ADC低2位結(jié)果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
uint get_temperature(uint adc);
void Get_Temp(void);
//段碼位選
sbit G1= P3^4;
sbit G2= P3^5;
sbit G3= P3^6;
sbit G4= P3^7;
//按鍵定義
sbit set=P3^0;
sbit jia=P3^1;
sbit zh=P3^3; // 顛倒開關(guān)
#define N 8 //ADC采樣使用遞推平均濾波算法,采樣次數(shù)
unsigned int Temp_Buf[N+1]; //采樣數(shù)組
unsigned char ADCcount; //數(shù)碼管顯示計數(shù)變量,ADC采樣次數(shù)變量
uchar tab[4]={0}; //顯示緩存
unsigned int temp[3];
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/33) //12T模式 30MS
sfr AUXR = 0x8e; //Auxiliary register
sbit P10 = P1^0; //調(diào)用鬧鐘用
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
bit nf=0; //鬧鐘開標志:受水銀影響
bit gk=0; //光控開標志
bit nk=0; //鬧鐘開標志:受設置影響
bit nx=1; //鬧鐘響標志:受時間影響
bit ps=0; //顛倒開關(guān)標志
bit flag1=1,
wflag1=0;
int ld=1;
char menu=0;
char flag;
//沒有小數(shù)點 共陽數(shù)碼管
uchar table1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff,0x88,0xc7}; //c4
//顯示小數(shù)點 a l
uchar table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0xff,};
//倒沒有小數(shù)點
uchar table3[]={0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,
0x80,0x82,0xff,};
//倒顯示小數(shù)點
uchar table4[]={0x40,0x4F,0x24,0x06,0x0B,0x12,0x10,0x47,
0x00,0x02,0xff,0x70,};
//延時ms
void delay_ms(uchar ms){
uchar i;
while(ms--){
for(i=0;i<123;i++);
}
}
//溫度顯示
void display_temperatue(){
G1 = off;
G2 = on;
G3 = on;
G4 = on;
P2 = table1[tab[0]];
delay_ms(8);
G1 = on;
G2 = off;
G3 = on;
G4 = on;
P2 = table1[tab[1]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
// P2 = table3[tab[2]];
P2 = table4[11];
delay_ms(8);
G1 = on;
G2 = on;
G3 = on;
G4 = on;
P2 = table4[tab[3]];
// P2 = table1[tab[3]];
delay_ms(5);
}
//時間顯示
void display_time(){
G1 = off;
G2 = on;
G3 = on;
G4 = on;
P2 = table1[tab[0]];
delay_ms(5);
if(flag>0){
G1 = on;
G2 = off;
G3 = on;
G4 = on;
P2 = table1[tab[1]];
delay_ms(5);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
P2 = table3[tab[2]];
delay_ms(5);
}else{
G1 = on;
G2 = off;
G3 = on;
G4 = on;
P2 = table2[tab[1]];
delay_ms(5);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
P2 = table4[tab[2]];
delay_ms(5);
}
if(nx==0){
if(flag>0){
G1 = on;
G2 = on;
G3 = on;
G4 = off;
P2 = table1[tab[3]];
delay_ms(5);
}
else{
G1 = on;
G2 = on;
G3 = on;
G4 = off;
P2 = table2[tab[3]];
delay_ms(5);
}
}else{
G1 = on;
G2 = on;
G3 = on;
G4 = off;
P2 = table1[tab[3]];
delay_ms(5);
}
G1 = on;
G2 = on;
G3 = on;
G4 = on;
}
//音頻調(diào)用
void display_Audio(){
G1 = off;
G2 = on;
G3 = on;
G4 = on;
if(temp[1]>5){P2=0xcf;}else{P2=0xff;}
delay_ms(10);
if(temp[1]>30){P2=0xf9;}else{P2=0xff;}
delay_ms(10);
G1 = on;
G2 = off;
G3 = on;
G4 = on;
if(temp[1]>60){P2=0xcf;}else{P2=0xff;}
delay_ms(10);
if(temp[1]>90){P2=0xf9;}else{P2=0xff;}
delay_ms(10);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
if(temp[1]>120){P2=0xf9;}else{P2=0xff;}
delay_ms(10);
if(temp[1]>150){P2=0xcf;}else{P2=0xff;}
delay_ms(10);
G1 = on;
G2 = on;
G3 = on;
G4 = off;
if(temp[1]>180){P2=0xcf;}else{P2=0xff;}
delay_ms(10);
if(temp[1]>210){P2=0xf9;}else{P2=0xff;}
delay_ms(10);
}
//鬧鐘用 ,光控用
void display_alme(){
G1 = off;
G2 = on;
G3 = on;
G4 = on;
P2 = table1[tab[0]];
delay_ms(8);
G1 = on;
G2 = off;
G3 = on;
G4 = on;
P2 = table2[tab[1]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
P2 = table4[tab[2]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = on;
G4 = off;
P2 = table2[tab[3]];
delay_ms(5);
G1 = on;
G2 = on;
G3 = on;
G4 = on;
}
/*
//設計調(diào)用
void display_set1(){
G1 = off;
G2 = on;
G3 = on;
G4 = on;
P2 = table1[tab[0]];
delay_ms(8);
G1 = on;
G2 = off;
G3 = on;
G4 = on;
P2 = table2[tab[1]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
P2 = table4[tab[2]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = on;
G4 = off;
P2 = table1[tab[3]];
delay_ms(5);
G1 = on;
G2 = on;
G3 = on;
G4 = on;
} */
//設計調(diào)用
void display_set(){
G1 = off;
G2 = on;
G3 = on;
G4 = on;
P2 = table1[tab[0]];
delay_ms(8);
G1 = on;
G2 = off;
G3 = on;
G4 = on;
P2 = table2[tab[1]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = off;
G4 = on;
P2 = table4[tab[2]];
delay_ms(8);
G1 = on;
G2 = on;
G3 = on;
G4 = off;
P2 = table1[tab[3]];
delay_ms(5);
G1 = on;
G2 = on;
G3 = on;
G4 = on;
}
//ADC初始化
void ic_adc_init(){
ADC_CONTR = 0xE0; //90T, ADC power on
delay_ms(5);
}
//讀ADC值
uint get_adc_temp(uchar channel){
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel; //start the ADC
delay_ms(1);
while((ADC_CONTR & 0x10) == 0) ; //wait for ADC finish
ADC_CONTR &= ~0x10; //清除ADC結(jié)束標志
return (((uint)ADC_RES << 2) | (ADC_RESL & 3));
}
void key(){
if(zh==1){ps=0;}else ps=1;
if(ps==0){
if(set==0){
delay_ms(10);
if(set==0){
menu+=1;
if(menu==1)// read_time();
if(menu==3){ read_nao();}
// if(menu==5) // IapProgramByte(IAP_ADDRESS+5,gk&0x01); display_alme();//調(diào)顯示
// if(menu==6) // IapProgramByte(IAP_ADDRESS+6,nk&0x01); display_alme();//調(diào)顯示
if(menu==7)menu=0; write_time();
while(set==0);
display_set();//調(diào)顯示
}
}
if(menu==1){ //調(diào)分鐘
if(jia==0){
delay_ms(10);
if(jia==0){
fen=fen+1;
if(fen == 0x5a)
fen = 0;
if((fen & 0x0f) >= 0x0a)
fen = (fen & 0xf0) + 0x10;
while(jia==0);
}
} display_set();//調(diào)顯示
}
if(menu==2){ //小時
if(jia==0){
delay_ms(10);
if(jia==0){
shi=shi+1;
if(shi == 0x24)
shi = 0;
if((shi & 0x0f) >= 0x0a)
shi = (shi & 0xf0) + 0x10;
while(jia==0);
}
}display_set();//調(diào)顯示
}
if(menu==3){ //分鐘
if(jia==0){
delay_ms(10);
if(jia==0){
nfen=nfen+1;
if(nfen == 0x5a)
nfen = 0;
if((nfen & 0x0f) >= 0x0a)
nfen = (nfen & 0xf0) + 0x10;
while(jia==0);
}
} display_alme();//調(diào)顯示
}
if(menu==4){ //小時
if(jia==0){
delay_ms(10);
if(jia==0){
nshi=nshi+1;
if(nshi == 0x24)
nshi = 0;
if((nshi & 0x0f) >= 0x0a)
nshi = (nshi & 0xf0) + 0x10;
while(jia==0);
}
}display_alme();//調(diào)顯示
}
if(menu==5){ //調(diào)光控
if(jia==0){
delay_ms(10);
if(jia==0){
while(jia==0);
gk=!gk;
// IapProgramByte(0x03,gk);
}
} display_set();//調(diào)顯示
}
if(menu==6){ //調(diào)鬧鐘
if(jia==0){
delay_ms(10);
if(jia==0){
while(jia==0);
nk=!nk;
// IapProgramByte(0x02,nk);
}
}display_alme();//調(diào)顯示
}
}
}
void main(){
// AUXR |= 0x80; //定時器0為1T模式
AUXR &= 0x7f; //定時器0為12T模式
TMOD = 0x00; //設置定時器為模式0(16位自動重裝載)
TL0 = T1MS; //初始化計時值
TH0 = T1MS >> 8;
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
EA = 1;
ic_adc_init();
init_ds1302_io();
init_ds1302();
read_nao();
P1M0=0X00;
P1M1=0Xff;
while(1){
if(nk==1){if(shi==nshi && fen==nfen && nf==0){nx=0;}else{nx=1;}} //開鬧鐘
key();
if(ps==0){
if(menu==0){//主菜單
if(flag1==1){ //顯示時間
temp[2]=get_adc_temp(1);
if(gk==1){
if(temp[2]<100) ld=5;
if(temp[2]>100&&temp[2]<300)ld=10;
if(temp[2]>300&&temp[2]<500)ld=50;
if(temp[2]>500&&temp[2]<600)ld=80;
if(temp[2]>600&&temp[2]<700)ld=100;
if(temp[2]>700&&temp[2]<800)ld=120;
if(temp[2]>900&&temp[2]<1000)ld=130;
if(temp[2]>1000)ld=150;
}else ld=5;
read_time();
tab[0]=shi/16;
tab[1]=shi%16;
tab[2]=fen/16;
tab[3]=fen%16;
display_time();
delay_ms(ld);
}
if(flag1==0) //顯示溫度
{
if(wflag1==0){wflag1=1;}
Get_Temp();
display_temperatue();
delay_ms(ld);
}
}else{ //設置菜單
if(menu==1){ //調(diào)時間分
tab[0]=shi/16;
tab[1]=shi%16;
if(flag>0){
tab[2]=fen/16;
tab[3]=fen%16;
}else{
tab[2]=10;
tab[3]=10;
}
}
if(menu==2){ //調(diào)時間時
tab[2]=fen/16;
tab[3]=fen%16;
if(flag>0){
tab[0]=shi/16;
tab[1]=shi%16;
}else{
tab[0]=10;
tab[1]=10;
}
}
if(menu==3){ //調(diào)鬧鐘分
tab[0]=nshi/16;
tab[1]=nshi%16;
if(flag>0){
tab[2]=nfen/16;
tab[3]=nfen%16;
}else{
tab[2]=10;
tab[3]=10;
}
}
if(menu==4){ //調(diào)鬧鐘時
if(flag>0){
tab[0]=nshi/16;
tab[1]=nshi%16;
}else{
tab[0]=10;
tab[1]=10;
}
tab[2]=nfen/16;
tab[3]=nfen%16;
}
if(menu==5){ //調(diào)光控
tab[0]=11;
tab[1]=gk;
tab[2]=gk;
tab[3]=gk;
}
if(menu==6){ //調(diào)鬧鐘
tab[0]=12;
tab[1]=nk;
tab[2]=nk;
tab[3]=nk;
}
}
}
if(ps==1){ //端口一定要設計置高阻輸入
temp[1]=get_adc_temp(0);
display_Audio();//
}
}
}
char t;
int t1;
// Timer0 interrupt routine 定時0中斷
void tm0_isr() interrupt 1 using 1
{
P10 = ! P10; //將測試口取反
t++;
t1++;
if(t==20)
{
t=0;
wflag1=0;
flag=!flag;
if(nx==0)bell=!bell;
}
if(t1>0 && t1<350)flag1=1;
if(t1>350 && t1<430)flag1=0;
if(t1>430)t1=0;
}
//NTC溫度
void Get_Temp(void)
{
unsigned char xx;
unsigned int sum,tempvalue;
sum = tempvalue =0;
Temp_Buf[N]=get_adc_temp(2); //將ADC轉(zhuǎn)換結(jié)果放數(shù)組最高位
if( ++ADCcount < 8) //采樣初期不使用濾波算法
{
for(xx=0;xx<N;xx++) //準備濾波算法的數(shù)據(jù)
{
Temp_Buf[xx]=Temp_Buf[xx+1];//所有數(shù)據(jù)循環(huán)左移
}
tempvalue=Temp_Buf[N];//采樣初期使用當前采樣值
}
else //只有采樣次數(shù)大于8次以后才使用濾波算法
{
ADCcount=8; //采樣次數(shù)超過8次后,固定設置為8
for(xx=0;xx<N;xx++) //濾波算法
{
Temp_Buf[xx]=Temp_Buf[xx+1];//所有數(shù)據(jù)循環(huán)左移
sum+=Temp_Buf[xx]; //求和
}
tempvalue=sum/N; //求平均值
} //
tempvalue=get_temperature(tempvalue);
// tab[0]=tempvalue/1000;
tab[0]=tempvalue%1000/100; //十位
tab[1]=tempvalue%100/10;//個位加小數(shù)點
// tab[3]=tempvalue%10; //小數(shù)位
}
// MF52E 10K at 25, B = 3534, ADC = 12 bits
uint code temp_table[]={
140, //;-40 0
149, //;-39 1
159, //;-38 2
168, //;-37 3
178, //;-36 4
188, //;-35 5
199, //;-34 6
210, //;-33 7
222, //;-32 8
233, //;-31 9
246, //;-30 10
259, //;-29 11
272, //;-28 12
286, //;-27 13 14
301, //;-26 14 15
317, //;-25 15 16
334,
351,
369,
387,
406,
425,
445,
466,
487,
509,
528, //
555,
579,
603,
628,
654,
681,
709,
738,
768,
799,
824, //;-4 36
858, //;-3 37 9
893, //;-2 38
929, //;-1 39
965, //;0 40
1003, //;1 41
1041, //;2 42
1080, //;3 43
1119, //;4 44
1139,
1160, //;5 45
1180,
1201, //;6 46
1243, //;7 47
1285, //;8 48
1328, //;9 49
1371, //;10 50
1414, //;11 51
1459, //;12 52
1503, //;13 53
1548, //;14 54
1593, //;15 55
1638, //;16 56
1684, //;17 57
1730, //;18 58
1775, //;19 59
1821, //;20 60
1867, //;21 61
1912, //;22 62
1958, //;23 63
2003, //;24 64
2048, //;25 65
2093, //;26 66
2137, //;27 67
2182, //;28 68
2225, //;29 69
2269, //;30 70
2312, //;31 71
2354, //;32 72
2397, //;33 73
2438, //;34 74
2479, //;35 75
2519, //;36 76
2559, //;37 77
2598, //;38 78
2637, //;39 79
2675, //;40 80
2712, //;41 81
2748, //;42 82
2784, //;43 83
2819, //;44 84
2853, //;45 85
2887, //;46 86
2920, //;47 87
2952, //;48 88
2984, //;49 89
3014, //;50 90
3044, //;51 91
3073, //;52 92
3102, //;53 93
3130, //;54 94
3157, //;55 95
3183, //;56 96
3209, //;57 97
3234, //;58 98
3259, //;59 99
3283, //;60 100
3306, //;61 101
3328, //;62 102
3351, //;63 103
3372, //;64 104
3393, //;65 105
3413, //;66 106
3432, //;67 107
};
/******************** 計算溫度 ***********************************************/
// 計算結(jié)果: 0對應-40.0度, 400對應0度, 625對應25.0度, 最大1600對應120.0度.
// 為了通用, ADC輸入為12bit的ADC值.
// 電路和軟件算法設計: Coody
/**********************************************/
#define D_SCALE 10 //結(jié)果放大倍數(shù), 放大10倍就是保留一位小數(shù)
uint get_temperature(uint adc)
{
uint code *p;
uint i;
uchar j,k,min,max;
// adc = 1024 - adc; //Rt接地
p = temp_table;
if(adc < p[0]) return (0xfffe);
if(adc > p[160]) return (0xffff);
min = 0; //-40度
max = 160; //120度
for(j=0; j<5; j++) //對分查表
{
k = min / 2 + max / 2;
if(adc <= p[k]) max = k;
else min = k;
}
if(adc == p[min]) i = min * D_SCALE;
else if(adc == p[max]) i = max * D_SCALE;
else // min < temp < max
{
while(min <= max)
{
min++;
if(adc == p[min]) {i = min * D_SCALE; break;}
else if(adc < p[min])
{
min--;
i = p[min]; //min
j = (adc - i) * D_SCALE / (p[min+1] - i);
i = min;
i *= D_SCALE;
i += j;
break;
}
}
}
return i;
}
|