📄 vterminal_uart_wave.c
字号:
//智能显示终端串口(Uart)通信演示程序。
//
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
uchar Fcolor; //背景色
uchar Bcolor; //前景色
Lcd_Clr();
dis_wave(unsigned short x0,unsigned short y0,uchar con,unsigned short *p_data);
/********************************************
定义数据常量,这些数据在实际应用中一般由A/D转换器采样所得到。
这里的每一个字节代表一个Y轴坐标的大小即幅度。
**********************************************/
unsigned short code y_data1[110] = {
0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,
0x0b,0x0b,0x0b,0x0b,0x0b,
0x1c,0x1c,0x1c,0x1c,0x1c,
0x1c,0x1c,0x1c,0x1c,0x1c,
0x1c,0x1c,0x1c,0x1c,0x1c,
0x1c,0x1c,0x1c,0x1c,0x1c,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x50,0x50,0x50,0x50,0x50,
0x50,0x50,0x50,0x50,0x50,
0x50,0x50,0x50,0x50,0x50,
0x50,0x50,0x50,0x50,0x50,
0x50,0x50,0x50,0x50,0x50,
0x48,0x46,0x44,0x42,0x40,
0x3e,0x3c,0x3a,0x38,0x36,
0x34,0x32,0x30,0x2e,0x2c,
0x2a,0x28,0x26,0x24,0x22,
0x20,0x1e,0x1c,0x1a,0x18,
0x16,0x14,0x12,0x10,0x84
};
unsigned short code y_data2[110] = {
0x015e,0x015e,0x015e,0x015e,0x015e,
0x015e,0x015e,0x015e,0x015e,0x015e,
0x015e,0x015e,0x015e,0x015e,0x015e,
0x015e,0x015e,0x015e,0x015e,0x015e,
0x015e,0x015e,0x015e,0x015e,0x015e,
0x015e,0x015e,0x015e,0x015e,0x015e,
0x015e,0x015e,0x015e,0x015e,0x015e,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x0084,0x0084,0x0084,0x0084,0x0084,
0x0084,0x0084,0x0084,0x0084,0x0084,
0x0084,0x0084,0x0084,0x0084,0x0084,
0x0084,0x0084,0x0084,0x0084,0x0084,
0x0084,0x0084,0x0084,0x0084,0x0084,
0x48,0x46,0x44,0x42,0x40,
0x3e,0x3c,0x3a,0x38,0x36,
0x34,0x32,0x30,0x2e,0x2c,
0x2a,0x28,0x26,0x24,0x22,
0x20,0x1e,0x1c,0x1a,0x18,
0x16,0x14,0x12,0x10,0xffff
};
main(void)
{
unsigned int i;
//对AT89C51(11.059MHz)的串口初始化
TMOD=0x20; //定时器1设置为模式2
SM0=0;
SM1=1; //设置串口为方式1,10位异步收发
PCON=PCON|0x80; //波特率加倍
TL1=0xFD;
TH1=0xFD; //波特率为19200
TR1=1; //启动定时器1
REN = 1; //允许串口接受使能
//EA=1; //全局中断使能,(EA=0,关全局中断;EA=1,开全局中断)
//ES = 1; //串口中断使能置1,允许串口中断
Fcolor = 0x0;
Bcolor = 0xff;
i = 0;
//显示终端在上电就绪时发送F0.用仿真器时不要检测F0.
//当把程序烧写到单片机上时,显示终端和单片机同时上电,所以一定
//要检测是否收到F0。以判断显示终端是否上电就绪
//while(!(i == 0xF0))
//{i = SBUF;}
Lcd_Clr(); //清除全屏。
Fcolor = 0xe0;
dis_wave(0,0,1,y_data1); //以 (0,0) 为坐标原点显示波形。幅度为单字节
Fcolor = 0x1c;
dis_wave(100,100,2,y_data2); //以 (80,80) 为坐标原点显示波形。幅度为双字节。
Fcolor = 0xff;
while(1);
}
//查看一个字符是否传送完毕,当一个字符传送完毕后TI位会被硬件置1;
void check_uart(void)
{
while(TI==0)
{}
TI=0;
}
//指令头,每一条指令都规定为"0x81, command1,command2,Fcolor,Bcolor"
command_head(unsigned char command1,unsigned char command2)
{
TI=0;
SBUF= 0x81;
check_uart();
SBUF= command1;
check_uart();
SBUF= command2;
check_uart();
SBUF= Fcolor;
check_uart();
SBUF= Bcolor;
check_uart();
}
//指令头+x0+y0
command_head2(uchar command1,uchar command2,unsigned short x0,unsigned short y0)
{
command_head(command1,command2);
SBUF= x0/100;
check_uart();
SBUF= x0%100;
check_uart();
SBUF= y0/100;
check_uart();
SBUF= y0%100;
check_uart();
}
//清屏子程序
Lcd_Clr()
{
command_head(0x43,0x4c);
SBUF= 0x84;
check_uart();
}
//显示波形子程序。
//显示波形的原理是:x轴从坐标原点开始自动加一,y轴(幅度)是*p_data。
//x0, y0是坐标原点。
//con=1 y轴(幅度)的大小用一个字节表示。con = 2:y轴(幅度)的大小用二个字节表示
dis_wave(unsigned short x0,unsigned short y0,uchar con,unsigned short *p_data)
{
command_head2(0x53,0x53,x0,y0);
SBUF= con;
check_uart();
switch(con)
{case 1:
do
{
SBUF = (*p_data%100); //因为*p_data定义为short类型指针,所以这里要先取模运算再发送
check_uart();
p_data++;
}
while(*p_data !=0x84);
break;
case 2:
do
{
SBUF=(*p_data/100);
check_uart();
SBUF=(*p_data%100);
check_uart();
p_data++;
}
while(*p_data !=0xffff); //这里不能定义为Ox84,因为p_data[x]有可能是0x84
break;
default: break;
}
SBUF=(0x84);
check_uart();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -