网站开发算法,鞍山人才网官网,绍兴免费自助建站,域名备案查询网站1 回顾
串口通信的代码编写结构还是与中断一样#xff0c;不同的是#xff1a;
初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器#xff08;定时器1用于产生波特率#xff09;#xff0c;但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。 vo…1 回顾
串口通信的代码编写结构还是与中断一样不同的是
初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器定时器1用于产生波特率但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。 void 函数名
{
包含两部分寄存器定时器1串口通信
定时器1 TMOD 选择模式TH1和TL1初始计时寄存器TR1TCON寄存器里的启动计时按钮
串口通信SCON总的来说功能是模式选择AUXR辅助寄存器中断开关分开关总开关
}
void 函数名 interrupt 中断号
{
就是写时间到后执行什么。注意中断号要写串口通信的而不是定时器的因为定时器作用只是产生波特率而不是产生中断。
} 2 实践
2.1 任务 2.2 思路
题目中涉及到串口通信。那么串口通信的结构就要先写下来
void 函数名
{ }
void 函数名 interrupt 中断号
{ }
先考虑初始函数怎么写
用定时器1产生波特率9600 那么就要写与定时器1有关的寄存器
TMODTR1TL1TH1 中断但不使用
1波特率9600查表得到当时钟为11.059MHZ定时器1用方式2工作即8位重装写入0xfd即TL1TH1 0xfd
2刚才说到要用8位重装模式
查手册之TMOD 0x20
3要让定时器允许定时则TR1 1。 初始函数中还涉及串口通信
与串口通信有关的寄存器: SCON, PCONAUXR SBUF中断
SCON上一篇文章查表或直接查手册常用的工作模式是8位UART波特率可变即SM0SM1为01那么TB8和RB8和SM2为0方式1时不使用TI和RI初始也应该为0REN1要允许接收。
即01010000
因此SCON0x50.
PCON在定时器1串口1情况写只考虑SMOD那位由波特率常用表我们选了那一行的SMOD显示为0故SMOD0故PCON0x00。
AUXR AUXR 0x00上一篇文章有解释
中断总开关EA1分开关ES1
SBUF是存放数据的所以不是写在初始函数中 接下看看看中断程序函数怎么写
1首先是中断号因为中断用的是串口通信而不是定时器1故中断号应是对应串口通信的中断号为4。
2任务是要我们接收信息。那么就要用到接收判断位RI首先判断RI当RI1表示接收完成数据然后再把接收到的数据存下来。我们前一篇说过发送的数据会暂时存到SBUF那么现在我们要接收就要定义一个变量把SBUF的数据存起来即data SBUF然后再把RI清零。由于这里只考虑接收故在中断中只是写接收就行了 虽然在中断中不用判断发送但是还是要写一个发送函数来传给单片机然后接收出来让我们看看是否嗯那个完成接收工作。 注意还有因为任务是产生9600的波特率因此串口收发助手的波特率记得调到9600 2.3 完整代码
这里我发现很奇怪要把发送内容的函数放到main函数的循环里面才能让串口助手收到数据放在main的循环外面是不行的这样就导致其一直在发送串口助手就一直在循环接收数据小蜜蜂老师教程里却不会这样为啥呢求助大佬
以下是在蓝桥杯单片机中可以使用的代码
#include stc15f2k60s2.hvoid selectHC138(unsigned int n)
{switch(n){case 0:P2 (P2 0x1f) | 0x00; break;case 1: P2 (P2 0x1f) | 0x20; break; case 2:P2 (P2 0x1f) | 0x40; break; case 3: P2 (P2 0x1f) | 0x60; break; case 4:P2 (P2 0x1f) | 0x80; break; case 5:P2 (P2 0x1f) | 0xa0; break; case 6:P2 (P2 0x1f) | 0xc0; break; case 7:P2 (P2 0x1f) | 0xe0; break;}
}//send and recieve
void Init_Timer1()
{TH1 0xfd;TL1 0xfd;TMOD 0x20;TR1 1;SCON 0x50;
// PCON 0x00;AUXR 0x00;ES 1;EA 1;
}unsigned char urdat;void chuankou() interrupt 4
{
// if(TI 1)
// {
// urdat SBUF;
// TI 0;
// }if (RI 1){//SBUF urdat;urdat SBUF;RI 0;}
}
//
void send(unsigned char dat)
{SBUF dat;while(TI 0);TI 0;
}void close()
{selectHC138(5);P0 0x00;selectHC138(4);P0 0xff;
}void main()
{close();Init_Timer1();while(1){send(0x5a);send(0xa5); }}