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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1658|回復: 0
收起左側

單片機之間的串口通信程序問題分析

[復制鏈接]
ID:606493 發表于 2020-3-25 11:47 | 顯示全部樓層 |閱讀模式
U1單片機負責接收串口信號,把接收到的信號在1602上面顯示且1602同時顯示DS18B20的溫度,U2單片機負責發送信號,U2單片機連接的有一個ADC8080,通過ADC8080轉換后的GP2D12的數據會顯示在四位數碼管的前三位,最后一位當DP2D12檢測到的距離小于等于30時會為0,大于30時會為1;染然后把這個數據返回給U1,并在1602的第一行顯示0或1 ,且該顯示的數據會隨著U2傳送的數據而變化。
現在我遇到的問題是兩個單片機之間有信號的傳輸,但是無論U2傳輸的信號為1還是為0,在U1上的1602都顯示為0,不知道是傳輸的問題還是接受的問題,求大神解答一下!!!!非常感謝!!!!

一下是proteus仿真圖
此時1602應顯示1,但是顯示的卻是0 ,而且在仿真時U1的3.1口和U2的3.0口一直在高低電平之間切換,而U1的3.0和U2的3.1一直處于低電平
GYW]8153K@)X$K@}88QU8KD.png

單片機源程序如下:
  1. /********************U1的程序*******************************************/
  2. #include <reg52.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define LCD1602_DATAPINS P1
  6. uint temp=0,TJ=0,J=2,ADC;
  7. sbit DSPORT=P2^3;   //溫度(DS18B20)
  8. sbit LCD1602_E=P2^2;
  9. sbit LCD1602_RW=P2^1;
  10. sbit LCD1602_RS=P2^0;
  11. sbit EN1=P2^4;
  12. uchar Display_1[]="beam            ";
  13. uchar Display_2[]="T's 11.11  W's 0";
  14. void Init()
  15. {
  16. TMOD=0x20;
  17.   TH1=0xfd;
  18.   TL1=0xfd;
  19.   SCON=0x50;
  20.   PCON=0x00;
  21.   TR1=1;
  22. EA=1;
  23. }
  24. void delay(uint time)
  25. {
  26. uint i;
  27. for(time;time>0;time--)
  28.   for(i=110;i>0;i--);
  29. }
  30. uchar Ds18b20_Init()   //Ds18b20初始化函數,返回值為1表示存在,為0表示不存在
  31. {
  32. uint i=70;   
  33. DSPORT=0;
  34. while(i--);    //642us
  35. DSPORT=1;
  36. i=0;
  37. while(DSPORT)
  38. {
  39.   delay(1);   
  40.   i++;
  41.   if(i>5)
  42.    return 0;
  43. }
  44. return 1;
  45. }  
  46. void Ds18b20_write(uchar dat)   //ds18b20寫字節函數
  47. {
  48. uint i,j;
  49. for(j=0;j<8;j++)
  50. {
  51.   DSPORT=0;
  52.   i++;            //大于1us的延時
  53.   DSPORT=dat&0x01;
  54.   i=6;      
  55.   while(i--);          //68us
  56.   DSPORT=1;
  57.   dat>>=1;   
  58. }
  59. }
  60. uchar Ds18b20_read()      //ds18b20讀字節函數
  61. {
  62. uint i,j;
  63. uchar preserve,byte;     //preserve用于保存每一位的數據,byte用于返回數據
  64. for(j=8;j>0;j--)
  65. {
  66.   DSPORT=0;
  67.   i++;             //大于1us的延時
  68.   DSPORT=1;
  69.   i++;      
  70.   i++;
  71.   preserve=DSPORT;
  72.   byte=(byte>>1)|(preserve<<7);
  73.   i=4;     
  74.   while(i--);
  75. }
  76. return byte;
  77. }
  78. void Ds18b20_chanre()       //ds18b20溫度轉換函數
  79. {
  80. Ds18b20_Init();
  81. delay(1);      
  82. Ds18b20_write(0xcc);
  83. Ds18b20_write(0x44);
  84. }
  85. void Ds18b20_temp()        //使溫度傳感器開始讀取數據
  86. {
  87. Ds18b20_Init();
  88. delay(1);     
  89. Ds18b20_write(0xcc);
  90. Ds18b20_write(0xbe);
  91. }
  92. int Ds18b20_readtemp()       //溫度讀取函數
  93. {
  94. // int temp=0;
  95. uchar temph,templ;
  96. Ds18b20_chanre();
  97. Ds18b20_temp();
  98. templ=Ds18b20_read();
  99. temph=Ds18b20_read();
  100. temp=temph;
  101. temp<<=8;
  102. temp|=templ;
  103. return temp;
  104. }
  105. void datapros(int temp)      //數據處理函數
  106. {
  107. float tp;
  108. if(temp<0)
  109. {
  110.   temp=temp-1;
  111.   temp=~temp;
  112.   tp=temp;
  113.   temp=tp*0.0625*100+0.5;
  114. }
  115. else
  116. {
  117.   tp=temp;
  118.   temp=tp*0.0625*100+0.5;
  119. }
  120. Display_2[4]=temp % 10000 / 1000+'0';
  121. Display_2[5]=temp % 1000 / 100+'0';
  122. Display_2[7]=temp % 100 / 10+'0';
  123. Display_2[8]=temp % 10+'0';
  124. TJ = temp%10000/10;
  125. }
  126. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  127. {
  128.     uchar b;
  129. for(c; c>0; c--)
  130.   for(b=113;b>0;b--);   
  131. }
  132. void LcdWriteCom(uchar com)   //寫入命令
  133. {
  134. LCD1602_E = 0;     //使能
  135. LCD1602_RS = 0;    //選擇發送命令
  136. LCD1602_RW = 0;    //選擇寫入
  137. LCD1602_DATAPINS = com;     //放入命令
  138. Lcd1602_Delay1ms(1);  //等待數據穩定
  139. LCD1602_E = 1;           //寫入時序
  140. Lcd1602_Delay1ms(5);   //保持時間
  141. LCD1602_E = 0;
  142. }
  143. void LcdWriteData(uchar dat)   //寫入數據
  144. {
  145. LCD1602_E = 0; //使能清零
  146. LCD1602_RS = 1; //選擇輸入數據
  147. LCD1602_RW = 0; //選擇寫入
  148. LCD1602_DATAPINS = dat; //寫入數據
  149. Lcd1602_Delay1ms(1);
  150. LCD1602_E = 1;   //寫入時序
  151. Lcd1602_Delay1ms(5);   //保持時間
  152. LCD1602_E = 0;
  153. }
  154. void LcdInit()        //LCD初始化子程序
  155. {
  156.   LcdWriteCom(0x38);  //開顯示
  157. LcdWriteCom(0x0c);  //開顯示不顯示光標
  158. LcdWriteCom(0x06);  //寫一個指針加1
  159. LcdWriteCom(0x01);  //清屏
  160. LcdWriteCom(0x80);  //設置數據指針起點
  161. }
  162. void show()
  163. {
  164. uchar i;
  165. LcdInit();
  166. for(i=0;i<16;i++)
  167. {
  168.   LcdWriteData(Display_1[i]);
  169. }
  170. LcdWriteCom(0x40+0x80);
  171. for(i=0;i<16;i++)
  172. {
  173.   LcdWriteData(Display_2[i]);
  174. }
  175. // while(1);
  176. delay(5000);
  177. }
  178. void Fan()
  179. {
  180. if(TJ<250)
  181. {
  182.    EN1=0;
  183.    Display_2[15]='0';
  184. }
  185. else
  186. {
  187.   EN1=1;
  188.    Display_2[15]='1';
  189. }
  190. }
  191. void main()
  192. {
  193. Init();
  194. EN1=0;
  195. while(1)
  196. {
  197.   temp=Ds18b20_readtemp();
  198.   datapros(temp);
  199.   Fan();
  200.    while(RI==0);
  201.    RI=0;
  202.    ADC=SBUF;
  203.    if(ADC==0)
  204.     J=0;
  205.    else if(ADC==1)
  206.     J=1;
  207.   Display_1[8]=J+'0';
  208.   show();
  209. }
  210. }
  211. //void Init()interrupt 4
  212. //{
  213. // while(RI==0);
  214. //   RI=0;
  215. //   ADC=SBUF;
  216. //   if(ADC==0)
  217. //    J=0;
  218. //   else if(ADC==1)
  219. //    J=1;
  220. //}

  221. /**********************************以下是U2的程序**************************************/
  222. #include <reg52.h>
  223. #define uint unsigned int
  224. #define uchar unsigned char

  225. uint number[]={0,1,2,3,4,5,6,7,8,9,10};
  226. uint num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X00};
  227. sbit wei_1=P2^0;
  228. sbit wei_2=P2^1;
  229. sbit wei_3=P2^2;
  230. sbit wei_4=P2^3;
  231. sbit EOC=P3^0;
  232. sbit OE=P3^1;
  233. sbit ST=P3^2;
  234. sbit CLK=P3^6;
  235. uint adc_out,a1,a2,a3,J,temp=2;
  236. void Init()
  237. {
  238. // TMOD=0x20;
  239. SCON=0X50;
  240. TH1=0xfd;
  241. TL1=0xfd;
  242. PCON=0x00;
  243. TR1=1;
  244. }
  245. void ADC_Init()
  246. {
  247. TMOD=0X20;
  248. TH0=(65536-2)/256;
  249. TL0=(65536-2)%256;
  250. EA=1;
  251. ET0=1;
  252. TR0=1;
  253. }
  254. void delay(uint time)
  255. {
  256. uint i;
  257. for(time;time>0;time--)
  258.   for(i=110;i>0;i--);
  259. }
  260. void judgement()
  261. {
  262. if((adc_out*49/25)>=94)
  263. {
  264.   J=0;
  265.   temp=0;
  266. }
  267. else
  268. {
  269.   J=1;
  270.   temp=1;
  271. }
  272. }
  273. void adc_display()
  274. {
  275. P2=0xFF;
  276. judgement();
  277. a1=(adc_out*49/25)/100;
  278.   a2=(adc_out*49/25)/10%10;
  279.   a3=(adc_out*49/25)%100%10;

  280. wei_1=0;
  281. P0=num[number[a1]];
  282. delay(1);
  283. wei_1=1;

  284. wei_2=0;
  285. P0=num[number[a2]];
  286. delay(1);
  287. wei_2=1;

  288. wei_3=0;
  289. P0=num[number[a3]];
  290. delay(1);
  291. wei_3=1;

  292. wei_4=0;
  293. P0=num[number[J]];
  294. delay(1);
  295. wei_4=1;
  296. }
  297. void adc0808()
  298. {
  299. OE=0;
  300.   ST=0;
  301.   ST=1;//清0
  302.   ST=0;//啟動
  303.   delay(1);
  304.   while(!EOC);    //eoc等于零的話,在這里等待直到eoc=1,結束循環,向下執行
  305.   OE=1;
  306.   adc_out=P1;
  307.   OE=0;
  308. // adc_display();
  309. // return adc_out;
  310. }
  311. void main()
  312. {
  313. ADC_Init();
  314. Init();
  315. while(1)
  316. {
  317.   adc0808();
  318.   adc_display();
  319.   SBUF=temp;
  320.   while(TI==0);
  321.    TI=0;
  322. }
  323. }
  324. void T0_time()interrupt 1
  325. {
  326. TH0=(65536-2)/256;
  327. TL0=(65536-2)%256;
  328. CLK=~CLK;
  329. }
