找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1544|回复: 0
打印 上一主题 下一主题
收起左侧

哪位大佬帮忙看看单片机仿真时,按键不起作用,非常感谢

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include<absacc.h>
  4. #define uint unsigned int
  5. #define unchar unsigned char
  6. unchar templ, temph, i, y, z, n;
  7. unchar a, b; //LCD 的变量
  8. unchar sign=0; //标志变量
  9. bit k; //判断正负变量
  10. sbit dq=P3^5;
  11. sbit rs=P2^0; //LCD 显示的定义取值
  12. sbit rw=P2^1;
  13. sbit e=P2^2;
  14. sbit bf=P0^7;
  15. sbit DQ=P2^5;
  16. //键盘定义
  17. sbit read=P3^0;
  18. sbit incH=P3^2;
  19. sbit desH=P3^3;
  20. sbit reset=P3^4;

  21. //蜂鸣器
  22. sbit BUZZER=P2^6;
  23. float t4, t5, t6, t7, tt; //温度转换的变量
  24. uint tp;
  25. unchar temperature, Htemp, Ltemp;
  26. unchar D1, D2, D3;
  27. uint D4, D5, D6, D9, D7, D8;
  28. unchar code dis1[]={"0123456789"} ;
  29. unchar code dis2[]={"temp: "} ;
  30. unchar code dis3[]={"WARN"} ;
  31. unchar code dis4[]={"Htemp: "} ;
  32. unchar code dis5[]={"working"} ;
  33. unchar code dis6[]={"Ltemp: "} ;
  34. bit flag_1820_1;
  35. bit flag_1820_2;
  36. void delay_ms(unsigned char time) ;
  37. void ledshow(void) ;
  38. void keypress(void) ;
  39. void init(void) ;
  40. void gettemp() ;
  41. void init1820(void) ;
  42. void write1820(unchar) ;
  43. unsigned char read1820(void) ;
  44. void delay_us(unchar) ;
  45. void delay3(unchar) ;
  46. /* 延时*/
  47. void delay(uint t)
  48. { uint i;
  49. while(t--)
  50. { for(i=0; i<121; i++)
  51. {}
  52. }
  53. }
  54. //LCD 显示函数
  55. void delay1(unchar time)
  56. { unchar n;
  57. n=0;
  58. while(n<time)
  59. {n++; }
  60. return;
  61. }
  62. void delay3(unchar x)
  63. { for(y=x; y>0; y--)
  64. for(z=x; z>0; z--) ;
  65. }
  66. unchar testBF()
  67. { bit result;
  68. rs=0;rw=1;e=1;
  69. _nop_() ; _nop_() ; _nop_() ; _nop_() ;
  70. result=bf; e=0;
  71. return result;
  72. }
  73. void writecmd(unchar ZL)
  74. { while(testBF() ==1) ;
  75. rs=0; rw=0; e=0;
  76. _nop_() ; _nop_() ;
  77. P0=ZL; e=1;
  78. _nop_() ; _nop_() ; _nop_() ; _nop_() ;
  79. e=0;
  80. }
  81. void pos(unchar pos)
  82. { writecmd(pos| 0x80) ;
  83. }
  84. void writedate(unchar date)
  85. {while(testBF() ==1) ;
  86. rs=1; rw=0; e=0;
  87. _nop_() ;_nop_() ;
  88. P0=date; e=1;
  89. _nop_() ; _nop_() ; _nop_() ; _nop_() ;
  90. e=0;
  91. }
  92. void init()
  93. { delay3(20) ;
  94. writecmd(0x38) ;
  95. delay3(30) ;
  96. writecmd(0x0d) ;
  97. delay3(30) ;
  98. writecmd(0x06) ;
  99. delay3(30) ;
  100. writecmd(0x01) ;
  101. delay3(30) ;
  102. }
  103. //键盘程序
  104. //主程序
  105. void main(void)
  106. {
  107. TMOD=0x01;
  108. TH0=50000/256;
  109. TL0=50000%256;
  110. Htemp=121;Ltemp=20;
  111. P3=0xFF;
  112. init() ;
  113. if(sign==0)
  114. {EA=1; TR0=1; ET0=1;
  115. EX0=0; //关闭外部中断 0
  116. EX1=0; //关闭外部中断 1
  117. while(1)
  118. {
  119. if(read==0)
  120. {
  121. delay3(2000) ;
  122. if(read==0)
  123. {sign++;}
  124. }
  125. }
  126. }
  127. if(sign==1)
  128. {
  129. BUZZER=1; //关闭蜂鸣器
  130. EX0=1; //开启外部中断 0
  131. EX1=1; //开启外部中断 1
  132. init() ;
  133. pos(0) ;
  134. for(i=0; i<6; )
  135. { writedate(dis4[i]);i++;
  136. }
  137. D6=Htemp%10;
  138. D7=Htemp%100/10;
  139. D8=Htemp/100;
  140. pos(0x6) ;
  141. writedate(dis1[D8]);
  142. writedate(dis1[D7]) ; }
  143. if(sign==2)
  144. {BUZZER=1; //关闭蜂鸣器
  145. EX0=1; //开启外部中断 0
  146. EX1=1; //开启外部中断 1
  147. init() ;
  148. pos(0) ;
  149. for(i=0; i<6; )
  150. { writedate(dis6[i]) ; i++; }
  151. D6=Htemp%10;
  152. D7=Htemp%100/10;
  153. D8=Htemp/100;
  154. pos(0x6) ;
  155. writedate(dis1[D8]) ;
  156. writedate(dis1[D7]) ;
  157. writedate(dis1[D6]) ;
  158. }
  159. if(sign>2)
  160. { sign=0; }
  161. }
  162. //中断程序
  163. void int0(void) interrupt 0
  164. {
  165. EX0=0; //关外部中断 0
  166. if(desH==0&&sign==1)
  167. {
  168. Htemp--;
  169. if(Htemp<Ltemp)
  170. Htemp=Ltemp;
  171. }
  172. else if(desH==0&&sign==2)
  173. {
  174. Ltemp--;
  175. }
  176. }
  177. /*****外部中断 1 服务程序*****/
  178. void int1(void) interrupt 2
  179. {
  180. EX1=0; //关外部中断 1
  181. if(incH==0&&sign==1)
  182. {
  183. Htemp++;
  184. }
  185. else if(incH==0&&sign==2)
  186. {
  187. Ltemp++;
  188. if(Ltemp>Htemp)
  189. Ltemp=Htemp;
  190. }
  191. }
  192. //定时器 T0 服务程序
  193. void isr_t0(void) interrupt 1
  194. { TH0=50000/256;
  195. TL0=50000%256;
  196. TMOD=0x10;
  197. TH1=50000/256;
  198. TL1=50000%256;
  199. gettemp() ;
  200. delay(50) ;
  201. if (tp<Htemp)
  202. { BUZZER=1;
  203. pos(0x04) ;
  204. for(i=0; i<7; )
  205. {
  206. writedate(dis5[i]) ;
  207. i++;
  208. }
  209. pos(0x40) ;
  210. for(i=0; i<5; )
  211. {writedate(dis2[i]) ;
  212. i++; }
  213. D1=(unchar) (tp%10) ;
  214. D2=(unchar) (tp%100/10) ;
  215. D3=(unchar) (tp/100) ;
  216. D4=(uint) (tt*10) ;
  217. D5=((uint) (tt*100) ) %10;

  218. if(k==1)
  219. {pos(0x46);
  220. writedate('-');}
  221. else

  222. pos(0x47);
  223. writedate(dis1[D3]) ;
  224. writedate(dis1[D2]) ;
  225. writedate(dis1[D1]) ;
  226. writedate('.');
  227. writedate(dis1[D4]) ;
  228. writedate(dis1[D5]) ;
  229. writedate(0xdf) ;
  230. writedate('C') ;
  231. }
  232. else
  233. { init() ;
  234. pos(0x04) ;
  235. for(i=0; i<4; )
  236. {
  237. writedate(dis3[i]) ;
  238. i++; }
  239. BUZZER=0;
  240. }
  241. }
  242. //DS18B20 读取温度
  243. void gettemp()
  244. {
  245. init1820() ;
  246. write1820(0xcc) ;
  247. write1820(0x44) ;
  248. init1820() ;
  249. write1820(0xcc) ;
  250. write1820(0xbe) ;
  251. templ=read1820() ; //低 8 位(其中的第四位是小数点后的)
  252. temph=read1820() ; //高 8 位(其中前五位是符号值)
  253. z=temph; //把符号位留下判断正负
  254. k=(bit) (z>>7) ;
  255. if(k==1) //负数就取反加一
  256. { templ=~templ;
  257. templ=templ+1;
  258. temph=~temph;
  259. }
  260. else
  261. {templ=templ;
  262. temph=temph; }
  263. n=templ;
  264. y=n&0x01;
  265. t7=y*0.0625;
  266. n>>=1;
  267. y=n&0x01; //小数点最后的数
  268. t4=y*0.125;
  269. n>>=1;
  270. y=n&0x01;
  271. t5=y*0.25;
  272. n>>=1;
  273. y=n&0x01;
  274. t6=y*0.5;
  275. tt=t4+t5+t6+t7;
  276. init1820() ;
  277. tp=temph*256+templ;
  278. temperature=tp;
  279. tp=tp>>4;
  280. }
  281. //1820 初始化
  282. void init1820()
  283. {
  284. DQ = 1; _nop_() ;
  285. DQ = 0;
  286. delay_us(120) ; //延时 510us,
  287. delay_us(120) ;
  288. DQ = 1;
  289. delay_us(15) ;
  290. while(DQ)
  291. { _nop_() ; }
  292. delay_us(60) ;
  293. DQ = 1;
  294. }
  295. //******write********
  296. void write1820(unchar a)
  297. {
  298. unchar i;
  299. for(i=0; i<8; i++)
  300. {if(a & 0x01) //低位在前;
  301. {DQ = 0;
  302. _nop_() ; _nop_() ; _nop_() ;
  303. DQ = 1; }
  304. else
  305. DQ = 0;
  306. _nop_() ; _nop_() ; _nop_() ;
  307. delay_us(30) ;
  308. DQ = 1;
  309. _nop_() ;
  310. a >>= 1;
  311. }
  312. }
  313. //*******read************
  314. unsigned char read1820(void)
  315. {
  316. unsigned char i;
  317. unsigned char tmp=0;
  318. DQ = 1; _nop_() ;
  319. for(i=0; i<8; i++)
  320. {
  321. tmp >>= 1;
  322. DQ = 0;
  323. _nop_() ;
  324. DQ = 1;
  325. delay_us(2) ;
  326. _nop_() ;
  327. if(DQ)
  328. tmp |= 0x80;
  329. delay_us(30) ;
  330. DQ = 1; _nop_() ;
  331. }
  332. return tmp; }
  333. void delay_us(unchar a)
  334. {
  335. while(--a) ;
  336. }
  337. void delay_ms(unchar a)
  338. {
  339. unchar i, j;
  340. for(i=0; i<a; i++)
  341. for(j=0; j<200; j++)
  342. {
  343. _nop_() ;
  344. _nop_() ;
  345. }
  346. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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