久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1818|回復: 1
打印 上一主題 下一主題
收起左側

單片機代碼在仿真中有錯誤,望大神解答

[復制鏈接]
跳轉到指定樓層
樓主
在isis仿真過程中數碼管顯示有問題

單片機源程序如下:
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char   // 宏定義
  4. sbit SET=P3^1;         // 定義調整鍵
  5. sbit DEC=P3^2;          // 定義減少鍵
  6. sbit ADD=P3^3;        // 定義增加鍵
  7. sbit BEEP=P3^6;        // 定義蜂鳴器
  8. sbit ALAM=P1^2 ;       // 定義燈光報警
  9. sbit ALAM1=P1^4;  
  10. sbit DQ=P3^7;        // 定義 DS18B20 總線 I/O  
  11. bit shanshuo_st;       // 閃爍間隔標志
  12. bit beep_st;           // 蜂鳴器間隔標志
  13. sbit DIAN = P0^5;      // 小數點
  14. uchar x=0  ;         // 計數器
  15. signed char m ;          // 溫度值全局變量
  16. uchar n ;            // 溫度值全局變量
  17. uchar set_st=0 ;        // 狀態標志
  18. signed char shangxian=38 ;     // 上限報警溫度,默認值為 38
  19. signed char xiaxian=5   ;   // 下限報警溫度,默認值為 5
  20. uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
  21. //uchar code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B} ;

  22. void Delay_DS18B20(int num)
  23. {
  24. while(num--);
  25. }                                 
  26. /***** 初始化 DS18B20*****/
  27. void Init_DS18B20(void)
  28. {
  29. unsigned char x=0         ;
  30. DQ=1 ;  //DQ 復位
  31. Delay_DS18B20(8) ;  // 稍做延時
  32. DQ=0  ; // 單片機將 DQ 拉低
  33. Delay_DS18B20(80) ; // 精確延時,大于 480us
  34. DQ=1 ;  // 拉高總線
  35. Delay_DS18B20(14)          ;
  36. x=DQ ; // 稍做延時后,如果 x=0 則初始化成功, x=1 則初始化失敗
  37. Delay_DS18B20(20)         ;
  38. }
  39. /***** 讀一個字節 *****/
  40. unsigned char ReadOneChar(void)
  41. {
  42. unsigned char i=0         ;
  43. unsigned char dat = 0 ;
  44. for (i=8;i>0;i--)
  45. {
  46. DQ = 0 ;  //  給脈沖信號
  47. dat>>=1 ;
  48. DQ = 1 ;//  給脈沖信號
  49. if(DQ)        
  50. dat|=0x80;
  51. Delay_DS18B20(4) ;         
  52. }
  53. return(dat);
  54. }
  55. /***** 寫一個字節 *****/
  56. void WriteOneChar(unsigned char dat)
  57. {
  58. unsigned char i=0 ;
  59. for (i=8;i>0 ; i--)
  60. {
  61. DQ = 0 ;
  62. DQ = dat&0x01 ;
  63. Delay_DS18B20(5) ;
  64. DQ = 1 ;
  65. dat>>=1;
  66. }
  67. }
  68. /***** 讀取溫度 *****/
  69. unsigned int ReadTemperature(void)
  70. {
  71. unsigned char a=0 ;
  72. unsigned char b=0 ;
  73. unsigned int t=0 ;
  74. float tt=0 ;
  75. Init_DS18B20() ;
  76. WriteOneChar(0xCC) ;  // 跳過讀序號列號地操作
  77. WriteOneChar(0x44) ;  // 啟動溫度轉換
  78. Init_DS18B20() ;
  79. WriteOneChar(0xCC) ;  // 跳過讀序號列號地操作
  80. WriteOneChar(0xBE) ;  // 讀取溫度寄存器
  81. a=ReadOneChar() ;  // 讀低 8 位
  82. b=ReadOneChar() ;  // 讀高 8 位
  83. t=b ;
  84. t<<=8 ;
  85. t=t|a ;
  86. tt=t*0.0625 ;
  87. t= tt*10+0.5 ;  // 放大 10 倍輸出并四舍五入
  88. return(t) ;
  89. }
  90. //=====================================================================================
  91. //=====================================================================================
  92. //=====================================================================================


  93. /***** 延時子程序 *****/
  94. void Delay(uint num)
  95. {
  96. while( --num );
  97. }
  98. /***** 初始化定時器 0*****/
  99. void InitTimer(void)
  100. {
  101. TMOD=0x1 ;
  102. TH0=0x3c ;
  103. TL0=0xb0 ;  //50ms (晶振 12M )
  104. }

  105. /***** 讀取溫度 *****/
  106. void check_wendu(void)
  107. {
  108. uint a,b,c ;
  109. c=ReadTemperature()-5 ;        // 獲取溫度值并減去 DS18B20 地溫漂誤差
  110. a=c/100 ;              // 計算得到十位數字
  111. b=c/10-a*10 ;            // 計算得到個位數字
  112. m=c/10 ;             // 計算得到整數位
  113. n=c-a*100-b*10 ;          // 計算得到小數位
  114. if(m<0){m=0 ; n=0; }         // 設置溫度顯示上限
  115. if(m>99){m=99;n=9; }         // 設置溫度顯示上限  
  116. }
  117. /***** 顯示開機初始化等待畫面 *****/
  118. void Disp_init(void)
  119. {
  120. P0 = ~0x80;  // 顯示 ----
  121. P2 = 0x7F;
  122. Delay(200);
  123. P2 = 0xdf;
  124. Delay(200);  
  125. P2 = 0xf7;
  126. Delay(200);
  127. P2 = 0xfd;
  128. Delay(200);
  129. P2 = 0xff;  // 關閉顯示
  130. }
  131. /***** 顯示溫度子程序 *****/
  132. void Disp_Temperature(void) // 顯示溫度
  133. {
  134. P0 = ~0x98;  // 顯示 C
  135. P2 = 0x7F ;
  136. Delay(500) ;
  137. P0= ~LEDData[n] ;  // 顯示個位
  138. P2= 0xDF;
  139. Delay(400);
  140. P0 =~LEDData[m%10];  // 顯示十位
  141. DIAN = 0 ;  // 顯示小數點
  142. P2 =0xF7 ;
  143. Delay(400) ;
  144. P0 =~LEDData[m/10] ;  // 顯示百位
  145. P2 = 0xFD ;
  146. Delay(400) ;  
  147. P2 = 0xff ;
  148. // 關閉顯示
  149. }
  150. /***** 顯示報警溫度子程序 *****/
  151. void Disp_alarm(uchar baojing)
  152. {
  153. P0 =~0x98 ;  // 顯示 C
  154. P2 = 0x7F ;
  155. Delay(200) ;
  156. P0 = ~LEDData[baojing%10] ;  // 顯示十位
  157. P2 = 0xDF ;
  158. Delay(200) ;
  159. P0 = ~LEDData[baojing/10] ;  // 顯示百位
  160. P2 = 0xF7 ;
  161. Delay(200) ;
  162. if(set_st==1)P0 =~0xCE ;
  163. else if(set_st==2)P0 =~0x1A ;  // 上限 H 、下限 L 標示
  164. P2 = 0xFD ;
  165. Delay(200);
  166. P2 = 0xff ;  // 關閉顯示
  167. }
  168. /***** 報警子程序 *****/
  169. void Alarm()
  170. {
  171. if(x>=10){beep_st=~beep_st; x=0 ; }
  172. if(m>=shangxian)
  173. {
  174.    ALAM=0 ;
  175.    if(beep_st==1)
  176.    BEEP=0 ;
  177.    else
  178.    BEEP=1 ;
  179. }
  180. else if(m<xiaxian)
  181. {
  182.    ALAM1=0 ;
  183.    if(beep_st==1)
  184.    BEEP=0 ;
  185.    else
  186.    BEEP=1 ;
  187. }
  188. else
  189. {
  190.    BEEP=1 ;
  191.    ALAM=1 ;
  192.    ALAM1=1 ;
  193. }
  194. }

  195. /***** 主函數 *****/
  196. void main(void)
  197. {
  198. uint z ;
  199. InitTimer();  // 初始化定時器
  200. EA=1 ;  // 全局中斷開關
  201. TR0=1 ;
  202. ET0=1 ;  // 開啟定時器 0
  203. IT0=1 ;  
  204. IT1=1 ;
  205. check_wendu() ;
  206. check_wendu() ;
  207. for(z=0 ; z<300 ; z++)
  208. {
  209.   Disp_init() ;  
  210. }
  211. while(1)
  212. {
  213.   if(SET==0)
  214.   {
  215.    Delay(2000) ;
  216.    do{}while(SET==0);
  217.    set_st++; x=0 ; shanshuo_st=1 ;
  218.    if(set_st>2)set_st=0 ;
  219.   }
  220.   if(set_st==0)
  221.   {
  222.    EX0=0 ;  // 關閉外部中斷 0
  223.    EX1=0 ;  // 關閉外部中斷 1
  224.    check_wendu() ;
  225.    Disp_Temperature() ;
  226.    Alarm() ;  // 報警檢測
  227.   }
  228.    else if(set_st==1)
  229.    {
  230.     BEEP=1 ;  // 關閉蜂鳴器
  231.     ALAM=1 ;
  232.     ALAM1=1 ;
  233.     EX0=1 ;  // 開啟外部中斷 0
  234.     EX1=1 ;  // 開啟外部中斷 1
  235.     if(x>=10){shanshuo_st=~shanshuo_st ; x=0 ; }
  236.     if(shanshuo_st) {Disp_alarm(shangxian) ; }
  237.    }
  238.     else if(set_st==2)
  239.     {
  240.      BEEP=1 ;  // 關閉蜂鳴器
  241.      ALAM=1 ;
  242.      ALAM1=1 ;
  243.      EX0=1 ;  // 開啟外部中斷 0
  244.      EX1=1 ;  // 開啟外部中斷 1
  245.      if(x>=10){shanshuo_st=~shanshuo_st ; x=0 ; }
  246.      if(shanshuo_st) {Disp_alarm(xiaxian) ; }
  247.     }
  248. }
  249. }

  250. /***** 定時器 0 中斷服務程序 *****/
  251. void timer0(void) interrupt 1
  252. {
  253. TH0=0x3c ;
  254. TL0=0xb0 ;
  255. x++ ;
  256. }
  257. /***** 外部中斷 0 服務程序 *****/
  258. void int0(void) interrupt 0
  259. {

  260. EX0=0;  // 關外部中斷 0
  261. if(DEC==0&&set_st==1)
  262. {
  263.    do{
  264.    Disp_alarm(shangxian);
  265. }
  266.    while(DEC==0) ;
  267.    shangxian-- ;
  268.    if(shangxian<xiaxian)shangxian=xiaxian;
  269. }
  270. else if(DEC==0&&set_st==2)
  271. {
  272.    do{
  273.    Disp_alarm(xiaxian) ;
  274. }
  275.    while(DEC==0) ;
  276.    xiaxian-- ;
  277.    if(xiaxian<0)xiaxian=0 ;
  278. }
  279. }
  280. /***** 外部中斷 1 服務程序 *****/
  281. void int1(void) interrupt 2
  282. {
  283. EX1=0 ;  // 關外部中斷 1
  284. if(ADD==0&&set_st==1)
  285. {
  286.    do{
  287.    Disp_alarm(shangxian) ;
  288. }
  289.    while(ADD==0) ;
  290.    shangxian++ ;
  291.    if(shangxian>99)shangxian=99 ;
  292. }
  293. else if(ADD==0&&set_st==2)
  294. {
  295.    do{
  296.    Disp_alarm(xiaxian) ;
  297. }
  298.    while(ADD==0)  ;
  299.    xiaxian++ ;
  300.    if(xiaxian>shangxian)xiaxian=shangxian ;
  301. }
  302. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:922698 發表于 2021-5-17 15:19 | 只看該作者
20 21 行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久国产精品视频 | 99精品国产一区二区青青牛奶 | 九九成人 | 国产精品一区二区福利视频 | 一区二区在线免费观看 | 天天夜夜操 | 亚洲欧美日韩精品久久亚洲区 | 亚洲a在线观看 | 欧美成人激情 | 亚洲黄色片免费观看 | 日韩一区二区三区视频在线播放 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 一区二区三区四区在线视频 | 一区二区三区国产好 | 久久一级免费视频 | 国产精品国产a级 | 免费一区| 五月免费视频 | 国产一区二区欧美 | 黄色一级视频 | 国产专区在线 | 国产九九精品视频 | 久久乐国产精品 | 精品国产伦一区二区三区观看说明 | 国内精品久久久久久影视8 最新黄色在线观看 | 国产精品视频入口 | 久久高清国产视频 | 美女天天干天天操 | 国产精品久久久久久久久久久免费看 | 99热这里都是精品 | 久热免费 | 免费国产一区 | 国产精品久久片 | 午夜在线电影网 | 夜夜爽99久久国产综合精品女不卡 | 欧美一区二区视频 | 密室大逃脱第六季大神版在线观看 | 欧美日韩一区二区在线播放 | 国产精品久久国产精品久久 | 国产精品视频二区三区 | 久久久久久成人 |