标题:
单片机方波发生器Proteus仿真+代码
[打印本页]
作者:
zw5200
时间:
2018-12-21 12:42
标题:
单片机方波发生器Proteus仿真+代码
方波发生器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(15.73 KB, 下载次数: 53)
下载附件
2018-12-21 17:51 上传
0.png
(39.66 KB, 下载次数: 47)
下载附件
2018-12-21 17:55 上传
单片机源程序如下:
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit L1 = P1^0; //定义键盘的四列线
sbit L2 = P1^1;
sbit L3 = P1^2;
sbit L4 = P1^3;
sbit OUT=P3^0; //定义输出端口
uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar get_value(void); //段码表
void display_s();
void timer_init();
void delay(uint z);
char scan(void) ;
uchar num=0;
uchar temp=0;
uint result=0; //result为周期
bit flag=0;
uchar flag1=0; //flag1为确认状态
uchar a=0,b=0,c=0; //a,b,c为输入值
uchar buf[4]={0,0,0,0};
uchar buffer;
void main()
{
timer_init() ; //初始化
while(1)
{
flag1=get_value(); //获取确认的flag1
temp=result/2; //计算出周期一半
if(flag1==1)
{
TR0=1; //打开定时器
}
display_s(); //显示
}
}
void timer_init() //方式一 定时1ms
{
TMOD=0X01; //定时器T0为方式一
TH0=(65536-1000)/256; //TH放高8位
TL0=(65536-1000)%256; //TL放低8位
TR0=0;
ET0=1;//允许定时器0中断
EA=1;//总中断允许
}
void timer() interrupt 1 //T0中断函数
{
TH0=(65536-1000)/256; //重新赋值
TL0=(65536-1000)%256; //
num++; //循环次数加1
if(num==temp)
{
OUT=~OUT; //取反输出
num=0;//重置循环次数
}
}
uchar get_value()
{
static uchar i=0;
uchar j=0;
P1 &= 0x0f;
if(P1 != 0x0f)
{
delay(10);
P1 &= 0x0f;
if(P1 != 0x0f)
{
if(flag==1)
{
if(scan()==10)//当按下确认键时进入
{
if((result <= 250)&&(result >= 50)) //判断范围
{
i=0;
flag=0;
return 1; //在范围内则执行
}
else
{ //否则清零 重新开始
flag=0;
i=0;
result=0;
return 0;
}
}
buf[i] = scan(); //按键值放入数组中
i++;
result=0;
for(j=0;j<i;j++)
{
buffer = buf[j] ;
result = result*10 + buffer; //计算输入值和
}
if(i==4)
{
i=0;
result=999;
flag=0;
}
}
if( scan()==11) //按下设置键 进入
{
flag=1;
flag1=0;
TR0=0;
result=0;
}
}
while(P1 != 0x0f)
{
P1 &= 0x0f;
}
}
return 0;
}
void display_s() //扫描显示
{
a = result / 100;
b = result %100/10 ;
c = result % 10;
P2=0x04; //个位位选打开
delay(1);
P0=dis_code[c];
delay(1);
P0=0xff;
delay(1);
P2=0x02; //十位位选打开
delay(1);
P0=dis_code[b];
delay(1);
P0=0xff;
delay(1);
P2=0x01; //百位位选打开
delay(1);
P0=dis_code[a];
delay(1);
P0=0xff;
delay(1);
}
char scan(void) //按键键值扫描
{
uchar temp,i;
P1=0xef;
for(i=0;i<=3;i++)
{
if(L1==0) //判断第一列是否有键按下,若有,可能是0,4,8
{
delay(3);
if(L1==0)
{
return (i*4+0);
}
while(L1==0);
}
if(L2==0) //判断第二列是否有键按下,若有,可能是1,5,9
{
delay(3);
if(L2==0)
{
return (i*4+1);
}
while(L2==0);
}
if(L3==0) //判断第三列是否有键按下,若有,可能是2.6
{
delay(3);
if(L3==0)
{
return (i*4+2);
}
while(L3==0);
}
if(L4==0) //判断第四列是否有键按下,若有,可能是3.7
{
delay(3);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
方波发生器.zip
(21.69 KB, 下载次数: 59)
2018-12-21 12:42 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
茹酸菌
时间:
2020-5-18 08:44
很不错,谢谢版主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1