復制代碼

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区视频 | 亚洲精品久久久久国产 | 人人草人人干 | 日韩在线观看中文字幕 | 国产精品99久久久精品免费观看 | 亚洲黄色av | 欧美日韩一区二区三区在线观看 | 欧美日韩精品久久久免费观看 | h视频免费在线观看 | 日韩免费av网站 | 国产一区二区精品在线观看 | 黄色一级大片视频 | 国产精品美女久久久久aⅴ国产馆 | 欧美在线a | 一区二区在线不卡 | 一区二区三区四区在线视频 | 一区二区三区在线免费 | 中文字幕在线免费观看 | 中文字幕国产视频 | 国产精品1 | 可以在线看的黄色网址 | 暖暖成人免费视频 | 亚洲欧美精品 | 农夫在线精品视频免费观看 | 一级片免费在线观看 | 婷婷开心激情综合五月天 | 免费成人高清在线视频 | 久久视频精品在线 | 999热在线视频 | 久久精品亚洲国产奇米99 | 欧美精品首页 | 久久久国产一区 | 国产一区精品 | 在线观看国产精品一区二区 | 在线观看黄色大片 | 欧美精品一区在线观看 | 蜜桃久久| 91免费视频观看 | 福利在线观看 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 在线免费观看视频你懂的 |