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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2439|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

自己在網(wǎng)上搜資料做了一個(gè)51單片機(jī)雙機(jī)通訊的程序,發(fā)現(xiàn)數(shù)據(jù)傳輸有問(wèn)題,幫忙看看。

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本來(lái)是想著用1602把接收到的數(shù)據(jù)顯示出來(lái),可是只顯示白塊。這是程序,希望大家可以幫忙看看。

單片機(jī)主機(jī)程序:
  1. #include <REGX51.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit lcdrw=P2^5;
  6. sbit lcdrs=P2^6;
  7. sbit lcden=P2^7;
  8. uchar kkk[6];
  9. uchar code table[6]={"123456"};        //6
  10. uchar num;
  11. void delayms(uchar xms)
  12. {
  13.   uint i,j;
  14.   for(i=xms;i>0;i--)
  15.      for(j=110;j>0;j--);
  16. }
  17. //1602顯示
  18. void write_com(uchar com)
  19. {
  20.   lcdrs=0;
  21.   lcdrw=0;
  22.   P0=com;
  23.   delayms(5);
  24.   lcden=1;
  25.   lcden=0;
  26. }
  27. void write_date(uchar date)
  28. {
  29.   lcdrs=1;
  30.   lcdrw=0;
  31.   P0=date;
  32.   delayms(5);
  33.   lcden=1;
  34.   lcden=0;
  35. }
  36. void init()
  37. {
  38.   lcdrs=1;
  39.   lcdrw=0;
  40.   write_com(0x38);
  41.   write_com(0x0c);
  42.   write_com(0x06);
  43.   write_com(0x01);
  44.   write_com(0x80);
  45. }
  46. //////////////////////////////////////////////////
  47. void err()
  48. {
  49.   SBUF=0xff;
  50.   while(TI!=1);
  51.   TI=0;
  52. }
  53. uchar kkkk(uchar addr,uchar comm)
  54. {
  55.   uchar aa,p,i;
  56.   while(1)
  57.   {
  58.     SBUF=0x02;                        //發(fā)呼叫地址
  59.         while(TI!=1);
  60.               TI=0;
  61.         while(RI!=1);
  62.               RI=0;                                //等待回應(yīng)
  63.         if(SBUF!=addr)                        
  64.            err();                                //若地址發(fā)錯(cuò),發(fā)復(fù)位信號(hào)
  65.         else
  66.         {                                                //若地址相符
  67.           TB8=0;                                //清地址標(biāo)記
  68.           SBUF=comm;                        //發(fā)命令
  69.           while(TI!=1);                        
  70.                 TI=0;
  71.           while(RI!=1);
  72.                 RI=0;
  73.           aa=SBUF;                                //接受狀態(tài)
  74.           if((aa&0x08)==0x08)        //若命令未被接受,發(fā)送復(fù)位信號(hào)
  75.           {
  76.             TB8=1;
  77.                 err();
  78.           }
  79.           else
  80.           {
  81.             if(comm==0x01)                //是發(fā)送命令
  82.                 {
  83.                   if((aa&0x01)==0x01)         //從機(jī)已做好接受準(zhǔn)備
  84.                   {
  85.                     do
  86.                         {
  87.                           p=0;                                //清校驗(yàn)和
  88.                           for(num=0;num<6;num++)
  89.               {
  90.                 SBUF=table[num];                  //發(fā)送一位數(shù)據(jù)
  91.                     p+=table[num];
  92.                     while(!TI);
  93.                     TI=0;
  94.               }
  95.                           SBUF=p;                                         //發(fā)送校驗(yàn)和
  96.                           while(TI!=1);
  97.                                 TI=0;
  98.                           while(RI!=1);
  99.                                 RI=0;
  100.                         }
  101.                         while(SBUF!=0);                          //接收不正確,重新發(fā)送
  102.                         TB8=1;                                          //置地址標(biāo)志
  103.                         return(0);
  104.                   }
  105.                  else
  106.                   {
  107.                     if((aa&0x02)==0x02)                  //接收信號(hào),從機(jī)準(zhǔn)備發(fā)送
  108.                         {
  109.                           while(1)
  110.                           {
  111.                             p=0;                                  //清校驗(yàn)和
  112.                                 for(i=0;1<6;i++)
  113.                                 {
  114.                                   while(RI!=1);
  115.                                         RI=0;
  116.                                                 kkk[i]=SBUF;  //接收一位數(shù)據(jù)
  117.                                                 p+=kkk[i];
  118.                                 }
  119.                                 while(RI!=1);
  120.                                           RI=0;
  121.                                 if(SBUF==p)
  122.                                 {
  123.                                   SBUF=0x00;                 //校驗(yàn)和相同發(fā)00
  124.                                   while(TI!=1);
  125.                                         TI=0;
  126.                                                 break;
  127.                                 }
  128.                                 else
  129.                                 {
  130.                                   SBUF=0xff;                //校驗(yàn)和不同發(fā)0ff重新接受
  131.                                   while(TI!=1);
  132.                                         TI=0;
  133.                                 }
  134.                           }
  135.                           TB8=1;                                //重置地址標(biāo)記
  136.                           return(0);
  137.                         }
  138.                   }
  139.                 }
  140.           }
  141.         }
  142.   }
  143. }
  144. void main()
  145. {

  146.   init();
  147.   TMOD=0x20;
  148.   TH1=0xfd;
  149.   TL1=0xfd;
  150.   PCON=0x00;
  151.   TR1=1;
  152.   SCON=0xf0;
  153.   /*SM0=0;
  154.   SM1=1;
  155.   EA=1;
  156.   ES=1;*/                           
  157.    write_com(0x80);
  158.    for(num=0;num<6;num++)
  159.    {
  160.      write_date(table[num]);
  161.          delayms(6);
  162.    }
  163.          kkkk(0x02,0x01);           
  164.   while(1);

  165. }


  166. 從機(jī)程序:
  167. #include <REGX51.H>
  168. #define uchar unsigned char
  169. #define uint unsigned  int
  170. void str(void);
  171. void sre(void);
  172. uchar kkk[6];
  173. bit   tready;
  174. bit   rready;
  175. sbit  lcdrw=P2^6;
  176. sbit  lcdrs=P2^5;
  177. sbit  lcden=P2^7;
  178. uchar kkkk[6];
  179. void delayms(char xms)
  180. {
  181.   uint i,j;
  182.   for(i=xms;i>0;i--)
  183.       for(j=110;j>0;j--);
  184. }
  185. // 1602顯示
  186. void write_com(uchar com) //寫數(shù)據(jù)
  187. {
  188.   lcdrs=0;
  189.   lcdrw=0;
  190.   P0=com;
  191.   delayms(5);
  192.   lcden=1;
  193.   lcden=0;
  194. }
  195. void write_date(uchar date)                  //讀數(shù)據(jù)
  196. {
  197. lcdrs=1;
  198. lcdrw=0;
  199. P0=date;
  200. delayms(5);
  201. lcden=1;
  202. lcden=0;
  203. }
  204. void init1()   //初始化
  205.   {
  206.   lcdrs=1;
  207.   lcdrw=0;
  208.   write_com(0x38);
  209.   write_com(0x0c);
  210.   write_com(0x06);
  211.   write_com(0x01);
  212.   write_com(0x80);
  213. }
  214. void main()
  215. {
  216.   init1();
  217.   TMOD=0x20;                  //方式二
  218.   TH1=0xfd;                          //設(shè)初值
  219.   TL1=0xfd;
  220.   PCON=0x00;
  221.   TR1=1;
  222.   SCON=0xf0;                  //方式三
  223.   EA=1;
  224.   ES=1;                                 //開(kāi)串行口中斷
  225.   while(1)
  226.   {        
  227.           uchar j;
  228.     tready=1;
  229.         rready=1;                 //假定準(zhǔn)備好發(fā)送與接收
  230.     for(j=0;j<6;j++)
  231.     {
  232.           write_com(0x80+j);
  233.           write_date(kkkk[j]);
  234.     }
  235.   }
  236. }
  237. void ser() interrupt 4
  238. {
  239.   /*uchar ddd;
  240.   RI=0;
  241.   ddd=SBUF;
  242.   write_com(0x80);
  243.   write_date(ddd);
  244. */
  245.   uchar a;
  246.   RI=0;
  247.   ES=0;                                 //關(guān)串行口中斷
  248.   if(SBUF!=0x02)
  249.   {
  250.     ES=1;
  251.         goto reti;
  252.   }                                         
  253.   SM2=0;
  254.   SBUF=0x02;
  255.   while(TI!=1);
  256.         TI=0;
  257.   while(RI!=1);
  258.         RI=0;
  259.   if(RB8==1)
  260.   {
  261.     SM2=1;
  262.         ES=1;
  263.         goto reti;
  264.   }
  265.   a=SBUF;                          //接受命令
  266.   if(a==0x01)                  //判斷從主機(jī)接受的命令
  267.   {
  268.     if(rready==1)
  269.           SBUF=0x01;          //接受準(zhǔn)備好,發(fā)送狀態(tài)
  270.         else
  271.           SBUF=0x00;
  272.         while(TI!=1);
  273.               TI=0;
  274.         while(RI!=1);
  275.               RI=0;
  276.         if(RB8==1)
  277.         {
  278.           SM2=1;
  279.           ES=1;
  280.           goto reti;
  281.         }
  282.         sre();                          //接收數(shù)據(jù)
  283.   }
  284.   else
  285.   {
  286.     if(a==0x02)                  //從機(jī)向主機(jī)發(fā)送數(shù)據(jù)
  287.         {
  288.           if(tready==1)
  289.              SBUF=0x02;           //準(zhǔn)備好發(fā)送狀態(tài)
  290.           else
  291.              SBUF=0x00;
  292.           while(TI!=1);
  293.                 TI=0;
  294.           while(RI!=1);
  295.                 RI=0;
  296.           if(RB8==1)
  297.           {
  298.             SM2=1;
  299.                 ES=1;
  300.                 goto reti;
  301.           }
  302.           str();                  //發(fā)送數(shù)據(jù)
  303.         }
  304.         else
  305.         {
  306.           SBUF=0x80;         //命令非法,發(fā)狀態(tài)
  307.           while(TI!=1);
  308.                 TI=0;
  309.                         SM2=1;
  310.                         ES=1;         //繼續(xù)監(jiān)聽(tīng)
  311.         }
  312.   }
  313.   reti:;
  314. }
  315. void  str(void)                //發(fā)送數(shù)據(jù)塊
  316. {
  317.   uchar p,i;
  318.   tready=0;
  319.   do
  320.   {
  321.     p=0;
  322.         for(i=0;i<6;i++)
  323.         {
  324.           SBUF=kkk[6];                                //發(fā)一位數(shù)據(jù)
  325.           p+=kkk[6];
  326.           TI=0;
  327.         }
  328.         SBUF=p;                                                //發(fā)送校驗(yàn)和
  329.         while(TI!=1);
  330.               TI=0;
  331.         while(RI!=1);
  332.               RI=0;
  333.   }
  334.   while(RI!=1);                                  //主機(jī)接受不正確,重新發(fā)送
  335.   SM2=1;
  336.   ES=1;
  337. }
  338. void sre(void)                                  //接收模塊
  339. {
  340.   uchar p,i;
  341.   rready=0;
  342.   while(1);
  343.   {
  344.     p=0;                                         //清校驗(yàn)和
  345.         for(i=0;i<6;i++)
  346.         {
  347.           while(RI!=1);
  348.                 RI=0;
  349.           kkkk[i]=SBUF;                         //接收數(shù)據(jù)
  350.           p+=kkkk[i];
  351.         }
  352.         while(RI!=1);
  353.               RI=0;
  354.         if(SBUF==p)
  355.         {
  356.           SBUF=0x00;                         //校驗(yàn)和相同發(fā)00
  357.         }
  358.         else
  359.         {
  360.           SBUF=0xff;                        //不同發(fā)0ff,重新接收
  361.           while(TI==0);
  362.                 TI=0;
  363.         }
  364.   }
  365.   SM2=1;
  366.   ES=1;
  367. }
