简单上下位机通信_C版
单片机源程序如下:
- /**********************
- 文件名称:uart.c
- 作者:甘祥
- 说明:串口通信例程测试
- 修改记录:
- ***********************/
- /**********************
- 基于STC15F2K60S2系列单片机C语言编程实现
- 使用如下头文件
- ***********************/
- #include "STC15F2K60S2.h"
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Machine_Focs 11059200L //晶振频率
- #define BAUD1 9600 //波特率
- #define NMAX_KEY 100 //按键抖动次数
- sbit Key1 = P3^2 ; //启动发送
- sbit Key2 = P3^3 ; //数字减少
- sbit Key3 = P1^7 ; //数字增加
- sbit LED_SEL=P2^3;
- uchar G_count;
- uchar display; //显示发送数据
- uint Key1_count; //按键1计数
- uint Key2_count; //按键2计数
- uint Key3_count; //按键3计数
- uint Key_count; //按键总的抖动次数
- bit flg_1ms; //1ms的标志
- bit Key1_C;/*key1当前的状态*/
- bit Key1_P;/*key1前一个状态*/
- bit Key2_C;/*key2当前的状态*/
- bit Key2_P;/*key2前一个状态*/
- bit Key3_C;/*key3当前的状态*/
- bit Key3_P;/*key3前一个状态*/
- /*收发显示数据相关*/
- bit Uart1_Sendbusy = 0 ;
- unsigned char display,flag;
- uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示0-f
- /**********************
- 函数名称:Timer0
- 功能描述:定时器0的中断响应函数 ,定时100us
- ***********************/
- void Timer0() interrupt 1
- {
- TH0=(65535-1000)/256; //定时器初始值
- TL0=(65535-1000)%256;
- G_count++;
- if(G_count==10) //中断10次对应1ms
- {
- G_count=0;
- flg_1ms=1;
- }
- flag++;
- if(flag==2)
- flag=0;
- P0=0;
- switch(flag)
- {
- case 0: P2=0x00;P0=duanxuan[display/16];break;
- case 1: P2=0x01;P0=duanxuan[display%16];break;
- }
- }
- /****************************************************************************
- *Uart1_Init()
- *初始化串口1的相关设置,设定串口的波特率等
- ***************************************************************/
- void Uart1_Init(void)
- {
- AUXR=0X80; //辅助寄存器 此时定时器0的速度是传统的12倍,不分频
- SCON|=0X50; //允许接收
- TL1=(65536-(Machine_Focs/4/BAUD1));
- TH1=(65536-(Machine_Focs/4/BAUD1))>>8;
- AUXR|=0X40; //辅助寄存器 此时定时器1的速度是传统的12倍,不分频
- RI=0; //接收中断标志位
- TI=0; //发送中断标志位
- TR1=1; //启动定时器1
- ES=1; //串口中断允许位
- EA=1; //总中断允许位
- PS = 1 ; //串口1中断高优先级
- }
- /*****************************************************************************
- *SendComData(INT8U)
- *发送单个字符给UART1以发送到PC机
- *如果需要奇偶校验则此处需要修改
- *入口参数:dat,需要发送的八位数据
- ******************************************/
- void SendData(unsigned char dat)
- {
- while(Uart1_Sendbusy);
- Uart1_Sendbusy=1;
- SBUF=dat;
- }
- /********************************************************************************************
- *Uart1()
- *串口1中断服务程序
- */
- void Uart1_fun() interrupt 4 using 1
- {
- if(RI) //接受完数据后 RI自动制1
- {
- RI=0;
- display=SBUF;
- }
-
- if(TI) //发送完数据后 RI自动制1
- {
- TI=0;
- Uart1_Sendbusy=0;
- }
- }
- /**********************
- 函数名称:Init
- 功能描述:完成各部分功能模块的初始化
- 入口参数:无
- 出口参数:无
- 备注:
- ***********************/
- void Init()
- {
- /************* **系统初始化 *******************/
- //推挽模式
- P3M0=0x00;
- P3M1=0x00;
- P2M0=0xff;
- P2M1=0x00;
- P0M0=0xff;
- P0M1=0x00;
- TMOD=0x01;//定时器0,方式1
- ET0=1;//开启定时器中断
- TH0=(65535-1000)/256;
- TL0=(65535-1000)%256;
- TR0=1;//启动定时器
- Uart1_Init(); //外部中断:低优先级
- display = 0x00;
- LED_SEL=0;
- flg_1ms=0;
- /*初始化所有按键的当前状态、前一个状态*/
- Key1_C=1;/*key1当前的状态*/
- Key1_P=1;/*key1前一个状态*/
- Key2_C=1;/*key2当前的状态*/
- Key2_P=1;/*key2前一个状态*/
- Key3_C=1;/*key3当前的状态*/
- Key3_P=1;/*key3前一个状态*/
- Key1_count=0x80+NMAX_KEY/3*2;
- Key2_count=0x80+NMAX_KEY/3*2;
- Key3_count=0x80+NMAX_KEY/3*2;
- Key_count=NMAX_KEY;
- }
- /********************************************************************/
- void main()
- {
- Init();
- while(1)
- {
- if(flg_1ms)
- {
- flg_1ms=0;
- if(Key1==0)
- Key1_count--;
- if(Key2==0)
- Key2_count--;
- if(Key3==0)//按键是按下状态
- Key3_count--;
-
- Key_count--;//总的次数减1
- if(Key_count==0)//100次完了
- {
-
- if(Key1_count<0x80)
- {
- Key1_C=0;
- if(Key1_P==1) //下降沿(按键做动作)
- {
- Key1_P=0;
- SendData(display) ;
- }
- }
- if(Key1_count>=0x80)
- {
- Key1_C=1;
- if(Key1_P==0)
- Key1_P=1; //上升沿(假设不做动作那就继续)
- }
- if(Key2_count<0x80)
- {
- Key2_C=0;
- if(Key2_P==1) //下降沿(按键做动作)
- {
- Key2_P=0;
- display--;
- }
- }
- if(Key2_count>=0x80)
- {
- Key2_C=1;
- if(Key2_P==0)
- Key2_P=1; //上升沿(假设不做动作那就继续)
- }
- if(Key3_count<0x80)
- {
- Key3_C=0;
- if(Key3_P==1) //下降沿(按键做动作)
- {
- Key3_P=0;
- display++;
- }
- }
- if(Key3_count>=0x80)
- {
- Key3_C=1;
- if(Key3_P==0)
- Key3_P=1; //上升沿(假设不做动作那就继续)
- }
-
- /*新一轮的判断*/
- Key1_count=0x80+NMAX_KEY/3*2;
- Key2_count=0x80+NMAX_KEY/3*2;
- Key3_count=0x80+NMAX_KEY/3*2;
- Key_count=NMAX_KEY;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
简单上下位机通信_C版.zip
(67.55 KB, 下载次数: 7)
|