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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機板串口通信工程 簡單上下位機通信_C版

[復制鏈接]
ID:393561 發表于 2018-9-5 13:18 | 顯示全部樓層 |閱讀模式
簡單上下位機通信_C版

單片機源程序如下:
  1. /**********************
  2. 文件名稱:uart.c
  3. 作者:甘祥
  4. 說明:串口通信例程測試
  5. 修改記錄:
  6. ***********************/

  7. /**********************
  8. 基于STC15F2K60S2系列單片機C語言編程實現
  9. 使用如下頭文件
  10. ***********************/
  11. #include "STC15F2K60S2.h"
  12. #include<intrins.h>

  13. #define uchar unsigned char
  14. #define uint unsigned int

  15. #define Machine_Focs 11059200L        //晶振頻率
  16. #define BAUD1 9600                                //波特率
  17. #define  NMAX_KEY 100                   //按鍵抖動次數

  18. sbit Key1 = P3^2 ;                                //啟動發送
  19. sbit Key2 = P3^3 ;                                //數字減少
  20. sbit Key3 = P1^7 ;                                //數字增加
  21. sbit LED_SEL=P2^3;

  22. uchar G_count;
  23. uchar display;                                   //顯示發送數據

  24. uint Key1_count;                           //按鍵1計數
  25. uint Key2_count;                           //按鍵2計數
  26. uint Key3_count;                           //按鍵3計數
  27. uint Key_count;                                   //按鍵總的抖動次數
  28. bit flg_1ms;                                   //1ms的標志
  29. bit Key1_C;/*key1當前的狀態*/
  30. bit Key1_P;/*key1前一個狀態*/
  31. bit Key2_C;/*key2當前的狀態*/
  32. bit Key2_P;/*key2前一個狀態*/
  33. bit Key3_C;/*key3當前的狀態*/
  34. bit Key3_P;/*key3前一個狀態*/

  35. /*收發顯示數據相關*/
  36. bit Uart1_Sendbusy = 0 ;
  37. unsigned char display,flag;
  38. uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //顯示0-f

  39. /**********************
  40. 函數名稱:Timer0
  41. 功能描述:定時器0的中斷響應函數        ,定時100us
  42. ***********************/
  43. void Timer0() interrupt 1         
  44. {
  45.         TH0=(65535-1000)/256;           //定時器初始值
  46.         TL0=(65535-1000)%256;
  47.         G_count++;
  48.         if(G_count==10)            //中斷10次對應1ms
  49.         {
  50.                 G_count=0;
  51.                 flg_1ms=1;
  52.         }
  53.     flag++;
  54.         if(flag==2)
  55.         flag=0;
  56.         P0=0;
  57.         switch(flag)
  58.         {
  59.         case 0:        P2=0x00;P0=duanxuan[display/16];break;
  60.     case 1: P2=0x01;P0=duanxuan[display%16];break;
  61.         }
  62. }

  63. /****************************************************************************
  64. *Uart1_Init()
  65. *初始化串口1的相關設置,設定串口的波特率等
  66. ***************************************************************/
  67. void Uart1_Init(void)
  68. {
  69.         AUXR=0X80;        //輔助寄存器 此時定時器0的速度是傳統的12倍,不分頻
  70.         SCON|=0X50; //允許接收
  71.         TL1=(65536-(Machine_Focs/4/BAUD1));
  72.         TH1=(65536-(Machine_Focs/4/BAUD1))>>8;
  73.         AUXR|=0X40;        //輔助寄存器 此時定時器1的速度是傳統的12倍,不分頻
  74.         RI=0;                 //接收中斷標志位
  75.         TI=0;                 //發送中斷標志位
  76.         TR1=1;                 //啟動定時器1
  77.         ES=1;                 //串口中斷允許位
  78.         EA=1;                 //總中斷允許位
  79.         PS = 1 ;        //串口1中斷高優先級
  80. }
  81. /*****************************************************************************
  82. *SendComData(INT8U)
  83. *發送單個字符給UART1以發送到PC機
  84. *如果需要奇偶校驗則此處需要修改
  85. *入口參數:dat,需要發送的八位數據
  86. ******************************************/

  87. void SendData(unsigned char dat)
  88. {
  89.         while(Uart1_Sendbusy);
  90.         Uart1_Sendbusy=1;
  91.         SBUF=dat;
  92. }

  93. /********************************************************************************************
  94. *Uart1()
  95. *串口1中斷服務程序
  96. */

  97. void Uart1_fun() interrupt 4 using 1
  98. {
  99.         if(RI)                         //接受完數據后 RI自動制1
  100.         {
  101.                 RI=0;
  102.                 display=SBUF;        
  103.         }
  104.         
  105.         if(TI)                    //發送完數據后 RI自動制1
  106.         {
  107.                 TI=0;
  108.                 Uart1_Sendbusy=0;
  109.         }
  110. }
  111. /**********************
  112. 函數名稱:Init
  113. 功能描述:完成各部分功能模塊的初始化
  114. 入口參數:無
  115. 出口參數:無
  116. 備注:
  117. ***********************/
  118. void Init()
  119. {
  120.         /************* **系統初始化 *******************/
  121.         //推挽模式
  122.         P3M0=0x00;
  123.         P3M1=0x00;
  124.          P2M0=0xff;
  125.            P2M1=0x00;
  126.     P0M0=0xff;
  127.     P0M1=0x00;

  128.         TMOD=0x01;//定時器0,方式1
  129.         ET0=1;//開啟定時器中斷        
  130.          TH0=(65535-1000)/256;
  131.         TL0=(65535-1000)%256;
  132.         TR0=1;//啟動定時器

  133.         Uart1_Init();        //外部中斷:低優先級

  134.         display = 0x00;
  135.         LED_SEL=0;
  136.         flg_1ms=0;

  137.         /*初始化所有按鍵的當前狀態、前一個狀態*/
  138.         Key1_C=1;/*key1當前的狀態*/
  139.         Key1_P=1;/*key1前一個狀態*/
  140.         Key2_C=1;/*key2當前的狀態*/
  141.         Key2_P=1;/*key2前一個狀態*/
  142.         Key3_C=1;/*key3當前的狀態*/
  143.         Key3_P=1;/*key3前一個狀態*/

  144.         Key1_count=0x80+NMAX_KEY/3*2;
  145.         Key2_count=0x80+NMAX_KEY/3*2;
  146.         Key3_count=0x80+NMAX_KEY/3*2;
  147.         Key_count=NMAX_KEY;

  148. }
  149. /********************************************************************/
  150. void main()
  151. {
  152.         Init();        
  153.         while(1)
  154.         {
  155.                 if(flg_1ms)
  156.                 {
  157.                         flg_1ms=0;

  158.                         if(Key1==0)
  159.                         Key1_count--;
  160.                         if(Key2==0)
  161.                         Key2_count--;
  162.                         if(Key3==0)//按鍵是按下狀態
  163.                         Key3_count--;
  164.         
  165.                         Key_count--;//總的次數減1

  166.                         if(Key_count==0)//100次完了
  167.                         {
  168.         
  169.                                 if(Key1_count<0x80)
  170.                                 {
  171.                                         Key1_C=0;
  172.                                         if(Key1_P==1)        //下降沿(按鍵做動作)
  173.                                         {
  174.                                                 Key1_P=0;
  175.                                                 SendData(display) ;        
  176.                                         }

  177.                                 }
  178.                                 if(Key1_count>=0x80)
  179.                                 {
  180.                                         Key1_C=1;
  181.                                         if(Key1_P==0)
  182.                                            Key1_P=1;        //上升沿(假設不做動作那就繼續)
  183.                                 }

  184.                                 if(Key2_count<0x80)
  185.                                 {
  186.                                         Key2_C=0;
  187.                                         if(Key2_P==1)        //下降沿(按鍵做動作)
  188.                                         {
  189.                                                 Key2_P=0;
  190.                                                 display--;
  191.                                         }

  192.                                 }
  193.                                 if(Key2_count>=0x80)
  194.                                 {
  195.                                         Key2_C=1;
  196.                                         if(Key2_P==0)
  197.                                            Key2_P=1;        //上升沿(假設不做動作那就繼續)
  198.                                 }


  199.                                 if(Key3_count<0x80)
  200.                                 {
  201.                                         Key3_C=0;
  202.                                         if(Key3_P==1)        //下降沿(按鍵做動作)
  203.                                         {
  204.                                                 Key3_P=0;
  205.                                                 display++;
  206.                                         }

  207.                                 }
  208.                                 if(Key3_count>=0x80)
  209.                                 {
  210.                                         Key3_C=1;
  211.                                         if(Key3_P==0)
  212.                                            Key3_P=1;        //上升沿(假設不做動作那就繼續)
  213.                                 }
  214.         
  215.                                 /*新一輪的判斷*/
  216.                                 Key1_count=0x80+NMAX_KEY/3*2;
  217.                                 Key2_count=0x80+NMAX_KEY/3*2;
  218.                                 Key3_count=0x80+NMAX_KEY/3*2;
  219.                                 Key_count=NMAX_KEY;

  220.                         }
  221.                 }
  222.         }

  223. }
