欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)代碼在仿真中有錯(cuò)誤,望大神解答
[打印本頁]
作者:
本淡
時(shí)間:
2020-12-19 17:35
標(biāo)題:
單片機(jī)代碼在仿真中有錯(cuò)誤,望大神解答
在isis仿真過程中數(shù)碼管顯示有問題
捕獲.jpg.PNG
(52.44 KB, 下載次數(shù): 34)
下載附件
2020-12-19 17:33 上傳
單片機(jī)源程序如下:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char // 宏定義
sbit SET=P3^1; // 定義調(diào)整鍵
sbit DEC=P3^2; // 定義減少鍵
sbit ADD=P3^3; // 定義增加鍵
sbit BEEP=P3^6; // 定義蜂鳴器
sbit ALAM=P1^2 ; // 定義燈光報(bào)警
sbit ALAM1=P1^4;
sbit DQ=P3^7; // 定義 DS18B20 總線 I/O
bit shanshuo_st; // 閃爍間隔標(biāo)志
bit beep_st; // 蜂鳴器間隔標(biāo)志
sbit DIAN = P0^5; // 小數(shù)點(diǎn)
uchar x=0 ; // 計(jì)數(shù)器
signed char m ; // 溫度值全局變量
uchar n ; // 溫度值全局變量
uchar set_st=0 ; // 狀態(tài)標(biāo)志
signed char shangxian=38 ; // 上限報(bào)警溫度,默認(rèn)值為 38
signed char xiaxian=5 ; // 下限報(bào)警溫度,默認(rèn)值為 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 復(fù)位
Delay_DS18B20(8) ; // 稍做延時(shí)
DQ=0 ; // 單片機(jī)將 DQ 拉低
Delay_DS18B20(80) ; // 精確延時(shí),大于 480us
DQ=1 ; // 拉高總線
Delay_DS18B20(14) ;
x=DQ ; // 稍做延時(shí)后,如果 x=0 則初始化成功, x=1 則初始化失敗
Delay_DS18B20(20) ;
}
/***** 讀一個(gè)字節(jié) *****/
unsigned char ReadOneChar(void)
{
unsigned char i=0 ;
unsigned char dat = 0 ;
for (i=8;i>0;i--)
{
DQ = 0 ; // 給脈沖信號(hào)
dat>>=1 ;
DQ = 1 ;// 給脈沖信號(hào)
if(DQ)
dat|=0x80;
Delay_DS18B20(4) ;
}
return(dat);
}
/***** 寫一個(gè)字節(jié) *****/
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) ; // 跳過讀序號(hào)列號(hào)地操作
WriteOneChar(0x44) ; // 啟動(dòng)溫度轉(zhuǎn)換
Init_DS18B20() ;
WriteOneChar(0xCC) ; // 跳過讀序號(hào)列號(hào)地操作
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) ;
}
//=====================================================================================
//=====================================================================================
//=====================================================================================
/***** 延時(shí)子程序 *****/
void Delay(uint num)
{
while( --num );
}
/***** 初始化定時(shí)器 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 ; // 計(jì)算得到十位數(shù)字
b=c/10-a*10 ; // 計(jì)算得到個(gè)位數(shù)字
m=c/10 ; // 計(jì)算得到整數(shù)位
n=c-a*100-b*10 ; // 計(jì)算得到小數(shù)位
if(m<0){m=0 ; n=0; } // 設(shè)置溫度顯示上限
if(m>99){m=99;n=9; } // 設(shè)置溫度顯示上限
}
/***** 顯示開機(jī)初始化等待畫面 *****/
void Disp_init(void)
{
P0 = ~0x80; // 顯示 ----
P2 = 0x7F;
Delay(200);
P2 = 0xdf;
Delay(200);
P2 = 0xf7;
Delay(200);
P2 = 0xfd;
Delay(200);
P2 = 0xff; // 關(guān)閉顯示
}
/***** 顯示溫度子程序 *****/
void Disp_Temperature(void) // 顯示溫度
{
P0 = ~0x98; // 顯示 C
P2 = 0x7F ;
Delay(500) ;
P0= ~LEDData[n] ; // 顯示個(gè)位
P2= 0xDF;
Delay(400);
P0 =~LEDData[m%10]; // 顯示十位
DIAN = 0 ; // 顯示小數(shù)點(diǎn)
P2 =0xF7 ;
Delay(400) ;
P0 =~LEDData[m/10] ; // 顯示百位
P2 = 0xFD ;
Delay(400) ;
P2 = 0xff ;
// 關(guān)閉顯示
}
/***** 顯示報(bào)警溫度子程序 *****/
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 標(biāo)示
P2 = 0xFD ;
Delay(200);
P2 = 0xff ; // 關(guān)閉顯示
}
/***** 報(bào)警子程序 *****/
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 ;
}
}
/***** 主函數(shù) *****/
void main(void)
{
uint z ;
InitTimer(); // 初始化定時(shí)器
EA=1 ; // 全局中斷開關(guān)
TR0=1 ;
ET0=1 ; // 開啟定時(shí)器 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 ; // 關(guān)閉外部中斷 0
EX1=0 ; // 關(guān)閉外部中斷 1
check_wendu() ;
Disp_Temperature() ;
Alarm() ; // 報(bào)警檢測(cè)
}
else if(set_st==1)
{
BEEP=1 ; // 關(guān)閉蜂鳴器
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 ; // 關(guān)閉蜂鳴器
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) ; }
}
}
}
/***** 定時(shí)器 0 中斷服務(wù)程序 *****/
void timer0(void) interrupt 1
{
TH0=0x3c ;
TL0=0xb0 ;
x++ ;
}
/***** 外部中斷 0 服務(wù)程序 *****/
void int0(void) interrupt 0
{
EX0=0; // 關(guān)外部中斷 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 服務(wù)程序 *****/
void int1(void) interrupt 2
{
EX1=0 ; // 關(guān)外部中斷 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 ;
}
}
復(fù)制代碼
作者:
lio2021
時(shí)間:
2021-5-17 15:19
20 21 行
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1