📄 51
字号:
#include <reg51.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char#define fosc 11.0592 // 晶振频率 #define time0 2000 // 定时2000us#define FM1808_ADDR XBYTE[0X0000]// FM1808的地址sbit RE1=P1^0; // 数据采集接收使能端,低有效sbit DE1=P1^1; // 数据采集发送使能端sbit RE2=P1^2; // 与计算机数据通信接收使能端,低有效sbit DE2=P1^3; // 与计算机数据通信发送使能端uint idata time0_0; // 临时变量,用于计算定时uchar time2ms; // 2ms时间计数uchar buffer; // 接收数据缓冲区void init_serial(void); // 初始化串行中断void init_time0(void); // 初始化定时器中断void time0_int(void); // 定时器中断void serial_IT(void); // 串行中断void sample(void); // 0.2s时间到,采集数据void main(){ init_serial(); // 初始化串口程序 init_time0(); // 初始化定时器0程序 time2ms=0; // 请除时间计数 RE2=0;DE2=0; // 接收计算机的请求允许 IP =0x10; // 中断优先级设置,串行中断优先级高 EA = 1; // 使能全局中断 if(time2ms==100) // 2*100=200ms 0.2s时间到,采集数据 { sample(); } }/****************初始化串行中断****************/void init_serial(void){ SCON = 0x50; // 8位串行口模式1,允许接收,REN=1 TMOD|= 0x20; // 定时器1工作在模式2 TH1 = 0xfd; // 波特率位9600,晶振频率位11.0592MHz TL1 = 0xfd; ES = 1; // 使能串行口中断 TR1 = 1; // 启动定时器1 RI=0; // 清除串行传输标志位 TI=0; // EA = 1; // 使能全局中断}void init_time0(void){ TMOD|=0x01; // T0工作方式1 // 2ms 定时设置 time0_0 = 65536-time0*fosc/12; TH0=(time0_0/256); // 定时器高位赋初值 TL0=(time0_0%256); // 定时器低位赋初值 TR0=1; // 开定时器0 ET0=1; // 开定时器0的中断 // EA = 1; // 使能全局中断 }/****************串口中断服务程序****************/void serial_IT(void) interrupt 4{ if(RI==1) { RI=0; // 清接收标志位 buffer=SBUF; // 将串口接收数据送入接收数据缓冲区 if(buffer==0xbb) // 如果计算机发送的为BB,则表示计算机需要读取数据 { ES = 0; // 关串行中断 RE2=1;DE2=1; // 发送数据给计算机 允许 buffer=FM1808_ADDR; // 从FM1808的00地址读取数据 SBUF=buffer; while(TI==0); // 等待发送完成 TI=0; // 清发送标志位 RE2=0;DE2=0; // 接收计算机的请求允许 ES = 1; // 使能串行口中断 } }}/* 定时器0中断服务子程序,定时动态扫描显示 */void time0_int(void) interrupt 1{ TH0=(time0_0/256); // 初值重装 TL0=(time0_0%256); time2ms+=1; // 时间暂存期数据加1}void sample(void){ time2ms=0; // 清除时间计数 ES = 0; // 关串行中断 RE2=1;DE2=0; // 禁止与计算机通信 RE1=1;DE1=1; // 发送数据允许 SBUF=0XAA; // 发送联络信号AA while(TI==0); // 等待发送数据 TI=0; // 清发送标志位 RE1=0;DE1=0; // 接收数据允许 while(RI==0); // 等待接收数据 RI=0; // 清接收标志位 buffer=SBUF; // 暂存数据 FM1808_ADDR=buffer; // 存储数据到FM1808的00地址 RE1=1;DE1=0; // 传感器不允许 RE2=0;DE2=0; // 接收计算机的请求允许 ES = 1; // 使能串行口中断 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -