喇叭的代碼:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P2^0; //定義喇叭輸出端口
uchar tick,tl,th; //定義節(jié)拍和T0初值變量
uchar TABLE[]={ //音符節(jié)拍表
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x00};
uchar TABLE1[]={ //定時(shí)器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,
0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,
0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
//T0中斷服務(wù)函數(shù)
timer0()interrupt 1 using 1{
TL0=tl;TH0=th;
BEEP=~BEEP;
}
//基本單位延時(shí)函數(shù)
void delay1(){
uint i;
for(i=0;i<20000;i++);
}
//節(jié)拍延時(shí)函數(shù)
void delay(tt){
uchar i;
for(i=0;i<=tt;i++)delay1();
}
//主函數(shù)
void main(){
uchar t,t1,k=0;
while(1){
TMOD=0x01;IE=0x82;
while(TABLE[k]!=0){
tick=(TABLE[k])&0x0f;
t=(_crol_(TABLE[k],4))&0x0f;
if(t!=0){
t1=--t*2+1;
t=t*2;
tl=TL0=TABLE1[t1];
th=TH0=TABLE1[t];
TR0=1;
}
else TR0=0;
delay(tick);
k++;
}
TR0=0;
}
}
=================
點(diǎn)陣的代碼:
#include<reg52.h>
#include<intrins.h>
//intrins.h函數(shù),一般出現(xiàn)在C51單片機(jī)編程中,一般程序中需要使用到空指令_nop_();字符循環(huán)移位指令_crol_等時(shí)使用
//OE 第13腳 輸出有效(低電平)
//MR 第10腳 主復(fù)位(低電平)
typedef unsigned char uchar;
typedef unsigned int uint;
/*
上面引腳控制行,行共陰,即低電平選中
下面引腳控制列,列共陽,即高電平選中
*/
sbit SER = P3^4; //p3.4串行數(shù)據(jù)輸入 DS
sbit SCK = P3^6; //串行輸入時(shí)鐘,上升沿有效 SHCP 第11腳 數(shù)據(jù)輸入時(shí)鐘線
sbit RCK = P3^5; //串行寄存器時(shí)鐘,上升沿有效 STCP 第12腳 輸出存儲(chǔ)器鎖存時(shí)鐘線
void SendTo595(uchar Data);
char shu=0xFE;
char a[32]={0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,
0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,
0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x7e,
0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08} ;//列
void delay(unsigned int n)//延時(shí)函數(shù)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void Hang()//行掃描
{
P1=shu;
shu=_crol_(shu,1);
}
void main(){
int i=0,changeRow=0;
RCK=0;
while(1){
int speed=12; //控制速度
while(speed--){
for(i=0;i<8;i++){
Hang();
SendTo595(a[i+changeRow]); //串行,控制列.
delay(4);
}
}
changeRow++; //原來的第二行,變成第一行了.
if (changeRow>=24) changeRow=0; //循環(huán)開始.
}
}
void SendTo595(uchar Data){
int i;
for(i=0;i<8;i++){
SCK=0;
SER = 0x80&Data;
Data = _crol_(Data,1);
SCK=1;
nop_();//等待一個(gè)機(jī)器指令時(shí)間. }
/*位移寄存器完畢,轉(zhuǎn)移到存儲(chǔ)寄存器*/
RCK = 1; //上升沿,存儲(chǔ)寄存器變?yōu)楦唠娖?延遲兩個(gè)時(shí)鐘周期
_nop_();
_nop_();
RCK = 0; //不加出錯(cuò),因?yàn)殡娖讲蛔兓鎯?chǔ)寄存器的內(nèi)容不變,為第一次輸入的移位寄存器內(nèi)容0x00.
}
}
本人編程不好,請師傅們幫忙把他們變成一個(gè)程序,仿真時(shí)一起工作,多謝了 !
|