方波发生器仿真原理图如下(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; //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)
|