?? httt.c
字號:
#include<REG51.h>
#define uchar unsigned char
#define uint unsigned int
#define led P0 //P0口控制數(shù)碼管
#define DAC0832 P1 //P1口控制0832的輸入
#define ledxuan P2 //P2口位選
uchar code leddig[]={ 0xef,0xdf,0xbf,0x7f}; //位選碼
uchar code ledcode[]={0x3f,0x06,0x5b,0x4f, // 斷碼
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x79,0x40};
uchar code sin[256]={ 0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96, //正弦信號碼表
0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,
0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,
0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,
0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,
0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,
0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,
0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69,
0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,
0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,
0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,
0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,
0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80 };
sbit keymode=P2^3; //按鍵四個,分別是 模式建,調(diào)節(jié)控制建,位選移動鍵,數(shù)值加1鍵
sbit keyset=P2^0; //四建分別在 P2^0--P2^3口
sbit keymove=P2^1;
sbit keyup=P2^2;
bit setflag=0; //調(diào)節(jié)標志
uchar mode=0,movenum=1,led4[4],wei,N=0,M=0;
uint freq;
void key() //按鍵函數(shù)
{
uchar keynum;
keynum=keymode&keyset&keymove&keyup; //有無按鍵按下 判定位,按下為0,沒有為1
if(keynum==0)
{
if(keymode==0) { while(keymode==0); //等待按鍵彈起,消顫
if(mode<=3) mode++; //模式的循環(huán)選擇(1,2,3,4種)
else mode=1;
led4[0]=mode;
N=0;
}
else if(keyset==0) { while(keyset==0); //等待按鍵彈起,消顫
setflag=~setflag; //判斷可否調(diào)節(jié)的位
}
else if(keymove==0) { while(keymove==0); //等待按鍵彈起,消顫
if(setflag)
if(movenum<=2) movenum++; //要調(diào)節(jié)的位的循環(huán)選擇 (1,2,3位)
else movenum=1;
}
else if(keyup==0) { while(keyup==0); //等待按鍵彈起,消顫
if(setflag)
if(led4[movenum]<=8) led4[movenum]++; //調(diào)節(jié)的位的加1
else led4[movenum]=0;
}
}
}
void display() //顯示函數(shù)
{
uchar n;
ledxuan=leddig[wei]; //位選
n=led4[wei]; //鍵值
if(wei==movenum&setflag==1) led=ledcode[n]|0x80; //該位被選中,則可以調(diào)節(jié),該位小數(shù)點亮
else led=ledcode[n]; //該位沒被選中 ,不亮小數(shù)點
if(wei<=2) wei++; //位選循環(huán),準備顯示下一位
else wei=0;
}
void output() //波形輸出函數(shù)
{
switch(mode) //根據(jù)模式唻輸出
{
case 1: //方波
{ if(N<=128) DAC0832=0x00;
else DAC0832=0xff;
N=N+8;
break;
}
case 2: //鋸齒
{ DAC0832=N;
N=N+8;
break;
}
case 3: //三角波
{
if(M==0)
{N=N+8;
DAC0832=N;
if(N==248)
M=1;
}
if(M==1)
{ N=N-8;
DAC0832=N;
if(N==0)
{
M=0;}
}
break;
}
case 4: //正弦波
{ DAC0832=sin[N];
N=N+8;
break;
}
default:break;
}
}
void work() interrupt 1 //定時器0,
{
freq=led4[1]*100+led4[2]*10+led4[3]; // 計算輸入的鍵值即為頻率值
if(freq!=0)
{ freq=22118400/12/freq/32; //頻率值轉(zhuǎn)換成定時器的定時數(shù)
TH0=(-freq)>>8;
TL0=(-freq);
output(); //輸出波形
}
else DAC0832=0x00;
}
void displayer() interrupt 3 //定時器1
{
TR1=0; //定時器關
TH1=(-300)>>8; //定時數(shù)重裝
TL1=(-300);
display(); //顯示函數(shù)調(diào)用
TR1=1; //定時器開
}
void initial() //初始化函數(shù)
{
DAC0832=0; // 數(shù)模初始值為0
led=0x00; //數(shù)碼管初始
ledxuan=0xff; //位選初始
EA=1; //中斷允許
TMOD=0x11; //定時器0,1的方式都是1
TH0=(-300)>>8; //定時器0初值裝入
TL0=(-300);
ET0=1; //中斷0允許
TR0=1; //定時器0開
TH1=(-300)>>8; //定時器1初值裝入
TL1=(-300); //中斷1允許
ET1=1; //定時器1開
TR1=1;
}
void main(void) //主函數(shù)
{
initial(); //初始化
while(1){key();} //死循環(huán),調(diào)用按鍵函數(shù)
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -