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

標(biāo)題: 單片機(jī)雙機(jī)主從串行通信源程序 注釋詳細(xì) 原理圖與Proteus仿真 [打印本頁(yè)]

作者: 51黑電子迷    時(shí)間: 2017-5-7 22:45
標(biāo)題: 單片機(jī)雙機(jī)主從串行通信源程序 注釋詳細(xì) 原理圖與Proteus仿真
下面是單片機(jī)主從串行通信的proteus仿真原理圖(工程文件可到本帖附件中下載):

以上仿真完美實(shí)現(xiàn)了單片機(jī)雙機(jī)通信.

單片機(jī)主從串行通信源程序如下:
  1. # include <STC12C5A60S2.h>
  2. # define uchar unsigned char
  3. # define vtime        10000   //定時(shí)3ms,一幀8*3=24ms,頻率=40Hz
  4. # define sub1        0x11   
  5. # define sub2        0x12  
  6. sbit LED11=P1^0;
  7. sbit LED12=P1^1;
  8. sbit LED21=P1^2;
  9. sbit LED22=P1^3;
  10. uchar        over_t=0;
  11. uchar        addr=sub1,sum=0,count1,count2;
  12. //uchar i,j,temp,m=0x01;

  13. uchar        tn=0;  //發(fā)送循環(huán)變量
  14. uchar        txdv[3];
  15. void main( )
  16. {
  17. /*        //m1:m0  00=標(biāo)準(zhǔn);   01=推挽;   10=輸入;   11=開(kāi)漏輸出
  18.         P2M1 = 0X00;
  19.         P2M0 = 0Xff;
  20.         P1M1 = 0X00;
  21.         P1M0 = 0Xff; //設(shè)定P2,P1推挽輸出
  22.         P3M1 = 0X0d;
  23.         P3M0 = 0X02;
  24. */        //
  25.         SCON = 0xd0;
  26.         PCON = 0X80;
  27.         TH1 = 0XFd;
  28.         TL1 = 0XFd;
  29.         IT0 = 1; //        中斷0為邊沿觸發(fā)
  30.           IT1 = 1; //        中斷1為邊沿觸發(fā)
  31.        
  32.           TMOD = 0X21; //設(shè)定定時(shí)器0為16位計(jì)數(shù)方式
  33.           TH0 = (65536-vtime )/256;
  34.           TL0 = (65536-vtime )%256; //賦定時(shí)器0初值
  35.           ET0 = 1;  //開(kāi)定時(shí)器0中斷
  36.            TR0 = 1;  //啟動(dòng)定時(shí)器0計(jì)數(shù)
  37.            TR1 = 1;  //啟動(dòng)定時(shí)器1計(jì)數(shù)
  38.         EX1 = 1;  //開(kāi)中斷1
  39.         EX0 = 1;  //開(kāi)中斷0
  40.         SM2 = 0;
  41.         TB8 = 1;
  42.         ES = 1;
  43.           EA = 1;          //開(kāi)總中斷

  44.         while(1);
  45. }
  46. void t0_isp() interrupt 1
  47. {
  48.         //uchar dm,wx;
  49.           TH0 = (65536-vtime )/256;
  50.           TL0 = (65536-vtime )%256; //賦定時(shí)器0初值
  51.         if(over_t != 0)
  52.         {
  53.                 over_t--;
  54.                 if(over_t==30)
  55.                 {       
  56.                         if(addr==sub1)
  57.                         {
  58.                         //        LED11=1;
  59.                                 IE0 = 0;   //中斷0的源清零
  60.                                  EX0 = 1;  //開(kāi)中斷0
  61.                         }
  62.                         else
  63.                         {
  64.                         //        LED21=1;
  65.                                 IE1 = 0;   //中斷0的源清零
  66.                                  EX1 = 1;  //開(kāi)中斷0
  67.                         }

  68.                 }
  69.                 if(over_t==0)
  70.                 {       
  71.                         if(addr==sub1)
  72.                         {
  73.                                 LED11=1;
  74.                                 //IE0 = 0;   //中斷0的源清零
  75.                                  //EX0 = 1;  //開(kāi)中斷0
  76.                         }
  77.                         else
  78.                         {
  79.                                 LED21=1;
  80.                                 //IE1 = 0;   //中斷0的源清零
  81.                                  //EX1 = 1;  //開(kāi)中斷0
  82.                         }

  83.                 }

  84.         }
  85. }
  86. void int0_isp() interrupt 0
  87. {
  88.         count1++;
  89.         addr=sub1;
  90.         sum=sub1;
  91.         txdv[0]=addr;
  92.         sum=sum+count1;
  93.         txdv[1]=count1;
  94.         txdv[2]=sum;
  95.         TB8=1;
  96.         SBUF=sub1;
  97.         LED12=1;
  98.         LED11=0;
  99.         EX0 = 0;          //  關(guān)中斷0
  100.         over_t=50;
  101. }
  102. void int1_isp() interrupt 2
  103. {
  104.         count2++;
  105.         addr=sub2;
  106.         sum=sub2;
  107.         txdv[0]=addr;
  108.         sum=sum+count2;
  109.         txdv[1]=count2;
  110.         txdv[2]=sum;
  111.         TB8=1;
  112.         SBUF=sub2;
  113.         LED22=1;
  114.         LED21=0;
  115.         EX1 = 0;          //  關(guān)中斷0
  116.         over_t=50;
  117. }
  118. void         uart_isp( ) interrupt 4
  119. {
  120.         if(RI==1)
  121.         {
  122.                 RI=0;
  123.                 if(addr==SBUF)
  124.                 {
  125.                         if(addr==sub1)
  126.                         {
  127.                                 LED12=0;
  128.                         }
  129.                         if(addr==sub2)
  130.                         {
  131.                                 LED22=0;
  132.                         }
  133.                 }
  134.         }
  135.         if(TI==1)
  136.         {
  137.                 tn++;
  138.                 TI=0;
  139.                 if(tn>=3)
  140.                 {
  141.                         tn=0;
  142.                         TB8=1;
  143.                         return;
  144.                 }
  145.                 if(tn<3)
  146.                 {
  147.                         TB8=0;
  148.                         SBUF=txdv[tn];
  149.                 }
  150.         }
  151. }  
  152.   
復(fù)制代碼
  1. //#include<reg51.h>
  2. # include <STC12C5A60S2.h>
  3. # define uchar unsigned char
  4. # define vtime        6000   //定時(shí)3ms,一幀8*3=24ms,頻率=40Hz
  5. # define sub1        0x11   
  6. # define sub2        0x12  
  7. sbit key1=P3^2;
  8. sbit key2=P3^3;
  9. uchar        over_t=0;
  10. uchar        addr=sub1,sum=0;
  11. //uchar i,j,temp,m=0x01;

  12. uchar code distable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x09};
  13. //位選碼表
  14. uchar  code numi[]={0xfe,0xfd,0xfb,0xf7};
  15. //顯示緩存
  16. uchar V_ram[]={17,16,16,0};
  17. uchar        wi=0;  //位選循環(huán)變量
  18. uchar        rn=0;  //接收循環(huán)變量
  19. uchar        rxdv[3];
  20. void main( )
  21. {
  22. /*        //m1:m0  00=標(biāo)準(zhǔn);   01=推挽;   10=輸入;   11=開(kāi)漏輸出
  23.         P2M1 = 0X00;
  24.         P2M0 = 0Xff;
  25.         P1M1 = 0X00;
  26.         P1M0 = 0Xff; //設(shè)定P2,P1推挽輸出
  27.         P3M1 = 0X0d;
  28.         P3M0 = 0X02;
  29. */        //
  30.         SCON = 0xd0;
  31.         PCON = 0X80;
  32.         TH1 = 0XFd;
  33.         TL1 = 0XFd;
  34.         IT0 = 1; //        中斷0為邊沿觸發(fā)
  35.           IT1 = 1; //        中斷1為邊沿觸發(fā)
  36.        
  37.           TMOD = 0X21; //設(shè)定定時(shí)器0為16位計(jì)數(shù)方式
  38.           TH0 = (65536-vtime )/256;
  39.           TL0 = (65536-vtime )%256; //賦定時(shí)器0初值
  40.           ET0 = 1;  //開(kāi)定時(shí)器0中斷
  41.            TR0 = 1;  //啟動(dòng)定時(shí)器0計(jì)數(shù)
  42.            TR1 = 1;  //啟動(dòng)定時(shí)器1計(jì)數(shù)
  43.         SM2=1;
  44.         if(key1==0)
  45.         {
  46.                 addr=sub1;
  47.                  IE1 = 0;  //中斷1的源清零
  48.                   EX1 = 1; //        開(kāi)啟中斷1
  49.         }
  50.         if(key2==0)
  51.         {
  52.                 addr=sub2;
  53.                  IE0 = 0;   //中斷0的源清零
  54.                 EX0 = 1; //        開(kāi)啟中斷0
  55.         }
  56.         V_ram[0]=addr;
  57.         ES=1;
  58.           EA = 1;          //開(kāi)總中斷
  59.         while(1);
  60. }
  61. void t0_isp() interrupt 1
  62. {
  63.         uchar dm,wx;
  64.           TH0 = (65536-vtime )/256;
  65.           TL0 = (65536-vtime )%256; //賦定時(shí)器0初值
  66.           dm=distable[V_ram[wi]];        //取顯示段碼
  67.         wx=numi[wi];                           //取位選碼
  68.         P1=0xff;                           //關(guān)顯示
  69.         P2=dm;                                   //段碼賦給P0口
  70.         P1=wx;                                   //點(diǎn)亮位選的那個(gè)數(shù)碼管
  71.         wi++;
  72.         if(wi==4)wi=0;
  73.         if(over_t != 0)over_t--;
  74. }
  75. void int0_isp() interrupt 0
  76. {
  77.         addr=sub1;
  78.         V_ram[0]=addr;
  79.         EX0 = 0;          //  關(guān)中斷0
  80.         IE1 = 0;  //中斷1的源清零
  81.         EX1 = 1;  //開(kāi)中斷1
  82. }
  83. void int1_isp() interrupt 2
  84. {
  85.         addr=sub2;
  86.         V_ram[0]=addr;
  87.         EX1 = 0;          // 關(guān)中斷1
  88.         IE0 = 0;   //中斷0的源清零
  89.         EX0 = 1;  //開(kāi)中斷0
  90. }
  91. void         uart_isp( ) interrupt 4
  92. {
  93.         if(RI==1)
  94.         {
  95.                 over_t=100;
  96.                 RI=0;
  97.                 rxdv[rn]=SBUF;
  98.                 //V_ram[1]=rn;
  99.                 if((rn==0)&&(addr==SBUF))
  100.                 {
  101.                         SM2=0;
  102.                         rn++;
  103. //                        V_ram[1]=rn;
  104.                         sum=SBUF;
  105.                         return;
  106.                 }
  107.                 if(rn==2)
  108.                 {
  109.                         if(sum==SBUF)
  110.                         {
  111.                                 V_ram[1]=rxdv[1]/100;
  112.                                 if(V_ram[1]==0)V_ram[1]=0x10;
  113.                                 V_ram[2]=(rxdv[1]%100)/10;
  114.                                 if((V_ram[1]==16)&&(V_ram[2]==0x00))V_ram[2]=0x10;
  115.                                 V_ram[3]=(rxdv[1]%100)%10;
  116.                                 TB8=0;
  117.                                 SBUF=addr;
  118.                         }
  119.                 //        V_ram[1]=rn;
  120.                         rn=0;
  121.                         SM2=1;
  122.                         return;
  123.                 }
  124.                 if(rn==1)
  125.                 {
  126.                         rn++;
  127.                         sum=sum+SBUF;
  128.                         V_ram[1]=SBUF;


  129. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

最后給大家分享一些我們老師給的一些經(jīng)典的單片機(jī)程序源碼, 一共有十多個(gè).都有詳細(xì)的注釋,然大家快速的理解每一行代碼的意思。而且有proteus仿真原理圖。大家可以直接驗(yàn)證程序的對(duì)錯(cuò).


本系列所有源碼打包下載地址(含proteus仿真工程文件和源程序):
http://m.zg4o1577.cn/bbs/dpj-82474-1.html

本例程下載:
主從串行通信.rar (88.38 KB, 下載次數(shù): 47)



作者: hdle    時(shí)間: 2017-5-8 22:36
51黑有你更精彩,向你學(xué)習(xí),尊敬。
作者: zhanghuiting    時(shí)間: 2017-11-25 22:11
有沒(méi)有匯編程序
作者: 18875856893ljl    時(shí)間: 2017-12-4 20:46
虛心求教學(xué)習(xí)
作者: LlewynDavis    時(shí)間: 2017-12-14 20:16
資料很好,




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 99热99re6国产在线播放 | 日韩欧美在线视频 | 中文字幕免费在线 | 免费一级黄色片 | 一级特黄毛片 | 日本亚洲欧美 | 国产精品久久久久久久久久久久午夜片 | 99久久视频 | 在线一区| 久久久久久国产 | 久久亚洲欧美 | 久久天天干 | 4438成人网 | 国产一区二区三区免费 | 久久伊人网站 | 亚洲天堂偷拍 | 欧美国产日韩一区二区 | 麻豆成人免费视频 | 午夜久久久久久久 | 天天综合影院 | 久久夜色精品国产欧美乱极品 | 欧美精品www| 黄色大片网站 | 亚洲精品久久 | 狠狠干网站| 国产一级视频在线观看 | 国产美女一区二区 | 欧美日韩三级 | 午夜精品国产 | 亚洲精品网站在线观看 | 97国产视频 | 中文字幕在线观 | 亚洲青青草| 亚洲www啪成人一区二区麻豆 | 免费看v片 | 久久视频这里只有精品 | a级片网址| 成人午夜小视频 | 中文在线观看免费高清 | 欧美日韩精品一区 | 97国产精品|