ccdV01_20220808
Posted XGLIYOUQUAN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ccdV01_20220808相关的知识,希望对你有一定的参考价值。
/*
编程环境:stc8a8k下载的时候,选择22.1184M内部晶振频率,
后面的串口都是基于此的波特率
Author:LMF
date:2022/08/01_1200,V1.0
*/
#include "stc8a8k.h"
#define AL422BU15DataPin P0
sbit U15WRST=P3^4;
sbit U15OE=P4^3;
sbit U15RST=P3^5;
sbit U15RCK=P4^1;
#define AL422BU12DataPin P1
sbit U12WRST=P4^4;
sbit U12OE=P5^4;
sbit U12RST=P5^0;
sbit U12RCK=P5^1;
#define AL422BU11DataPin P2
sbit U11WRST=P7^0;
sbit U11OE=P7^3;
sbit U11RST=P7^1;
sbit U11RCK=P7^2;
#define AL422BU2DataPin P6
sbit U2WRST=P7^4;
sbit U2OE=P7^7;
sbit U2RST=P7^5;
sbit U2RCK=P7^6;
//CPLD得到一个字节,就给一个下降沿
//单片机计算字节的个数
sbit CPLD_INT1=P3^2;
sbit CPLD_INT2=P3^3;
sbit CPLD_INT3=P3^6;
sbit CPLD_INT4=P3^7;
//定时器0定时1ms,分时复用;
/*
2ms:读取一次AL422的数据的某个地址;放如数组中,将AL422写复位;
由于高速采集,AL422的数到底3ms内存储了多少个数据,暂时不知道,需要
计算,假如3ms内保存了5个字节的数据在AL422中,取第三个字节作为有效数据
10ms:对5个数据,进行滤波操作,中值滤波,求中间数据
20ms:发送给串口1,发出去,打印,发送给串口3给串口屏,刷新数据
间隔了20ms,不知道屏幕的数据刷新会不会有问题;待测试;
30ms:识别串口是不是有按键操作;如果有按键操作,比如设置数据等等,暂时中断采集
将AL422的写操作关闭,同时将AL422内部数据清空
如果退出操作界面,打开AL422的写操作,重新进入下一轮采集数据。
*/
unsigned int Tim0_cnt=0;
void Timer0Init(void); //1毫秒@22.1184MHz
//定时器1作为串口1波特率的发生器,下载调试用,22.1184Mhz,115200
//定时器2作为串口2波特率的发生器,串口屏用,22.1184Mhz,115200
//定时器4作为串口4波特率的发生器,RS485接口用,给外部数据,modbus通信,22.1184Mhz,115
void Uart1_Init(void); //115200bps@22.1184MHz
void Uart2_Init(void); //115200bps@22.1184MHz
void Uart4_Init(void); //115200bps@22.1184MHz
void UART1_SendData(char dat);
void UartSendStr(char *p);
char putchar(char c);
void main()
Timer0Init();
Uart1_Init();
Uart2_Init();
Uart4_Init();
TR0 = 1; //定时器0关闭计时
EA=1;
void Timer0Init(void) //1毫秒@22.1184MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初始值
TH0 = 0xA9; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0关闭计时
ET0 = 1; //使能定时器中断
//定时器1作为串口1波特率的发生器,下载调试用,22.1184Mhz,115200
//定时器2作为串口2波特率的发生器,串口屏用,22.1184Mhz,115200
//定时器4作为串口4波特率的发生器,RS485接口用,给外部数据,modbus通信,22.1184Mhz,115200
void Uart1_Init(void) //115200bps@22.1184MHz
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xD0; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
void Uart2_Init(void) //115200bps@22.1184MHz
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xD0; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
void Uart4_Init(void) //115200bps@22.1184MHz
S4CON = 0x10; //8位数据,可变波特率
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
T4T3M |= 0x20; //定时器时钟1T模式
T4L = 0xD0; //设置定时初始值
T4H = 0xFF; //设置定时初始值
T4T3M |= 0x80; //定时器4开始计时
//1ms进入一次中断
void TM0_Isr() interrupt 1
// P10 = !P10; //测试端口
if(Tim0_cnt<9999) Tim0_cnt++; //形成循环变量
else Tim0_cnt=0;
if(Tim0_cnt%2 ==0)
//读取一次AL422的数据,后面编程;
if(Tim0_cnt%10==0)
//滤波操作,给10ms时间够不够?
if(Tim0_cnt%20 ==0)
//将滤波数据,发送给串口1,测试验证,同时发给串口屏,刷新数据,20ms屏幕刷新率50HZ有没有问题呢?
//同时将滤波数据,发送到RS485接口,这个需要再深入思考一下
if(Tim0_cnt%30 ==0)
//读取串口屏传来的数据,识别按键是不是按下,或可以在串口屏的中断中处理。
//UART1 发送串口数据,一个字节
void UART1_SendData(char dat)
ES=0; //关串口中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0; //清除发送中断标志
ES=1; //开串口中断
//UART1 发送串口数据,字符串
void UartSendStr(char *p)
while (*p)
UART1_SendData(*p++);
//重写putchar函数,可以用printf函数
char putchar(char c)
UART1_SendData(c);
return c;
以上是关于ccdV01_20220808的主要内容,如果未能解决你的问题,请参考以下文章