利用51单片机设计一信号发生器

如题所述

/////51单片机P2口接4*4键盘的行线和列线;红灯亮时进行频率输入;绿灯亮时进行占空比输入;频率值暂定在100到60KHZ之间;输入频率和占空比时要输够六位整数,不够的在前面补0;占空比以百比数(0-100)形式存在。///////////
/////////方波发生器资料。空军工程大学导院501明明,2007.10.10初稿/////////
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
sbit coma=P1^0;
sbit comb=P1^1;
sbit comc=P1^2;
sbit comd=P1^3;
sbit come=P1^4;
sbit red=P1^5;
sbit green=P1^6;
sbit new=P1^7;
sbit Q=P3^7;
int i,x,y;

/* 延时函数 */
void delay(void)
{
uchar j;
for (j=300;j>0;j--);
}

/*数字对应的共阳极段码*/
uchar getcode(uchar i)
{
uchar p;
switch (i)
{
case 0: p=0xC0; break; /* 0 */
case 1: p=0xF9; break; /* 1 */
case 2: p=0xA4; break; /* 2 */
case 3: p=0xB0; break; /* 3 */
case 4: p=0x99; break; /* 4 */
case 5: p=0x92; break; /* 5 */
case 6: p=0x82; break; /* 6 */
case 7: p=0xF8; break; /* 7 */
case 8: p=0x80; break; /* 8 */
case 9: p=0x90; break; /* 9 */
default: break;
}
return(p);
}
/////////显示函数/////////
void display(int t)
{int a=t/10000,b=t/1000%10,c=t/100%10,d=t/10%10,e=t%10;
P1=0x00;
P0=getcode(a);coma=1;comb=0;delay();
P0=getcode(b);coma=0;comb=1;delay();
P0=getcode(c);comb=0;comc=1;delay();
P0=getcode(d);comc=0;comd=1;delay();
P0=getcode(e);comd=0;come=1;delay();
}

/* 键扫描函数 */
uchar keyscan(void)
{
uchar scancode,tmpcode;
P2 = 0xf0; // 发全0行扫描码
if ((P2&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((P2&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
P2 = scancode; // 输出行扫描码
if ((P2&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (P2&0xf0)|0x0f;

/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
/////////////T0中断/////////
timer0 () interrupt 1
{
Q=~Q;
i=~i;
if(i)
{TL0=65536-(1000000/y*(1-x/100))%256; ////输出低电平状态计数器所需溢出次数///
TH0=65536-(1000000/y*(1-x/100))/256;}

else
{TL0=65536-(1000000/y*(x/100))%256; ////输出高电平状态计数器所需溢出次数///
TH0=65536-(1000000/y*(x/100))/256;}
}
///////////主函数///////////
main( )
{
int key,count,confirm;
Q=1;
TMOD=0x01;
EA=1;ET0=1;
while(1)
{TR0=1;red=1;
while(confirm<2)
{
key = keyscan(); // 调用键盘扫描函数
switch(key)
{case 0x11: if (count<=5) {x=10*x;count++;} break; // 1行1列,数字0
case 0x21: if (count<=5) {x=10*x+1;count++;} break;// 1行2列,数字1
case 0x41: if (count<=5) {x=10*x+2;count++;} break;// 1行3列,数字2
case 0x81: if (count<=5) {x=10*x+3;count++;} break;// 1行4列,数字3
case 0x12: if (count<=5) {x=10*x+4;count++;} break;// 2行1列,数字4
case 0x22: if (count<=5) {x=10*x+5;count++;}break; // 2行2列,数字5
case 0x42: if (count<=5) {x=10*x+6;count++;} break;// 2行3列,数字6
case 0x82: if (count<=5) {x=10*x+7;count++;} break;// 2行4列,数字7
case 0x14: if (count<=5) {x=10*x+8;count++;} break;// 3行1列,数字8
case 0x24: if (count<=5) {x=10*x+9;count++;} break;// 3行2列,数字9
case 0x44: if (count==5) {if(confirm==0)
{y=x;x=0;count=0;red=0;green=1;}confirm++;} break;// 3行3列,确认键
//输入完频率,按下确认键,再输入占空比
case 0x84: x=0;count=0; break; // 3行4列,取消键
default: break;
}
display(x);
}
TR0=1;
if(new==0)
{ delay();if(new==0){confirm=0;y=0;x=0;count=0;} }
}}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-14
正弦波、三角波、锯齿波、方波等函数信号发生器仿真与C程序资料,x宝搜下吧
相似回答