实现的功能:
1、界面1显示时钟,自动计时,每隔1秒向串口发送时间与电压数据,串口波特率为57600。
2、通过ADC采样,采集电压数据,并显示在LCD屏幕界面2。
3、通过KEY0~3,四个按键设置电压测量范围上下限,测量范围最大为0~5V,下限不得大于等于上限。如果测量的电压超出范围,则LED闪烁告警。
4、通过按键KEY0切换LCD界面,短按按键KEY0,LCD界面1切换到界面2;长按按键KEY0,LCD界面2切换到界面1.
5、通过串口接收上位机指令。
指令列表:
(1)start_vt 开启ADC采样
(2)stop_vt 关闭ADC采样
(3)Timer=HH:MM:SS 手动设置时间为HH:MM:SS
(4)VL=x.xv 设置电压测量下限为x.x 伏
(5)VH=x.xv 设置电压测量上限为x.x 伏
(6)t=xs 设置数据发送周期为x秒
注:代码中注释故意删除大部分,防止被同一门的同学抄袭,如有人需要,后续会补上。
#include <project.h>
int data_bus[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //用于存储接收到的串口数据
int ii=0; //用作指向data_bus数组的指针
CY_ISR_PROTO(uart_rx_isr);
/* LCD specific */
#define ROW_0 0 /* LCD row 0 */
#define COLUMN_0 0 /* LCD column 0 */
#define COLUMN_9 9 /* LCD column 9 */
#define COLUMN_10 10 /* LCD column 10 */
#define COLUMN_11 11 /* LCD column 11 */
/* For clearing Tens and Hundreds place */
#define CLEAR_TENS_HUNDREDS " "
/* For clearing Hundreds place */
#define CLEAR_HUNDREDS " "
void Newline();
/*******************************************************************************
* Function Name: main
********************************************************************************
*
* Summary:
* The main function initializes both the ADC and LCD, starts and waits for an
* ADC conversion, then it displays the raw counts to the LCD.
*
* Parameters:
* void
*
* Return:
* void
*
*******************************************************************************/
int main(void)
{
int a=0; //-shang xian
int b=0; //+shang xian
int c=0; //-xia xian
int d=0; //+xia xian
int i;
int start=0;
int H1=0,H2=0; //shi
int M1=0,M2=0; //fen
int S1=0,S2=0; //miao
int VL1,VL2; //电压测量下限
int VH1,VH2; //电压测量上限
int m,n,e,f,g,h; //用于保存电压、上下限的整数位和小数位
int t=1; //存储串口指令"t=xs"中赋给t的值
int time_flag=0;
int time_flag1=0;
uint32 time=0; //用于计时,程序每循环一次就+1
char admin[40]="( )HH:MM:SS:V=x.x v,VL=x.x v,VH=x.x v."; //用于存储发送到串口的数据
char worning1[5]="error";
int swich=0; //界面切换标识符,0时为界面1,1时为界面2
int a1=0; //chuan kou ji shu
int s_flag1=0;
int s_flag2=0;
int s_flag3=0; //用于LED闪烁计数
uint8 ledState = 0x00;
uint16 voltageRawCount;
uint16 vhigh=26667;
uint16 vlow=0;
CyGlobalIntEnable; /* Enable global interrupts. */
UART_1_Start();
uart_rx_isr_Start();
uart_rx_isr_SetVector(uart_rx_isr);
ADC_DelSig_1_Start(); /* Configure and power up ADC */
LCD_Char_1_Position(0,0);
LCD_Char_1_PrintString(" ");
LCD_Char_1_Position(1,0);
LCD_Char_1_PrintString(" ");
LCD_Char_1_Start(); /* Initialize and clear the LCD */
ADC_DelSig_1_StartConvert(); /* Force ADC to initiate a conversion */
while(1)
{
time_flag+