利用單片機、串行口和3位數(shù)碼管,構(gòu)建電腦設(shè)置周期可調(diào)的方波發(fā)生器。要求: (1)周期范圍200~500ms,具體數(shù)值在數(shù)碼管上顯示,顯示方式不限,共陰共陽不限; (2 )從電腦鍵盤輸入方波周期值,單片機按此周期產(chǎn)生方波,并在虛擬示波器上觀察效果。
單片機方波發(fā)生器仿真原理圖如下(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; //在范圍內(nèi)則執(zhí)行
- }
- else
- { //否則清零 重新開始
- flag=0;
- i=0;
- result=0;
- return 0;
- }
- }
- buf[i] = scan(); //按鍵值放入數(shù)組中
- 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) //按下設(shè)置鍵 進入
- {
- 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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
方波發(fā)生器.zip
(71.8 KB, 下載次數(shù): 74)
2018-1-14 14:33 上傳
點擊文件名下載附件
|