|
主要是時序問題
無標(biāo)題.jpg (115.25 KB, 下載次數(shù): 66)
下載附件
2021-6-23 22:55 上傳
- #include<reg51.h>
- extern unsigned char code NumberData[12];
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit BUS=P2^6;//溫度傳感器接口
- sbit LED_ONE = P2^0;//第一位數(shù)碼管位選端口
- sbit LED_TWO = P2^1;//第一位數(shù)碼管位選端口
- sbit LED_THREE = P2^2;//第一位數(shù)碼管位選端口
- sbit LED_FOUR = P2^3;//第一位數(shù)碼管位選端口
- volatile uchar GeWei,ShiWei,BaiWei,_Geiwei,_ShiWei;
- volatile bit Convert_yes_not=0;
- volatile char Negative=0;
- /**********************************
- 數(shù)碼管編碼
- **********************************/
- code unsigned char NumberData[12] ={
- 0x3f,//0
- 0x06,//1
- 0x5b,//2
- 0x4f,//3
- 0x66,//4
- 0x6d,//5
- 0x7d,//6
- 0x07,//7
- 0x7f,//8
- 0x6f,//9
- 0x80,//DP
- 0x40 //negative
- };
- //延時子函數(shù)
- void Delay_4xN_US(uchar us)
- {
- while(--us);
- }
- //初始化子函數(shù)
- void Timer0_Init()
- {
- TMOD = 0x01;//定時器0模式1-16位定時器-
- TCON = 0x00;//清零TCON
- ET0 = 1; //允許定時器0中斷
- TH0 = 0x3c;//定時100ms
- TL0 = 0xb0;
- TR0 = 1; //啟動定時器0
- }
- void DS18B20_Recover()
- {
- BUS = 1;
- Delay_4xN_US(5);//4us
- BUS = 0;
- Delay_4xN_US(200);//800us
- Delay_4xN_US(200);
- BUS = 1;
- Delay_4xN_US(50);
- BUS = 1;
- Delay_4xN_US(25);
- }
- void SendProc(uchar proc)
- {
- uchar i=0;
- for(i=8; i>0; i--)
- {
- BUS = 0;
- BUS = proc&0x01;
- Delay_4xN_US(25);
- BUS = 1;
- proc>>=1;
- }
- Delay_4xN_US(25);
- }
- uchar ReadOneByte()
- {
- uchar i;
- uchar dat=0;
- for (i=8;i>0;i--)
- {
- BUS = 0;
- dat>>=1;
- BUS = 1;
- if(BUS)
- dat|=0x80;
- Delay_4xN_US(25);
- }
- return dat;
- }
- void LED_DATE_Convert(uchar T_L,uchar T_H)
- {
- uchar ZhengShu,MiddleShu;
- uint XiaoShu;
- if((T_H>>4)>0)//負(fù)數(shù)
- {
- Negative = 0xff;
- MiddleShu =((~(T_L&0x0f))&0x0f)+1;
- if(MiddleShu>>4>0)//有進位
- {
- ZhengShu = (~T_H)*16+((~T_L)>>4)+1;
- XiaoShu =(MiddleShu&0x0f)*625;
- }
- else
- {
- ZhengShu = (~T_H)*16+((~T_L)>>4);
- XiaoShu =(MiddleShu&0x0f)*625;
- }
- GeWei = ZhengShu%10;
- ShiWei = (ZhengShu/10)%10;
- _Geiwei= XiaoShu/1000;
- _ShiWei= (XiaoShu/100)%10;
-
- }
- else//正數(shù)
- {
- Negative = 0x00;
- ZhengShu = T_H*16+(T_L>>4);
- XiaoShu =(T_L&0x0f)*625;
- GeWei = ZhengShu%10;
- ShiWei = (ZhengShu/10)%10;
- BaiWei = ZhengShu/100;
- _Geiwei= XiaoShu/1000;
- _ShiWei= (XiaoShu/100)%10;
- }
- }
- void LED_Show()
- {
- switch(Negative)
- {
- case 0x00: //正數(shù)
- if(BaiWei!=0)
- {
- P0 = NumberData[BaiWei];
- LED_ONE = 0;
- Delay_4xN_US(100);//400us
- LED_ONE = 1;
- P0 = NumberData[ShiWei];
- LED_TWO = 0;
- Delay_4xN_US(100);//400us
- LED_TWO = 1;
- P0 = NumberData[GeWei]|NumberData[10];
- LED_THREE = 0;
- Delay_4xN_US(100);//400us
- LED_THREE = 1;
- P0 = NumberData[_Geiwei];
- LED_FOUR = 0;
- Delay_4xN_US(100);//400us
- LED_FOUR = 1;
- }
- else
- {
- P0 = NumberData[ShiWei];
- LED_ONE = 0;
- Delay_4xN_US(100);//400us
- LED_ONE = 1;
- P0 = NumberData[GeWei]|NumberData[10];
- LED_TWO = 0;
- Delay_4xN_US(100);//400us
- LED_TWO = 1;
- P0 = NumberData[_Geiwei];
- LED_THREE = 0;
- Delay_4xN_US(100);//400us
- LED_THREE = 1;
- P0 = NumberData[_ShiWei];
- LED_FOUR = 0;
- Delay_4xN_US(100);//400us
- LED_FOUR = 1;
- }
- break;
- case 0xff: //負(fù)數(shù)
- if(ShiWei!=0)
- {
- P0 = NumberData[11];
- LED_ONE = 0;
- Delay_4xN_US(100);//400us
- LED_ONE = 1;
- P0 = NumberData[ShiWei];
- LED_TWO = 0;
- Delay_4xN_US(100);//400us
- LED_TWO = 1;
- P0 = NumberData[GeWei]|NumberData[10];
- LED_THREE = 0;
- Delay_4xN_US(100);//400us
- LED_THREE = 1;
- P0 = NumberData[_Geiwei];
- LED_FOUR = 0;
- Delay_4xN_US(100);//400us
- LED_FOUR = 1;
- }
- else
- {
- P0 = NumberData[11];
- LED_ONE = 0;
- Delay_4xN_US(100);//400us
- LED_ONE = 1;
- P0 = NumberData[GeWei]|NumberData[10];
- LED_TWO = 0;
- Delay_4xN_US(100);//400us
- LED_TWO = 1;
- P0 = NumberData[_Geiwei];
- LED_THREE = 0;
- Delay_4xN_US(100);//400us
- LED_THREE = 1;
- P0 = NumberData[_ShiWei];
- LED_FOUR = 0;
- Delay_4xN_US(100);//400us
- LED_FOUR = 1;
- }
- break;
- }
- }
- void Timer_Interrupt() interrupt 1
- {
- uchar T_dat_L,T_dat_H;
- P0=0x00;
- TH0 = 0x3c;//定時100ms
- TL0 = 0xb0;
- if(Convert_yes_not==0)
- {
- DS18B20_Recover();//復(fù)位
- SendProc(0xcc);//ROM跳過指令
- SendProc(0x44);//數(shù)據(jù)轉(zhuǎn)換指令
- Convert_yes_not=1;
- }
- else
- {
- DS18B20_Recover();//復(fù)位
- SendProc(0xcc);//ROM跳過指令
- SendProc(0xbe);//數(shù)據(jù)讀取指令
- T_dat_L = ReadOneByte();//讀取數(shù)據(jù)
- T_dat_H = ReadOneByte();//讀取數(shù)據(jù)
- LED_DATE_Convert(T_dat_L,T_dat_H);
- Convert_yes_not=0;
- }
- }
- //主函數(shù)
- void main()
- {
- P0=0x00;
- P2=0xff;
- DS18B20_Recover();//復(fù)位
- Timer0_Init();
- EA =1;//開放中斷
- while(1)
- {
- LED_Show();
- }
- }
復(fù)制代碼
|
|