利用单片机、串行口和3位数码管,构建电脑设置周期可调的方波发生器。要求: (1)周期范围200~500ms,具体数值在数码管上显示,显示方式不限,共阴共阳不限; (2 )从电脑键盘输入方波周期值,单片机按此周期产生方波,并在虚拟示波器上观察效果。
单片机方波发生器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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;
- bit flag=0;
- uchar flag1=0;
- uchar a=0,b=0,c=0;
- 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;
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- TR0=0;
- ET0=1;
- EA=1;
- }
- void timer() interrupt 1
- {
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- num++;
- 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)
- {
- delay(3);
- if(L1==0)
- {
- return (i*4+0);
- }
- while(L1==0);
- }
- if(L2==0)
- {
- delay(3);
- if(L2==0)
- {
- return (i*4+1);
- }
- while(L2==0);
- }
- if(L3==0)
- {
- delay(3);
- if(L3==0)
- {
- return (i*4+2);
- }
- while(L3==0);
-
- }
- if(L4==0)
- {
- delay(3);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
方波发生器.zip
(71.8 KB, 下载次数: 74)
|