在isis仿真過程中數碼管顯示有問題
捕獲.jpg.PNG (52.44 KB, 下載次數: 34)
下載附件
2020-12-19 17:33 上傳
單片機源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char // 宏定義
- sbit SET=P3^1; // 定義調整鍵
- sbit DEC=P3^2; // 定義減少鍵
- sbit ADD=P3^3; // 定義增加鍵
- sbit BEEP=P3^6; // 定義蜂鳴器
- sbit ALAM=P1^2 ; // 定義燈光報警
- sbit ALAM1=P1^4;
- sbit DQ=P3^7; // 定義 DS18B20 總線 I/O
- bit shanshuo_st; // 閃爍間隔標志
- bit beep_st; // 蜂鳴器間隔標志
- sbit DIAN = P0^5; // 小數點
- uchar x=0 ; // 計數器
- signed char m ; // 溫度值全局變量
- uchar n ; // 溫度值全局變量
- uchar set_st=0 ; // 狀態標志
- signed char shangxian=38 ; // 上限報警溫度,默認值為 38
- signed char xiaxian=5 ; // 下限報警溫度,默認值為 5
- uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
- //uchar code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B} ;
- void Delay_DS18B20(int num)
- {
- while(num--);
- }
- /***** 初始化 DS18B20*****/
- void Init_DS18B20(void)
- {
- unsigned char x=0 ;
- DQ=1 ; //DQ 復位
- Delay_DS18B20(8) ; // 稍做延時
- DQ=0 ; // 單片機將 DQ 拉低
- Delay_DS18B20(80) ; // 精確延時,大于 480us
- DQ=1 ; // 拉高總線
- Delay_DS18B20(14) ;
- x=DQ ; // 稍做延時后,如果 x=0 則初始化成功, x=1 則初始化失敗
- Delay_DS18B20(20) ;
- }
- /***** 讀一個字節 *****/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0 ;
- unsigned char dat = 0 ;
- for (i=8;i>0;i--)
- {
- DQ = 0 ; // 給脈沖信號
- dat>>=1 ;
- DQ = 1 ;// 給脈沖信號
- if(DQ)
- dat|=0x80;
- Delay_DS18B20(4) ;
- }
- return(dat);
- }
- /***** 寫一個字節 *****/
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0 ;
- for (i=8;i>0 ; i--)
- {
- DQ = 0 ;
- DQ = dat&0x01 ;
- Delay_DS18B20(5) ;
- DQ = 1 ;
- dat>>=1;
- }
- }
- /***** 讀取溫度 *****/
- unsigned int ReadTemperature(void)
- {
- unsigned char a=0 ;
- unsigned char b=0 ;
- unsigned int t=0 ;
- float tt=0 ;
- Init_DS18B20() ;
- WriteOneChar(0xCC) ; // 跳過讀序號列號地操作
- WriteOneChar(0x44) ; // 啟動溫度轉換
- Init_DS18B20() ;
- WriteOneChar(0xCC) ; // 跳過讀序號列號地操作
- WriteOneChar(0xBE) ; // 讀取溫度寄存器
- a=ReadOneChar() ; // 讀低 8 位
- b=ReadOneChar() ; // 讀高 8 位
- t=b ;
- t<<=8 ;
- t=t|a ;
- tt=t*0.0625 ;
- t= tt*10+0.5 ; // 放大 10 倍輸出并四舍五入
- return(t) ;
- }
- //=====================================================================================
- //=====================================================================================
- //=====================================================================================
- /***** 延時子程序 *****/
- void Delay(uint num)
- {
- while( --num );
- }
- /***** 初始化定時器 0*****/
- void InitTimer(void)
- {
- TMOD=0x1 ;
- TH0=0x3c ;
- TL0=0xb0 ; //50ms (晶振 12M )
- }
- /***** 讀取溫度 *****/
- void check_wendu(void)
- {
- uint a,b,c ;
- c=ReadTemperature()-5 ; // 獲取溫度值并減去 DS18B20 地溫漂誤差
- a=c/100 ; // 計算得到十位數字
- b=c/10-a*10 ; // 計算得到個位數字
- m=c/10 ; // 計算得到整數位
- n=c-a*100-b*10 ; // 計算得到小數位
- if(m<0){m=0 ; n=0; } // 設置溫度顯示上限
- if(m>99){m=99;n=9; } // 設置溫度顯示上限
- }
- /***** 顯示開機初始化等待畫面 *****/
- void Disp_init(void)
- {
- P0 = ~0x80; // 顯示 ----
- P2 = 0x7F;
- Delay(200);
- P2 = 0xdf;
- Delay(200);
- P2 = 0xf7;
- Delay(200);
- P2 = 0xfd;
- Delay(200);
- P2 = 0xff; // 關閉顯示
- }
- /***** 顯示溫度子程序 *****/
- void Disp_Temperature(void) // 顯示溫度
- {
- P0 = ~0x98; // 顯示 C
- P2 = 0x7F ;
- Delay(500) ;
- P0= ~LEDData[n] ; // 顯示個位
- P2= 0xDF;
- Delay(400);
- P0 =~LEDData[m%10]; // 顯示十位
- DIAN = 0 ; // 顯示小數點
- P2 =0xF7 ;
- Delay(400) ;
- P0 =~LEDData[m/10] ; // 顯示百位
- P2 = 0xFD ;
- Delay(400) ;
- P2 = 0xff ;
- // 關閉顯示
- }
- /***** 顯示報警溫度子程序 *****/
- void Disp_alarm(uchar baojing)
- {
- P0 =~0x98 ; // 顯示 C
- P2 = 0x7F ;
- Delay(200) ;
- P0 = ~LEDData[baojing%10] ; // 顯示十位
- P2 = 0xDF ;
- Delay(200) ;
- P0 = ~LEDData[baojing/10] ; // 顯示百位
- P2 = 0xF7 ;
- Delay(200) ;
- if(set_st==1)P0 =~0xCE ;
- else if(set_st==2)P0 =~0x1A ; // 上限 H 、下限 L 標示
- P2 = 0xFD ;
- Delay(200);
- P2 = 0xff ; // 關閉顯示
- }
- /***** 報警子程序 *****/
- void Alarm()
- {
- if(x>=10){beep_st=~beep_st; x=0 ; }
- if(m>=shangxian)
- {
- ALAM=0 ;
- if(beep_st==1)
- BEEP=0 ;
- else
- BEEP=1 ;
- }
- else if(m<xiaxian)
- {
- ALAM1=0 ;
- if(beep_st==1)
- BEEP=0 ;
- else
- BEEP=1 ;
- }
- else
- {
- BEEP=1 ;
- ALAM=1 ;
- ALAM1=1 ;
- }
- }
- /***** 主函數 *****/
- void main(void)
- {
- uint z ;
- InitTimer(); // 初始化定時器
- EA=1 ; // 全局中斷開關
- TR0=1 ;
- ET0=1 ; // 開啟定時器 0
- IT0=1 ;
- IT1=1 ;
- check_wendu() ;
- check_wendu() ;
- for(z=0 ; z<300 ; z++)
- {
- Disp_init() ;
- }
- while(1)
- {
- if(SET==0)
- {
- Delay(2000) ;
- do{}while(SET==0);
- set_st++; x=0 ; shanshuo_st=1 ;
- if(set_st>2)set_st=0 ;
- }
- if(set_st==0)
- {
- EX0=0 ; // 關閉外部中斷 0
- EX1=0 ; // 關閉外部中斷 1
- check_wendu() ;
- Disp_Temperature() ;
- Alarm() ; // 報警檢測
- }
- else if(set_st==1)
- {
- BEEP=1 ; // 關閉蜂鳴器
- ALAM=1 ;
- ALAM1=1 ;
- EX0=1 ; // 開啟外部中斷 0
- EX1=1 ; // 開啟外部中斷 1
- if(x>=10){shanshuo_st=~shanshuo_st ; x=0 ; }
- if(shanshuo_st) {Disp_alarm(shangxian) ; }
- }
- else if(set_st==2)
- {
- BEEP=1 ; // 關閉蜂鳴器
- ALAM=1 ;
- ALAM1=1 ;
- EX0=1 ; // 開啟外部中斷 0
- EX1=1 ; // 開啟外部中斷 1
- if(x>=10){shanshuo_st=~shanshuo_st ; x=0 ; }
- if(shanshuo_st) {Disp_alarm(xiaxian) ; }
- }
- }
- }
- /***** 定時器 0 中斷服務程序 *****/
- void timer0(void) interrupt 1
- {
- TH0=0x3c ;
- TL0=0xb0 ;
- x++ ;
- }
- /***** 外部中斷 0 服務程序 *****/
- void int0(void) interrupt 0
- {
- EX0=0; // 關外部中斷 0
- if(DEC==0&&set_st==1)
- {
- do{
- Disp_alarm(shangxian);
- }
- while(DEC==0) ;
- shangxian-- ;
- if(shangxian<xiaxian)shangxian=xiaxian;
- }
- else if(DEC==0&&set_st==2)
- {
- do{
- Disp_alarm(xiaxian) ;
- }
- while(DEC==0) ;
- xiaxian-- ;
- if(xiaxian<0)xiaxian=0 ;
- }
- }
- /***** 外部中斷 1 服務程序 *****/
- void int1(void) interrupt 2
- {
- EX1=0 ; // 關外部中斷 1
- if(ADD==0&&set_st==1)
- {
- do{
- Disp_alarm(shangxian) ;
- }
- while(ADD==0) ;
- shangxian++ ;
- if(shangxian>99)shangxian=99 ;
- }
- else if(ADD==0&&set_st==2)
- {
- do{
- Disp_alarm(xiaxian) ;
- }
- while(ADD==0) ;
- xiaxian++ ;
- if(xiaxian>shangxian)xiaxian=shangxian ;
- }
- }
復制代碼 |