找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1567|回复: 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 单片机教程网

快速回复 返回顶部 返回列表