復制代碼

所有資料51hei提供下載:
簡單上下位機通信_C版.zip (67.55 KB, 下載次數: 7)


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天干天天色 | 99久久久无码国产精品 | 亚洲成人av | 国产精品久久久久久久久久久久 | 中文字幕 亚洲一区 | 国产精品一区二区久久 | 亚洲午夜精品一区二区三区他趣 | 免费看片国产 | 国产精品视频中文字幕 | 免费看的黄网站 | 日韩电影一区二区三区 | 国产1区在线 | 国产视频综合 | 亚洲精品无 | 一级毛片免费视频观看 | 亚洲精品18 | 亚洲精品自在在线观看 | 91网站在线观看视频 | 中文字幕亚洲欧美日韩在线不卡 | 中文字幕 国产 | 成人免费视频网站在线看 | 欧美日韩不卡在线 | 日韩一级欧美一级 | 亚洲在线| 亚洲精品成人 | 国产精品1区 | 精品国产乱码一区二区三 | 精品国产高清一区二区三区 | 国产情侣啪啪 | 国产精品美女久久久久aⅴ国产馆 | 国产高清一区二区三区 | 日韩精品一区二区三区中文在线 | 天天操天天射天天 | 免费的网站www | 国产精品久久久久久久7777 | 色五月激情五月 | 欧美日韩国产在线观看 | 成人午夜在线观看 | 精品一区国产 | 国产精品一区二区电影 | 国产精品免费大片 |