ccdV01_20220808

网友投稿 585 2022-09-30

ccdV01_20220808

ccdV01_20220808

/*编程环境:stc8a8k-的时候,选择22.1184M内部晶振频率,后面的串口都是基于此的波特率Author:LMFdate:2022/08/01_1200,V1.0*/#include "stc8a8k.h"#define AL422BU15DataPin P0sbit U15WRST=P3^4;sbit U15OE=P4^3;sbit U15RST=P3^5;sbit U15RCK=P4^1;#define AL422BU12DataPin P1sbit U12WRST=P4^4;sbit U12OE=P5^4;sbit U12RST=P5^0;sbit U12RCK=P5^1;#define AL422BU11DataPin P2sbit U11WRST=P7^0;sbit U11OE=P7^3;sbit U11RST=P7^1;sbit U11RCK=P7^2;#define AL422BU2DataPin P6sbit 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,115void Uart1_Init(void); //115200bps@22.1184MHzvoid Uart2_Init(void); //115200bps@22.1184MHzvoid Uart4_Init(void); //115200bps@22.1184MHzvoid 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,115200void 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;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于webgl(threejs)的路面编辑
下一篇:微信小程序中如何引入echart图表(微信小程序echarts折线图)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~