单片机程序源代码
- 格式: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;