TA的每日心情 | 开心 2024-4-17 14:04 |
---|
签到天数: 98 天 [LV.6]常住居民II
中级会员
- 积分
- 413
|
//刚开始看官方的例程包时,感觉头大,没什么经验看不出那跟那;后来搜到冲哥视频,觉得蛮简单的,跟着教学弄就有了初步收获。
//一开始用自己的串口收发,不知道为什么没有数据,后来跟视频用官方例程就收到数据了。
#include "stc8h.h" /*STC8H1K08T调用8H系列单片机文件*///参考了:STC8H实验箱9.6例程包--10-串口1中断模式与电脑收发测试.c
#include "stdio.h"
#define MAIN_Fosc 11059200L //定义主时钟(精确计算115200波特率)
#define Baudrate1 115200L
#define UART1_BUF_LENGTH 64
unsigned char TX1_Cnt; //发送计数
unsigned char RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志
unsigned char xdata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
unsigned int tk_cnt[16]/*触摸扫描值*/,tk_ldjz[16]/*触摸0点键值*/;unsigned char tk_over=0/*采集状态*/;
/**********延时函数**********/
void delayms(unsigned int j){unsigned int i;for(;j>0;j--){for(i=0;i<150;i++);}}
/**********发送一个字符串**********/
void PrintString1(unsigned char *puts)
{
for (; *puts != 0; puts++) //遇到停止符0结束
{
SBUF = *puts;
B_TX1_Busy = 1;
while(B_TX1_Busy);
}
}
/**********选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.**********/
void SetTimer2Baudraye(unsigned int dat)
{
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
}
/**********选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.**********/
void UART1_config(unsigned char brt)
{
/*********** 波特率使用定时器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 = (unsigned char)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
TL1 = (unsigned char)((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;
}
/**********UART1中断函数**********/
void UART1_int (void) interrupt 4
{
if(RI)
{
RI = 0;
RX1_Buffer[RX1_Cnt] = SBUF;
if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出
}
if(TI)
{
TI = 0;
B_TX1_Busy = 0;
}
}
/**********主函数**********/
void main()
{
char xdata dat[50];unsigned int i;
P_SW2 |= 0x80; //允许访问XSF
//1.需要用到的触摸引脚设置为高阻输入
P1M1 = 0xff; P1M0 = 0x00; //P1端口设置为高阻
P3M1 = 0xfc; P3M0 = 0x00; //P3端口设置为高阻 先不占用串口引脚,要不然收不到数据
P5M1 = 0x10; P5M0 = 0x00; //P5端口设置为高阻
UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
//2.配置是否需要同时使用触摸LED指示和触摸检测
TSRT = 0;//不需要使用LED
//3.需要用到的触摸通道使能
TSCHEN1= 0xff;
TSCHEN2= 0xfc;//先不占用串口引脚,要不然收不到数据
//4.设置触摸按键的开关频率,参考电压和放电时间
TSCFG1= (7<<4) + 3;//工作频率设为最低,时钟为1000个系统时钟
TSCFG2 = 2;//设置参考点
//5.开启触摸
TSCTRL = 0xa0;
//6.开启触摸中断并保存数据
IE2|=0x80;
EA = 1; //允许总中断
delayms(100);/*给时间扫描触摸按键*/
while(tk_over==1)/*等待采集完成*/
tk_over=0;i=0;
for(i=0; i<16; i++)
{
tk_ldjz[i] = tk_cnt[i];//录入0点键值
sprintf(dat,"TK%d:%u\r\n",i,tk_ldjz[i]);/*字符串格式化命令*/
PrintString1(dat); //UART1发送字符串
}
while (1)
{
if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲
{
SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回
B_TX1_Busy = 1;
if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;
}
}
}
/**********触摸中断**********/
void TKSU_ISR(void) interrupt 35
{
unsigned char j=TSSTA2;//读到的数值先保存起来
if(j & 0x40)//数据溢出中断
{
TSSTA2 |= 0x40;
}
if(j & 0x80)//一轮采集完成中断
{
j &= 0x0f;//获取当前通道号
TSSTA2 |= 0x80;//清空采集完成的中断
tk_cnt[j]=TSDAT;/*保存采集到的数值*/
if(j==15){tk_over=1;}/*采集完成*/
}
}
|
|