| 
				打卡等级:偶尔看看III打卡总天数:37最近打卡:2025-10-08 06:40:35   中级会员 
 
 
	积分443 
 | 
 
| 昨天用圈圈的开发板测试 8个按键分别发送8个不同的HEX数据
 只能按一次发送正确
 第二次就发不出去了
 今天很早就起床
 用开天斧板 改了一下例程字符串收发程序
 用P3.2 P3.3 P3.4 P3.5
 分别发送4个不同的HEX数据
 也是卡死在发送函数(猜的,等一下点亮一个LED试试)
 并且发送函数按照昨天版主的建议修改
 B_TX1_Busy = 1;    SBUF = SSF;    while(B_TX1_Busy);
 void Send(u8 puts) //发送一个字符串
 {
 B_TX1_Busy = 1;
 SBUF = puts;
 while(B_TX1_Busy);
 }
 并且不用接收数据,把接收子程序也删除了
 感觉挺奇怪
 发送数据还有其他什么寄存器和位控制设置么
 
 
     
 /*************  功能说明    ************************/
 #include     "stc8h.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
 #define      MAIN_Fosc       11059200L   //定义主时钟(精确计算9600波特率)
 typedef      unsigned char   u8;
 typedef      unsigned int    u16;
 typedef      unsigned long   u32;
 #define      Baudrate1           9600L
 #define      UART1_BUF_LENGTH    64
 sbit         InttPut0=P3^2;
 sbit         InttPut1=P3^3;
 sbit         InttPut2=P3^4;
 sbit         InttPut3=P3^5;
 u8           TX1_Cnt;    //发送计数
 u8           RX1_Cnt;    //接收计数
 bit          B_TX1_Busy; //发送忙标志
 u8           kcounter,kstatus;     //按键计数标志 按键状态标志
 /****************按键计数器状态寄存器归零*************/
 void RstKey()
 {
 kcounter=0;                        //按键计数器归零
 kstatus=0;                         //状态寄存器归零
 }
 /*****************按键低电平检测函数*****************/
 void   LowVoltKey(void)            //按键计数器状态标志加一
 {
 kcounter++;
 kstatus++;
 _nop_();                           //延时
 }
 /*****************按键高电平检测函数*****************/
 void    HighVoltKey(void)          //按键计数器加一 状态标志归零
 {
 kcounter++;                        //按键计数器加一
 kstatus=0;                         //按键状态标志归零
 _nop_();                           //延时
 }
 //========================================================================
 // 函数: void PrintHex(u8 puts)
 // 描述: 串口1发送字符串函数。
 // 参数: puts:  Hex.
 // 返回: none.
 // 版本: VER1.0
 // 日期: 2014-11-28
 // 备注:
 //========================================================================
 void Send(u8 puts) //发送一个字符串
 {
 B_TX1_Busy = 1;
 SBUF = puts;
 while(B_TX1_Busy);
 }
 //========================================================================
 // 函数: SetTimer2Baudraye(u16 dat)
 // 描述: 设置Timer2做波特率发生器。
 // 参数: dat: Timer2的重装值.
 // 返回: none.
 // 版本: VER1.0
 // 日期: 2014-11-28
 // 备注:
 //========================================================================
 void SetTimer2Baudraye(u16 dat)  // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
 {
 AUXR &= ~(1<<4);    //Timer stop
 AUXR &= ~(1<<3);    //Timer2 set As Timer
 AUXR |=  (1<<2);    //Timer2 set as 1T mode
 T2H = dat / 256;
 T2L = dat % 256;
 IE2  &= ~(1<<2);    //禁止中断
 AUXR |=  (1<<4);    //Timer run enable
 }
 //========================================================================
 // 函数: void UART1_config(u8 brt)
 // 描述: UART1初始化函数。
 // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
 // 返回: none.
 // 版本: VER1.0
 // 日期: 2014-11-28
 // 备注:
 //========================================================================
 void UART1_config(u8 brt)    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
 {
 /*********** 波特率使用定时器2 *****************/
 if(brt == 2)
 {
 AUXR |= 0x01;       //S1 BRT Use Timer2;
 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
 }
 /*********** 波特率使用定时器1 *****************/
 else
 {
 TR1 = 0;
 AUXR &= ~0x01;      //S1 BRT Use Timer1;
 AUXR |=  (1<<6);    //Timer1 set as 1T mode
 TMOD &= ~(1<<6);    //Timer1 set As Timer
 TMOD &= ~0x30;      //Timer1_16bitAutoReload;
 TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
 TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
 ET1 = 0;    //禁止中断
 INTCLKO &= ~0x02;   //不输出时钟
 TR1  = 1;
 }
 /*************************************************/
 
 SCON=(SCON&0x3f)|0x40;//UART1模式,0x00:同步移位输出,0x40:8位数据,可变波特率,0x80:9位数据,固定波特率,0xc0: 9位数据,可变波特率
 //  PS  = 1;    //高优先级中断
 ES  = 1;    //允许中断
 REN = 1;    //允许接收
 P_SW1 &= 0x3f;
 P_SW1 |= 0x00;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4
 //  PCON2 |=  (1<<4);   //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
 
 B_TX1_Busy = 0;
 TX1_Cnt = 0;
 RX1_Cnt = 0;
 }
 //========================================================================
 // 函数: void main(void)
 // 描述: 主函数。
 // 参数: none.
 // 返回: none.
 // 版本: VER1.0
 // 日期: 2014-11-28
 // 备注:
 //========================================================================
 void main(void)
 {
 P_SW2|=0x80;  //扩展寄存器(XFR)访问使能
 P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
 P1M1 = 0x30;   P1M0 = 0x30;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
 P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
 P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
 P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
 P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
 P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
 P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
 UART1_config(1);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
 EA = 1; //允许总中断
 while (1)
 {
 RstKey();
 for(;kcounter<5;)                 //按键循环5次
 {
 if(!InttPut0)                      //按键低电平
 {
 LowVoltKey();
 }
 else if(~!InttPut0)               //按键高电平
 {
 HighVoltKey();
 }
 }
 if(kstatus>=4)                    /*按键状态标志大于等于3为有效值*/
 {                                /*循环检测 */
 Send(0X01);
 P2=0X01;
 }
 //1
 RstKey();
 for(;kcounter<5;)                 //按键循环5次
 {
 if(!InttPut1)                      //按键低电平
 {
 LowVoltKey();
 }
 else if(~!InttPut1)               //按键高电平
 {
 HighVoltKey();
 }
 }
 if(kstatus>=4)                    /*按键状态标志大于等于3为有效值*/
 {                                /*循环检测 */
 Send(0X02);
 P2=0X02;
 }
 //2
 RstKey();
 for(;kcounter<5;)                 //按键循环5次
 {
 if(!InttPut2)                      //按键低电平
 {
 LowVoltKey();
 }
 else if(~!InttPut2)               //按键高电平
 {
 HighVoltKey();
 }
 }
 if(kstatus>=4)                    /*按键状态标志大于等于3为有效值*/
 {                                /*循环检测 */
 Send(0X04);
 P2=0X04;
 }
 //3
 RstKey();
 for(;kcounter<5;)                 //按键循环5次
 {
 if(!InttPut3)                      //按键低电平
 {
 LowVoltKey();
 }
 else if(~!InttPut3)               //按键高电平
 {
 HighVoltKey();
 }
 }
 if(kstatus>=4)                    /*按键状态标志大于等于3为有效值*/
 {                                /*循环检测 */
 Send(0X08);
 P2=0X08;
 }
 //4
 }
 }
 
 
 
 
 
 
 
 
 | 
 |