復(fù)制代碼



已經(jīng)整了好幾天了,資料啥的都找過(guò)了,也沒(méi)找出個(gè)眉目來(lái),希望大家可以幫忙找找問(wèn)題所在。

IMG_20190526_111901.jpg (3.8 MB, 下載次數(shù): 44)

現(xiàn)象如圖所示

現(xiàn)象如圖所示

IMG_20190526_153710.jpg (4.4 MB, 下載次數(shù): 45)

這是第二種方法,將數(shù)據(jù)拆分,一位一位的發(fā)送,但實(shí)際情況如圖

這是第二種方法,將數(shù)據(jù)拆分,一位一位的發(fā)送,但實(shí)際情況如圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:149451 發(fā)表于 2019-5-26 13:03 | 只看該作者
兩個(gè)單片機(jī)控制一個(gè)LCD1602 ?那不亂套!主機(jī)控制即可,從機(jī)數(shù)據(jù)處理后通過(guò)串口等于主機(jī)聯(lián)系,由主機(jī)控制顯示及刷新
回復(fù)

使用道具 舉報(bào)

板凳
ID:478845 發(fā)表于 2019-5-26 13:19 | 只看該作者
千萬(wàn)不要沉啊,自頂一下
回復(fù)

使用道具 舉報(bào)

