单片机实验3源程序
(作者注:程序仅供参考,虽然本人在实验时这些源程序是可以跑的。用的板子是51单片机,软件是MDK4)
1.利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,晶振频率为11.0592MHz。
2.利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。晶振频率为11.0592MHz。
3.同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波给蜂鸣器?晶振频率为11.0592MHz。
1、
#include "reg51.h"
unsigned char Count;
sbit P_1 =P1^0 ;
void Time0_Init() //定时器0 初始化函数
{
TMOD = 0x01; //工作模式选择
IE = 0x82; //中断设置
TH0 = (65536-9216)/256; //装初值
TL0 = (65536-9216)%256; //11.0592MZ 晶振,10ms
}
void Time0_Int() interrupt 1 //定时器0 中断子函数
{
TH0 = 0xD8;
TL0 = 0xEF;
Count++; //长度加1
if(Count==100)
{
Count=0;
P_1=~P_1;
}
}
void main()
{
Time0_Init(); //定时器T0中断初始化
TR0=1;
while(1)
{
}
}
2、
#include "reg51.h"
unsigned char Count;
unsigned char i;
sbit P_1 =P1^0 ;
sbit P_2=P1^1;
sbit P_3=P1^2;
sbit P_4=P1^3;
sbit P_5=P1^4;
sbit P_6=P1^5;
sbit P_7=P1^6;
sbit P_8=P1^7;
sbit P_9 =P2^3 ;
void Time0_Init() //定时器0 初始化函数
{
TMOD = 0x01; //工作模式选择
IE = 0x82; //中断设置
TH0 = (65536-9216)/256; //装初值
TL0 = (65536-9216)%256; //11.0592MZ 晶振,10ms
}
void Time0_Int() interrupt 1 //定时器0 中断子函数
{
TH0 = 0xD8;
TL0 = 0xEF;
Count++; //长度加1
if(Count==10)
{
Count=0;
if(i==0)
{P_1=0;P_8=1;}
else if(i==1)
{P_2=0;P_1=1;}
else if(i==2)
{P_3=0;P_2=1;}
else if(i==3)
{P_4=0;P_3=1;}
else if(i==4)
{P_5=0;P_4=1;}
else if(i==5)
{P_6=0;P_5=1;}
else if(i==6)
{P_7=0;P_6=1;}
else if(i==7)
{P_8=0;P_7=1;}
i=i+1;
if(i==8)
{i=0;}
}
}
void main()
{
Time0_Init(); //定时器T0中断初始化
TR0=1;
while(1)
{
}
}
3、
#include
sbit beep=P2^3; //蜂鸣器位数定义
unsigned char num=4000;
//
unsigned char counter0=0;//T0控制频率
unsigned char counter1=0; //T1控制周期
void main(void)
{ //
TMOD=0x11; //T0、T1用16位计数方式
TH0=(65536-115)/256; //T0计数周期125us
TL0=(65536-115)%256; //晶振频率11.0592MHz
TH1=(65536-46080)/256; //T1计数周期50ms
TL1=(65536-46080)%256; //晶振频率11.0592MHz
ET0=1; //允许T0中断
ET1=1; //允许T1中断
EA=1; //开总中断
TR0=1; //T0开始计数
TR1=1; //T1开始计数
beep=1;
while(1);
}
void time0() interrupt 1
{
TH0=(65536-115)/256; //T0计数周期125us
TL0=(65536-115)%256; //晶振频率11.0592MHz
counter0++;
if(counter0==num)
{
counter0=0;
beep=~beep;
}
}
void time1() interrupt 3
{
TH1=(65536-46080)/256; //T1计数周期50ms
TL1=(65536-46080)%256; //晶振频率11.0592MHz
counter1++;
if(counter1==40)
{
counter1=0;
switch(num)
{
case 4000:num=400 ;break; //如果上一次是1Hz,将下一次设置为10Hz
case 400 :num=80 ;break; //如果上一次是10Hz,将下一次设置为50Hz
case 80 :num=40 ;break; //如果上一次是50Hz,将下一次设置为100Hz
case 40 :num=20 ;break; //如果上一次是100Hz,将下一次设置为200Hz
case 20 :num=10 ;break; //如果上一次是200Hz,将下一次设置为400Hz
case 10 :num=5 ;break; //如果上一次是400Hz,将下一次设置为8000Hz
case 5 :num=4 ;break; //如果上一次是800Hz,将下一次设置为1000Hz
case 4 :num=4000;break; //如果上一次是1000Hz,将下一次设置为1Hz
}
}
}