⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 sti51单片机开发板测试主程序 使用AD DA 数码管 液晶等模块
💻 C
字号:
/*
 *	Copyright (C) 2006, 华中科技大学电气与电子科技创新中心
 *	All Rights Reserved.
 *	
 *	文件名:		main.c
 *	文件描述:	STI51开发板测试程序主文件
 *			
 *	当前版本:	1.0
 *	作者:		SangWei(swkyer@gmail.com)
 *	完成日期:	2005年12月22日
 *	
*/
#include <REGX52.h>
#include <INTRINS.H>
#include "SEG7\SEG7.h"
#ifdef __AT89X52_H__
#include "UART\uart.h"
#endif
#include "SMC162\SMC162.h"
#include "TLC549\TLC549.h"
#include "TLC5620\TLC5620.h"

/* 蜂鸣器控制引脚 */
#define BEEP_PIN		0x10

/* 定时时间高低字节数据 */
#define TIMERH		0xEE
#define TIMERL		0xFF

/* 蜂鸣器定时时间 */
#define BEEPTMH		0xFF
#define BEEPTML		0x80

void InitTimer0(void);
void InitTimer1(void);
unsigned char beepcnt1;
unsigned int beepcount;
void Beep(unsigned char tms);

#define KEY1		0x20
#define KEY2		0x40
#define KEY3		0x80
unsigned char key, key_old, key_oold;

bit bkey1, bkey2, bkey3;

unsigned char advalue, adcnt;
unsigned int adsum, addisplay;

#ifdef __AT89X52_H__
unsigned char uartbuf, uart_status;
#endif

void main(void)
{
	unsigned char i, j;
	unsigned char outdat[4];

	P0 = 0xFF;
	P1 = 0xFF;
	P2 = 0xFF;

	Beep(3);

	TLC5620_Init();

	LcdInit();	
	PutStr(0, 0, " STI51 Dev Board ");
	PutStr(0, 1, "   HUST  STI   ");

	/* 测试单路输出电压 */
	TLC5620_SetOutput(CHL0, 0);
	TLC5620_SetOutput(CHL1, 0x3F);
	TLC5620_SetOutput(CHL2, 0x7F);
	TLC5620_SetOutput(CHL3, 0xFF);

#ifdef __AT89X52_H__
	uart_status = 0;
	UartInit(BAUDRATE_38400);
	SendString("STI51 Dev Board, HUST-STI\r\n");
#endif

	adcnt = 0;
	adsum = 0;

	key = P1&0xE0;
	key_oold = key_old = key;
	bkey1 = bkey2 = bkey3 = 0;

	InitTimer1();
	dispram[0] = 0;
	dispram[1] = 1;
	dispram[2] = 2;
	dispram[3] = 3;
	TR1 = 1;

	i = j = 0;
	while(1)
	{
		i++;
		/* 四路同时输出相位不同的锯齿波电压 */
		outdat[CHL0] = i;
		outdat[CHL1] = i + 64;
		outdat[CHL2] = i + 128;
		outdat[CHL3] = i + 192;
		TLC5620_AllOutput(outdat);

		if(bkey3 == 1)
		{
			advalue = TLC549_GetAD();
			if(adcnt == 255)
			{
				adcnt = 0;
				addisplay = adsum / 128;			/* 求累加和,平均值滤波 */
				dispram[0] = 0x10;					/* 刷新显示值 */
				dispram[1] = (addisplay/100) | 0x80;/* 添加小数点 */
				dispram[2] = (addisplay%100)/10;
				dispram[3] = addisplay%10;
				adsum = 0;							/* 累加值清零 */
			}
			else
			{
				adcnt++;
				adsum += advalue;					/* 累加128次 */
			}
		}

		if(key == key_old && key_old == key_oold && key != 0xE0)
		{
			EA = 0;
			if(!(key&KEY1))
			{
				bkey1 ^= 1;
				if(bkey1 == 0)
				{
					PutStr(0, 0, " STI51 Dev Board ");
					PutStr(0, 1, "   HUST  STI   ");
				}
				else
				{
					PutStr(0, 0, " KEY S3 Pressed ");
					PutStr(0, 1, "   <--- Back   ");
				}
			}
			else if(!(key&KEY2))
			{
				bkey2 ^= 1;
				bkey3 = 0;
				if(bkey2 == 0)
				{
					dispram[0] = 4;
					dispram[1] = 5;
					dispram[2] = 6;
					dispram[3] = 7;
				}
				else
				{
					dispram[0] = 0;
					dispram[1] = 1;
					dispram[2] = 2;
					dispram[3] = 3;
				}
			}
			else if(!(key&KEY3))
			{
				bkey3 = 1;
			}
			EA = 1;
		}

		if(i == 255)
		{
			if(j >= 3)
				j = 0;
			else
				j++;
		}
		P1 = 0xE0 | (~(1<<j));

#ifdef __AT89X52_H__
		/* 串口协议(0xAA, 0x55, 0xAA)处理 */
		if(IsUartReceived())
		{
			ReadChar(&uartbuf);
			if(uart_status == 0)
			{
				if(uartbuf == 0xAA)
					uart_status = 1;
				else
					uart_status = 0;
			}
			else if(uart_status == 1)
			{
				if(uartbuf == 0x55)
					uart_status = 2;
				else
					uart_status = 0;
			}
			else if(uart_status == 2)
			{
				uart_status = 0;
				if(uartbuf == 0xAA)
					SendString("Protocol: 0xAA, 0x55, 0xAA Received\r\n");
			}
			else
				uart_status = 0;
		}
#endif
	}
}

