单片机程序源代码

  • 格式:docx
  • 大小:11.05 KB
  • 文档页数:8

第二章

任务一:闪烁广告灯的设计

利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。

#include<>

#define uint unsigned int

#define uchar unsigned char

sbit LED1=P0^0;

sbit LED2=P0^1;

void delayms(uint ms)

{

uint i;

while(ms--)

{

for(i=0;i<120;i++);

}

}

void main()

{

while(1)

{

LED1=0;

LED2=1;

delayms(500);

LED1=1;

LED2=0;

delayms(500);

}

}

任务二:流水广告灯的设计

利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4

->D3->D2->D1->D0,重复循环。

#include<>

#include <>

#define uint unsigned int

#define uchar unsigned char

uint i;

uchar temp;

uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delayms(uint ms)

{

while(ms--)

{ uint j; for(j=0;j<120;j++);

}

}

void main()

{

while(1)

{

P0=0xfe;

while(P0!=0x7f)

{

7f89c89c0f89c0a0f7f0f0f0f7f7f2L3f4f7f6f7fDelay==0)

break;

else

{

sound(&music[n]);

n++ ;

}

}

}

void main()

{

init();

while(1)

{

if(key==0)

{

delayms(5);

play(table1);

}

SPEAKER=1;

}

}

void inter() interrupt 1

{

TH0 = ReloadH;

TL0 = ReloadL;

SPEAKER = !SPEAKER; //音乐声频的半个波

}

(3)

#include<>//头文件

#define uint unsigned int

#define uchar unsigned char//宏定义

sbit beep=P1^0;//按键位声明 void Beep() //“叮咚”子函数

{

uint i,j;

for(i=300;i;i--)//持续时间

{

beep=~beep;

for(j=240;j;j--);//频率

}

for(i=200;i;i--)//持续时间

{

beep=~beep;

for(j=180;j;j--);//频率

}

}

void init() //初始化子函数

{

EA=1; //打开总中断

TMOD=0x05;//设置计数器0 工作方式1

ET0=1; //打开计数器0中断

TR0=1;//启动定时器0

TH0=0xff;

TL0=0xff;//计数器赋初值

}

void beep_interrupt() interrupt 1 //计数器0中断服务子程序

{

TH0=0xff;

TL0=0xff;//计数器初值

Beep();//调用“叮咚”子函数

}

void main()//主函数

{

init();//调用初始化函数

while(1);//等待按键按下

}

任务七:速度可调流水灯控制

假设单片机晶振频率为12MHz, 单片机P0口外接8只LED,外接按键K1,外接按键K2。编写程序,每次按下按键K1时,加快8只LED的流水显示速度;每次按下按键K2时,降低8只LED的流水显示速度。

#include<>

#define uint unsigned int

#define uchar unsigned char

uchar table[15]={

0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f, 0xbf,0xdf,0xef,0xf7,

0xfb,0xfd,0xfe};

uint count,i,num;

void int_int()

{

EA=1;

EX0=1;//允许外部中断

EX1=1;

IT0=1;//下降沿有效

IT1=1;

TL0=(65535-50000)%256;

TH0=(65535-50000)/256;

TMOD=0X01;//方式

TR0=1;

ET0=1;

num=10000;

}

void key1_1() interrupt 0

{

num=num-2000;

if(num<=2000)num=2000;

}

void key2_2() interrupt 2

{

num=num+2000;

if(num>=60000)num=60000;

}

void timer_0() interrupt 1

{

TL0=(65535-num)%256;

TH0=(65535-num)/256;

count++;

if(count==20)

{

count=0;

if(i!=15)

{

P0=table[i];

i++;

}

else

i=1; }

}

void main()

{

int_int();

while(1);

}

(2)

#include<>

//#define uint unsigned int

#include<>

int num=0;

int time=0;

int aa=0xfe;

void init()

{

EA=1; //打开总中断

ET0=1;//打开定时器0中断

TR0=1; //启动定时器0

TMOD=0x01;//设置定时器0工作方式1

TH0=(65536-50000)/256;//高8位赋初值

TL0=(65536-50000)%256;//低8位赋初值

num=0;

//num=58;

}

void Incre_time() interrupt 0

{

time+=2;

}

void Decre_time() interrupt 2

{

time-=2;

}

void timer0() interrupt 1

{

num++;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

void main()

{

init();

P0=aa ; while (1)

{ P0=0xfd ;

//P0=aa;

if(num==(10+time))

{aa=_crol_(aa,1);num=0;}

}

}

任务八:PWM调光

假设单片机晶振频率为12MHz, 单片机P0,P2口作为输出口,外接一个2位LED数码管,外接LED,外接按键K1,外接按键K2,外接蜂鸣器。编写程序,每次按下按键K1时,LED数码管显示加1,LED变暗;每次按下按键K2时,LED数码管显示数据减1,LED变亮;当LED数码管显示为0A时,再次按下按键K1时,则蜂鸣器发出报警声。

任务九:简单电子频率计

假设单片机晶振频率为12MHz, 单片机P0,P2端口作为输出口,外接4位LED数码管。编写程序,测量由输入脉冲的频率。

#include<>

#define uint unsigned int

#define uchar unsigned char

uchar table[]={

0XC0,0XF9,0XA4,0XB0,

0X99,0X92,0X82,0XF8,

0X80,0X90};

uint num=0,num0=0;num1=0,num2=0,num3=0,count=0,new_num=0;

void delayms(uint ms)

{

uint i;

while(ms--)

for(i=0;i<120;i++);

}

void int_int()

{

EA=1;

EX1=1;

IT1=1;

TMOD=0X01;

ET0=1;

TL0=(65535-62500)%256;

TH0=(65535-62500)/256;

}

void display()

{

num3=new_num/1000;

num2=(new_num%1000)/100;

num1=(new_num%100)/10;