找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1491|回复: 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 单片机教程网

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