/**************************************
说明:	定时器1初始化
		定时时间10mS
**************************************/
void InitTimer1(void)
{
	/* 变量初始化 */
	seg7cs = 0;
	dispram[0] = dispram[1] = dispram[2] = dispram[3] = 0;
	/* 初始化定时器,定时时间10mS,允许定时器中断 */
	TMOD = 0x90;
	TH1 = TIMERH;
	TL1 = TIMERL;
	/* 开定时器中断 */
	EA = 1;
	ET1 = 1;
}

/**************************************
说明:	定时器1中断处理函数
**************************************/
void Timer1ISR(void) interrupt 3 using 2
{
	/* 定时器重装 */
	TH1 = TIMERH;
	TL1 = TIMERL;
	/* 清中断标志 */
	TF1 = 0;
	/* 键盘检测 */
	key_oold = key_old;
	key_old = key;
	key = P1 & 0xE0;
	/* 循环显示 */
	if(seg7cs >= 3)
		seg7cs = 0;
	else
		seg7cs++;
	WriteSegData(dispram[seg7cs]);
	WriteCsData(1<<seg7cs);
}

/**************************************
说明:	定时器初始化
		定时时间0.5mS
**************************************/
void InitTimer0(void)
{
	/* 变量初始化 */
	beepcnt1 = 0;
	beepcount = 0;
	/* 初始化定时器,定时时间0.5mS,允许定时器中断 */
	TMOD = 0x09;
	TH0 = BEEPTMH;
	TL0 = BEEPTML;
	/* 开定时器中断 */
	EA = 1;
	ET0 = 1;
}

/**************************************
说明:	定时器0中断处理函数
**************************************/
void Timer0ISR(void) interrupt 1 using 3
{
	/* 定时器重装 */
	TH0 = BEEPTMH;
	TL0 = BEEPTML;
	/* 清中断标志 */
	TF0 = 0;
	/* 循环显示 */
	if(beepcnt1%2)
		P1 ^= BEEP_PIN;
	beepcount++;
}

void Beep(unsigned char tms)
{
	InitTimer0();
	TR0 = 1;

	while(1)
	{
		if(beepcount == 1000)
		{
			EA = 0;
			beepcount = 0;
			EA = 1;
			if(beepcnt1 == 2*tms)
				break;
			else
				beepcnt1++;
		}
	}

	TR0 = 0;
	EA = 0;
	ET0 = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -