找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

51制作的方波发生器(按键部分思路新奇)

[复制链接]
admin 发表于 2012-8-24 11:02:21 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
这是勇子同学用51单片机做的方波发生器,程序拿来晒一晒,分享一下。按键部分思路新奇,4个IO口控制16位矩阵键盘,源代码细观其下:

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^2; //1602使能引脚
sbit RW=P2^1; //1602读写引脚
sbit RS=P2^0; //1602数据/命令选择引脚
sbit pwm=P1^0;
sbit led=P1^1;

sbit k1=P2^3;
sbit k2=P2^4;
sbit k3=P2^5;
sbit k4=P2^6;
int n,n1,num;

uchar fl=1;
uchar x[17]={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
uchar y[17]={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
uchar x1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar y1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void delay(uint i);
uchar keyscan(void);
void delay1() //延时,延时时间大概为5US。
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

/********************************************************************
* //名称 : bit Busy(void)
* // 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
***********************************************************************/
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delay1();
busy_flag = (bit)(P0 & 0x80);
E = 0;
return busy_flag;
}
/********************************************************************
* 名称 : wcmd(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void wcmd(uchar del)
{
while(Busy());
RS = 0;
RW = 0;
E = 0;
delay1();
P0 = del;
delay1();
E = 1;
delay1();
E = 0;
}

/********************************************************************
* 名称 : wdata(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
***********************************************************************/

void wdata(uchar del)
{
while(Busy());
RS = 1;
RW = 0;
E = 0;
delay1();
P0 = del;
delay1();
E = 1;
delay1();
E = 0;
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
***********************************************************************/
void L1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}

/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
wcmd(a);
wdata(sign);
}
///********************************************************************
//* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
//* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
// L1602_string(1,5,"ab cd ef;")
//* 输入 : 行,列,需要输入1602的数据
//* 输出 : 无
//***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
wcmd(a++);
b++;
if((*p == '\0')||(b==16)) break;
wdata(*p);
p++;
}
}
void jisuann()
{ uchar a;
for(a=12;a<17;a++)
{ if( x[13]=='.')
n=(x1[12]*20+x1[14]*2);
if( x[14]=='.')
n=(x1[12]*200+x1[13]*20+x1[15]*2);
if(x[15]=='.')
n=(x1[12]*2000+x1[13]*200+x1[14]*20+x1[16]*2);


}
}

void jisuann1()
{ unsigned char a;
for(a=7;a<17;a++)
{ if( y[8]=='.')
n1=(y1[7]*20+y1[9]*2);
if(y[9]=='.')
n1=(y1[7]*200+y1[8]*20+y1[10]*2);
if(y[10]=='.')
n1=(y1[7]*2000+y1[8]*200+y1[9]*20+y1[11]*2);
if(y[11]=='.')
n1=(y1[7]*20000+y1[8]*2000+y1[9]*200+y1[10]*20+y1[12]*2);
}
}
void shuchu() //输出PWM波

{
if(num==n)
pwm=0;
if (num==n1)
{num=1;
pwm=1;
}
}


void xianshi1() //显示
{
uchar i;
L1602_string(1,1,"H time(ms):");
for(i=12;i<17;i++) //1行
L1602_char(1,i,x);
}
void xianshi2() //显示
{
uchar i;
L1602_string(2,1,"T(ms):");
for(i=7;i<15;i++)
L1602_char(2,i,y); //2行
}
void main()
{
uchar key,i=12;
TMOD=0x01;//定时器0工作方式1
TH0=(65536-35)/256;
TL0=(65536-35)%256;//装初值0.05ms 35 11.0592
L1602_init();
k1=1;
k2=1;
k3=1;
k4=1;
led=0;
xianshi1();
while(1)
{ xianshi1();
i=12;
while(fl==1)
{
key=keyscan();
switch(key)
{
case 0:x='0';i++;break;//0
case 1:x='1';i++;break;//1
case 2:x='2';i++;break;//2
case 3:x='3';i++;break;//3
case 4:x='4';i++;break;//4
case 5:x='5';i++;break;//5
case 6:x='6';i++;break;//6
case 7:x='7';i++;break;//7
case 8:x='8';i++;break;//8
case 9:x='9';i++;break;//9
case 10:x='.';i++;break;//.
case 11:i--;x=' ';break;//退格
case 12:for(i=16;i>11;i--)x=' ';break;//清零
case 13:fl=0;break;// ok
case 14:fl=0;break;//
case 15:fl=0;break;//
}
L1602_init();
xianshi1();
}
L1602_init();
xianshi1();
xianshi2();
i=6;
while(fl==0)
{
key=keyscan();
switch(key)
{
case 0:y='0';i++;break;//0
case 1:y='1';i++;break;//1
case 2:y='2';i++;break;//2
case 3:y='3';i++;break;//3
case 4:y='4';i++;break;//4
case 5:y='5';i++;break;//5
case 6:y='6';i++;break;//6
case 7:y='7';i++;break;//7
case 8:y='8';i++;break;//8
case 9:y='9';i++;break;//9
case 10:y='.';i++;break;//.
case 11:i--;y=' ';break;//退格
case 12:for(i=16;i>6;i--)y=' ';break;//全部清零
case 13:fl=1;break;// ok
case 14:fl=1;break;//
case 15:fl=1;break;
}
xianshi1();
xianshi2();
}
led=1;
for(i=0;i<16;i++)
{
x1=x-48;
y1=y-48;
}
jisuann();
jisuann1();
EA=1;//开总中断
ET0=1;//开定时器零中断
TR0=1;//启动定时器0
while(1)
{
shuchu();
}
}
}

void exter0 () interrupt 1
{

TH0=(65536-35)/256;
TL0=(65536-35)%256;//装初值0.05ms 35 11.0592
num++;
}


uchar keyscan(void)
{
k1=0;
k2=1;
k3=1;
k4=1;
delay(100);
if(k1==1)
{
delay(20);
while(k1==1);//if(k1==1)
return(0);
}

delay(200);
if(k2==0)
{
delay(20);
while(k2==0);//if(k2==0)
return(1);
}
delay(200);
if(k3==0)
{
delay(20);
while(k3==0);//if(k3==0)
return(2);
}
delay(200);
if(k4==0)
{
delay(20);
while(k4==0);//if(k4==0)
return(3);
}
delay(200);
k1=1;
k2=0;
k3=1;
k4=1;
if(k1==0)
{
delay(20);
while(k1==0);//if(k1==0)
return(4);
}
delay(200);
if(k2==1)
{
delay(20);
while(k2==1);//if(k2==1)
return(5);
}
delay(200);
if(k3==0)
{
delay(20);
while(k3==0);//if(k3==0)
return(6);
}
delay(200);
if (k4==0)
{
delay(20);
while(k4==0);//if(k4==0)
return(7);
}
delay(200);

k1=1;
k2=1;
k3=0;
k4=1;
if(k1==0)
{
delay(20);
while(k1==0);//if(k1==0)
return(8);
}
delay(200);
if (k2==0)
{
delay(20);
while(k2==0);//if(k2==0)
return(9);
}
delay(200);
if(k3==1)
{
delay(20);
while(k3==1);//if(k3==1)
return(10);
}
delay(200);
if(k4==0)
{
delay(20);
while(k4==0);//if(k4==0)
return(11);
}
delay(200);
k1=1;
k2=1;
k3=1;
k4=0;
if(k1==0)
{
delay(20);
while(k1==0);//if(k1==0)
return(12);
}
delay(200);
if(k2==0)
{
delay(20);
while(k2==0);//if(k2==0)
return(13);
}
delay(200);
if(k3==0)
{
delay(20);
while(k3==0);//if(k3==0)
return(14);
}
delay(200);
if(k4==1)
{
delay(20);
while(k4==1);//if(k4==1)
return(15);
}
return 16;
}

void delay(uint i) //延时函数
{
int a,b ;
for(a=0;a<i;a++)
for(b=0;b<5;b++) ;
}


 楼主| admin 发表于 2012-8-24 11:02:23 | 显示全部楼层
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-27 08:20 , Processed in 0.050813 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表