|
原来是用4位LED显示的时钟修改的热敏电阻温度计
修改成通电就显示温度计 4位LED显示正常, 修改去除. ds1302.c和ds1302.h . 热敏电阻温度显示带有鬼影 把 原来的程序 和修改的程序 放上给大家看看是那里出问题 那位师博能 看 修改后的程序那里出问题的,修改上传一下谢谢
单片机源程序如下:
- #include <reg51.h>
- #include <math.h>
- #include "ADC.H"
- sbit LED1 = P3 ^ 7;//数码管1
- sbit LED2 = P3 ^ 6;//数码管2
- sbit LED3 = P3 ^ 5;//数码管3
- sbit LED4 = P3 ^ 4;//数码管4
- //为了编程方便定义的位变量
- sbit a0 = ACC ^ 0;
- sbit a1 = ACC ^ 1;
- sbit a2 = ACC ^ 2;
- sbit a3 = ACC ^ 3;
- sbit a4 = ACC ^ 4;
- sbit a5 = ACC ^ 5;
- sbit a6 = ACC ^ 6;
- sbit a7 = ACC ^ 7;
- sfr AUXR = 0x8E; //0000,0000 辅助寄存器
- sfr P3M1 = 0xB1;
- sfr P3M0 = 0xB2;
- bit flag,dot_Bell=1;//闹钟调时闪烁标志位
- unsigned char id=1;
- unsigned char disbuff[4] ={0};
- unsigned char time=0;
- unsigned int temp[1];
- unsigned int temp_num = 0;
- unsigned char code LEDData1 [ ] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED数值
- unsigned char code LEDData2 [ ] = { 0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED数值
- void Delayms(unsigned int di) //延时
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<10;db++);
- }
- void Display(void) //扫描方式led1~led4循环点亮
- {
- time++;
- if(time==1)
- {
- if(dot_Bell)
- {
- P2=LEDData1[disbuff[0]]&0x7f;// 0x7F点亮DP小数点
- LED1=0; LED4=1;
- }
- else
- {
- P2=LEDData1[disbuff[0]];
- LED1=0; LED4=1;
- }
- }
- if(time==2)
- {
- if(id>=3)
- {
- P2=(LEDData2[disbuff[1]])&0x7F;
- LED1=1; LED2=0;
- }
- else
- if(flag)
- {
- P2=(LEDData2[disbuff[1]])&0x7F;
- LED1=1; LED2=0;
- }
- else
- {
- P2=LEDData2[disbuff[1]];
- LED1=1; LED2=0;
- }
- }
- if(time==3)
- {
- if(id>=3)
- {
- P2=LEDData1[disbuff[2]]&0x7f;
- LED2=1; LED3=0;
- }
- else
- if(flag)
- {
- P2=LEDData1[disbuff[2]]&0x7f;
- LED2=1; LED3=0;
- }
- else
- {
- P2=LEDData1[disbuff[2]];
- LED2=1; LED3=0;
- }
- }
-
- if(time==4)
- {
- time=0;
- if(disbuff[3]==0)
- {
- P2=LEDData1[10];
- LED3=1; LED4=0;
- }
- else
- {
- P2=LEDData1[disbuff[3]];
- LED3=1; LED4=0;
- }
- }
- }
- /******************************************************************************/
- void Timer1Init(void) //20毫秒@12.000MHz
- {
- AUXR &= 0xBF; //定时器时钟12T模式
- TMOD &= 0x0F; //设置定时器模式
- TL1 = 0xE0; //设置定时初值
- TH1 = 0xB1; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- }
- /******************************************************************************/
- void Timer1(void) interrupt 3 using 1
- {
- temp_num++;
- if(temp_num > 40)
- {
- temp_num = 0;
- }
-
- }
- void ADC_convert(void)
- {
- ET0 = 0;
- if(temp_num == 0)
- {
- GetADCResult(6,&temp[0]);
- temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
- temp_num = 1;
- }
-
- P2 = LEDData1[temp[0]/1000]; //千位
- LED4 = 0;
- Delayms(50);
- LED4 = 1;
- P2 = (LEDData1[temp[0]%1000/100])&0x7F;//百位
- LED3 = 0;
- Delayms(50);
- LED3 = 1;
- P2 = LEDData2[temp[0]%1000%100/10];//十位
- LED2 = 0;
- Delayms(50);
- LED2 = 1;
- P2 = 0xa7;//c
- LED1 = 0;
- Delayms(50);
- LED1 = 1;
- ET1 = 1;//启动定时器1
- }
- /******************************************************************************/
- void main(void)//主函数
- {
- P3M1=0x00;
- P3M0=0x08;
- InitADC(); //初始化ADC
- Timer1Init();
- EA=1;
- while(1)//主循环
- {
- Display();
- switch( id )
- {
- case 1:ADC_convert();break;//显示温度
- default:break;
- }
- }//while
- }//main
复制代码 |
|