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

📄 keyint.c

📁 利用单片制作信号发生器
💻 C
字号:
#include <reg51.h>
#include "hardware.h"
#include "LCD1602.h"

extern bit	cur_signal;
extern unsigned int data freq;

/* 方波占空比 */
extern unsigned char data time_high, time_low;

/* 与方波频率相关 */
extern unsigned char data rect_high_TH0;
extern unsigned char data rect_high_TL0;
extern unsigned char data rect_low_TH0;
extern unsigned char data rect_low_TL0;

/* 正弦频率相关 */
extern unsigned char data sin_TH0;
extern unsigned char data sin_TL0;

/* 与幅度相关 */
extern unsigned char data range_low, range_high;
extern float data proportion; /* 幅度与DAC量程之比 */ 
extern unsigned char data range_low_data; /* 幅值下界对应的DAC的数字量 */




extern void mdelay(unsigned int msec);
void enable_timer1()
{
	TMOD = 0X10; /* 方式1, 定时器1	*/ 
	ET1 = 1;
	PT1 = 1;
	EA = 1;
	TR1 = 1;
}



void key_scan_ISR() interrupt 3 using 0
{
	unsigned int  count;
	unsigned char dec_bit;
	bit update_rect = 0x21;
	bit update_sin_freq = 0x22;

	KEYPORT = 0Xff;
	if (KEYPORT == 0xff) goto out;
	mdelay(10);
	if (KEYPORT == 0xff) goto out;

	if((KEYPORT & 0xf) != 0xf)
		update_rect = update_sin_freq = 1;
	else
		update_rect = update_sin_freq = 0;
	
	if((KEYPORT & 0x8) == 0) {	//频率 千位调节
		freq += 1000;
		if (freq > 4000) freq -= 4000;
		dec_bit = (freq / 1000)+0x30;
		LCD_write_data(0, 0xa, dec_bit);
	} else if ((KEYPORT & 0x4) == 0) { //百位
		freq += 100;
		if ((freq % 1000) < 100) 
			freq = freq - 1000;
		dec_bit = ((freq / 100) % 10) + 0x30;
		LCD_write_data(0, 0xb, dec_bit);
	} else if ((KEYPORT & 0x2) == 0) { //十位
		freq += 10;
		if ((freq % 100 )< 10)
			freq = freq - 100;
		dec_bit = ((freq / 10) % 10) + 0x30;
		LCD_write_data(0, 0xc, dec_bit);
	} else if ( (KEYPORT & 0x1) == 0) { //个位
		freq++;
		if ((freq % 10) == 0) 
			freq -= 10;
		dec_bit = freq % 10 + 0x30;
		LCD_write_data(0, 0xd, dec_bit);
	} 

	else if ( (KEYPORT & 0x20) == 0) { //方波占空比  和正弦幅度设置
		if (cur_signal == SIG_RECT) { //若当前为方波,调节占空比
			time_high++;
			if (time_high > 9) 
				time_high = 1;
			LCD_write_data(0, 4, time_high + 0x30);
			LCD_write_data(0, 5, 'H');
			update_rect = 1;
		} else { // 若为正弦, 则调节幅度
			range_high += 10;
			if (range_high <= range_low )
				range_high = range_low + 10;
			proportion = (float)(range_high - range_low) / 0xff;
			///////////////////////////////out put
		
			dec_bit = range_high / 50 + 0x30;//将256个阶分为25份,每份10, 对于Vref为5V的情况,10近似地代表0.2V 
											//50近似代表1V, 所以这里的dec_bit表示幅度的整数部分
			LCD_write_data(0, 6, dec_bit);
			dec_bit = (range_high / 5) % 10 + 0x30;// range_low /5 表示0。1V的个数, %10 取个位数
			LCD_write_data(0, 8, dec_bit);
		}
	} else if (((KEYPORT & 0x10) == 0)) {
		if (cur_signal == SIG_RECT) {
			time_low++;
			if (time_low > 9)
				time_low = 1;
			LCD_write_data(0, 6, time_low + 0x30);
			LCD_write_data(0, 7, 'L');
			update_rect = 1;
		} else {
			range_low += 10;
			if (range_low >= range_high)
				range_low = 0;
			proportion = (float)(range_high - range_low) / 0xff;
			//range_low_data = range_low / ((float)Vref / 256);
			dec_bit = range_low / 50 + 0x30;//将256个阶分为25份,每份10, 对于Vref为5V的情况,10近似地代表0.2V 
											//50近似代表1V, 所以这里的dec_bit表示幅度的整数部分
			LCD_write_data(0, 2, dec_bit);
			dec_bit = (range_low / 5) % 10 + 0x30;// range_low /5 表示0。1V的个数, %10 取个位数
			LCD_write_data(0, 4, dec_bit);
		}
	}
	else if ((KEYPORT & 0x40) == 0) {	
		cur_signal = SIG_RECT;
	} else if ((KEYPORT & 0x80) == 0) {
		cur_signal = SIG_SIN;
		
	}
	if (update_rect) {
		count = (HZ * time_high) / (freq * 12 * (time_high + time_low)) * 1000000;
		rect_high_TL0 = (unsigned char) count; 
		rect_high_TH0 = count >> 8;
		
		count = (HZ * time_low) / (freq * 12 * (time_high + time_low)) * 1000000;
		rect_low_TL0 = (unsigned char) count; 
		rect_low_TH0 = count >> 8;
	}
	if (update_sin_freq) {
		count = (HZ / (12 * 256 * freq)) * 1000000;

		sin_TL0 = (unsigned char) count;
		sin_TH0 = count >> 8;
	}
	while(KEYPORT != 0xff);//等待按键松开
out:
	TH1 = 0x3c;
	TL1 = 0xb0;
	return ;
}

⌨️ 快捷键说明

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