#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit squ=P1^4; sbit tri=P1^5; sbit ser=P1^6; sbit freq=P1^7; sbit cs=P3^0; bit flag; uint qian,bai,shi,ge; uint FREQ; uchar num,cho; uchar TIME0_H=0xff,TIME0_L=0xb1; //定时器的初值设定 uchar leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39}; void initial() { FREQ=100;//初始频率设定为100Hz cho=0; cs=0; TMOD=0X01; //定时器0,模式1 TH0=0xff; TL0=0xb1; IT0=1; //外部中断0,下降沿触发 EX0=1; ET0=1; EA=1; TR0=1; } void squwave()//方波,256次间断构成一个周期。若频率50Hz,即0.02=256*Ts, //则定时初值为65536-Ts*10^6; { //初值计算公式:65536-10^6/(N*FREQ) if(++num<128) P2=0x00; else P2=0xff; } void triwave()//三角波,512次间断构成一个周期 { if(!flag) { P2=num; num+=1; if(num==0) { num=255; flag=1; } } if(flag) { P2=num; num-=1; if(num==255) { num=0; flag=0; } } } void serwave() //锯齿波,256次间断构成一个周期 { P2=num++; } //延时子程序 void delay() { uint i; for(i=10;i>0;i--) ; } //频率调整 void freq_u() { uint temp; if(freq==0) FREQ+=25; if(FREQ==1000) //保证频率在100Hz到1KHz之间,达到边界频率时,调 //整为初始频率 FREQ=100; if(cho==0|cho==2) { temp=65536-3906/FREQ; //方波和锯齿波N=256;65336-10^6/(N*FREQ) TIME0_H=temp/256; TIME0_L=temp%256; } if(cho==1) { temp=65536-1953/FREQ; //三角波N=512;65336-10^6/(N*FREQ) TIME0_H=temp/256; TIME0_L=temp%256; } } //对显示的频率数据进行处理 void datadeal_f() { bai=FREQ/100; shi=FREQ0/10; ge=FREQ; } //按键中断处理程序 void keydeal() interrupt 0 { if(squ==0)//切换为方波 { FREQ=100; cho=0; qian=10;//最高位显示“A”,指示方波 } if(tri==0)//切换为三角波 { FREQ=100; cho=1; qian=11;//最高位显示“b”,指示三角波 } if(ser==0)//切换为锯齿波 { FREQ=100; cho=2; qian=12;最高位显示“C”,指示锯齿波 } if(freq==0) freq_u(); datadeal_f(); } //定时器中断处理程序 void intwave() interrupt 1 { switch(cho) { case 0:{TH0=TIME0_H;TL0=TIME0_L;squwave();break;}//方波 case 1:{TH0=TIME0_H;TL0=TIME0_L;triwave();break;}//三角波 case 2:{TH0=TIME0_H;TL0=TIME0_L;serwave();break;}//锯齿波 default: ; } } //数码管显示 void display() { P0=leddata[qian];//显示波形,A代表方波,“b”代表三角波, //“C”代表锯齿波。 P1=0xfe; delay(); P0=0x00; P0=leddata[bai];//显示频率第1位 P1=0xfd; delay(); P0=0x00; P0=leddata[shi];//显示频率第2位 P1=0xfb; delay(); P0=0x00; P0=leddata[ge];//显示频率第3位 P1=0xf7; delay(); P0=0x00; } //主函数 void main() { initial(); while(1) { display(); } }
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助