地板
ID:478845 發(fā)表于 2019-5-26 13:43 | 只看該作者
w1179benp 發(fā)表于 2019-5-26 13:03
兩個(gè)單片機(jī)控制一個(gè)LCD1602 ?那不亂套!主機(jī)控制即可,從機(jī)數(shù)據(jù)處理后通過(guò)串口等于主機(jī)聯(lián)系,由主機(jī)控制顯 ...

只有小板子控制1602,大板子上面的沒(méi)有1602(拆走了,雖然有寫1602的程序),兩個(gè)板子是相互獨(dú)立的,除了數(shù)據(jù)傳輸
回復(fù)

使用道具 舉報(bào)

5#
ID:478845 發(fā)表于 2019-5-26 14:13 | 只看該作者
w1179benp 發(fā)表于 2019-5-26 13:03
兩個(gè)單片機(jī)控制一個(gè)LCD1602 ?那不亂套!主機(jī)控制即可,從機(jī)數(shù)據(jù)處理后通過(guò)串口等于主機(jī)聯(lián)系,由主機(jī)控制顯 ...

不是兩個(gè)控制一個(gè),是小的單片機(jī)從大的哪里獲得數(shù)據(jù),并用1602顯示出來(lái)。
回復(fù)

使用道具 舉報(bào)

6#
ID:478845 發(fā)表于 2019-5-26 15:39 | 只看該作者
我又試了試一個(gè)新的方式,將數(shù)據(jù)拆分,一位一位的發(fā)送。雖然能夠顯示了,但是從機(jī)顯示的數(shù)據(jù)與主機(jī)顯示數(shù)據(jù)完全不符。
回復(fù)

使用道具 舉報(bào)

7#
ID:478845 發(fā)表于 2019-5-26 15:43 | 只看該作者
我又試了試別的方法,將數(shù)據(jù)拆分,一位一位的發(fā)送,雖然能夠顯示,但從機(jī)與主機(jī)顯示的數(shù)據(jù)有很大的誤差。
回復(fù)

使用道具 舉報(bào)

8#
ID:478845 發(fā)表于 2019-5-27 18:16 | 只看該作者
請(qǐng)大家給我一點(diǎn)指導(dǎo)
回復(fù)

使用道具 舉報(bào)

9#
ID:478845 發(fā)表于 2019-6-2 14:26 | 只看該作者
問(wèn)題已經(jīng)解決了,兩個(gè)單片機(jī)的晶振不一樣,導(dǎo)致波特率不同,所以在數(shù)據(jù)傳輸過(guò)程中,使得數(shù)據(jù)發(fā)生了偏差。
回復(fù)

使用道具 舉報(bào)

10#
ID:507927 發(fā)表于 2019-6-5 20:25 | 只看該作者
xoxojojo 發(fā)表于 2019-6-2 14:26
問(wèn)題已經(jīng)解決了,兩個(gè)單片機(jī)的晶振不一樣,導(dǎo)致波特率不同,所以在數(shù)據(jù)傳輸過(guò)程中,使得數(shù)據(jù)發(fā)生了偏差。

樓主你好,默認(rèn)晶振都是12MHz嗎,只要一樣就可以對(duì)吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产免费一二三区 | 成人国产精品久久 | 日韩三区 | 在线日韩欧美 | 久久99精品久久久 | 999精品网 | 国产精品区二区三区日本 | 欧美久久视频 | 国产欧美精品一区二区三区 | 在线国产小视频 | 波多野结衣中文视频 | 欧美一区二区黄 | 欧美精品一区二区三区在线播放 | 日韩欧美在线一区 | 亚洲福利一区二区 | 久久手机在线视频 | 日韩久久久久久久 | 99久久婷婷国产亚洲终合精品 | 羞羞视频网站免费观看 | 久草热线 | 97久久精品 | 天天干在线播放 | 91.com在线观看 | 国产又色又爽又黄又免费 | 久久久精品一区 | 精品国产三级 | 中文日韩字幕 | 日本一区二区三区在线观看 | 国产一级视频免费播放 | 欧美精品一二三 | 成人精品在线观看 | 玖玖精品| 91精品久久久久久综合五月天 | 欧美精品成人一区二区三区四区 | 99精品热视频 | 操操日 | 91久久国产综合久久 | 不卡一区二区在线观看 | 亚洲人精品 | 成人免费看电影 | 久久毛片|