STC 开天斧 三
先用圈圈的USB开发板测试
8个按键分别发送8个不同的HEX数据
只能按一次发送正确
第二次就发不出去了
今天很早就起床
用开天斧三开发板 改了一下例程字符串收发程序
用P3.2 P3.3 P3.4 P3.5
分别发送4个不同的HEX数据
也是卡死在发送函数(猜的,等一下点亮一个LED试试)
/************* 功能说明 ************************/
#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
}
}
|