📄 main.c
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:简易函数发生器 **
//**<功能>:根据键盘控制产生10~500Hz的正弦信号。 **
//**<版本说明>:这是第1.3版,LCD显示的是采点变化时计时器溢出的次数。 **
//**<作者>:程沛 **
//**<完成时间>:2007年8月8日 **
//**<联系方式>:superyongzhe@163.com **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************头文件及宏定义************************** *
//* *
//*************************************************************************************************
#include "includes.h"
#define START P3_4 //0--开启DA转换;1--关闭DA转换。
#define TIME0H 0xFF //定时器0溢出时间:0.001ms
#define TIME1H 0x3C
#define TIME1L 0xB0 //定时器1溢出时间:50ms
//*************************************************************************************************
//* *
//* ********************************全局变量****************************** *
//* *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DA转换>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uca_SinaCode[]={0x7F,0xA6,0xCA,0xE6,0xF8,0xFE,0xF8,0xE6,0xCA,0xA6,
0x7F,0x58,0x34,0x18,0x06,0x00,0x06,0x18,0x34,0x58};
//正弦函数采点。
unsigned char uc_DACount=0; //DA转换采点选择计数。
unsigned long ul_TimeCount=0; //DA转换定时器0计数。
unsigned long ul_TimeMax=50; //DA转换定时器0计数最大值,调整此值可以调整输出频率。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //键盘防抖动标志位。
//当按键中断产生时,首先判断此位。
//0--执行键盘扫描及键码处理程序;1--不执行。
bit b_KillShock=0; //防抖标志清除位:0--不清除;1--清除。
unsigned char uc_KillCount=1; //抖动标志清除计数,使用定时器1。
//*************************************************************************************************
//* *
//* *****************************************主函数************************************* *
//* *
//*************************************************************************************************
void main()
{
vdInitialize(); //初始化LCD。
vWriteCMD(0x83); //输出提示信息。
vShowChar("Frequency:");
// vShowFrequency(ul_TimeMax);
vWriteCMD(0xC9);
vShowChar("Count");
P1=0x0F; //初始化键盘。
START=0; //开启AD转换。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; // 中断方式:下降沿。
EX0=1; // 开启外部中断。
PX0=1;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<初始化定时器>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TMOD=0x02; //定时器0:模式2;定时器1:模式0。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0,定时改变DA输出>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME0H;
TR0=1;
ET0=1;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //开启定时器1。
ET1=1; //开定时器1中断。
EA=1; //开启总中断。
while(1);
}
//*************************************************************************************************
//* *
//* ****************************外部中断0,用于开启键盘扫描及键码处理******************** *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
if(b_KeyShock==0)
{
vKeyProcess(ucKeyScan()); //开启键盘扫描标志。
b_KeyShock=1; //设置防抖动标志。
}
else b_KeyShock=0; //如果有抖动则不执行键扫描,恢复防抖动标志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖动标志位开启则开启防抖动标志清除位,
//300ms后清除防抖动标志。
}
//*************************************************************************************************
//* *
//* **************************定时器0中断,定时改变DA输出***************************** *
//* *
//*************************************************************************************************
void vTimer0() interrupt 1
{
if(ul_TimeCount==ul_TimeMax) //此句,ul_TimeCount++;和ul_TimeCount=0;用于控制频率。
{
P0=uca_SinaCode[uc_DACount];
if(uc_DACount==19) //此句用于采点选择循环。
uc_DACount=0;
else
uc_DACount++;
ul_TimeCount=0;
}
else
ul_TimeCount++;
}
//*************************************************************************************************
//* *
//* ***************************定时器1中断,用于防抖动标志清除*************************** *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
if(b_KillShock==1)
{
if(uc_KillCount==5) //当防抖动标志位为1时,计时300ms后清除抖动标志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=1;
}
else uc_KillCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -