题目具体要求:
用单片机定时计数器产生高电平为50ms,低电平为100ms的方波信号。
实现方式:
使用定时计数器0产生中断,单片机的晶振频率为12MHZ,方波信号在P2.0口输出。
C语言程序代码:
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
***it LSA=P2^2;
***it LSB=P2^3;
***it LSC=P2^4;//设置38译码器的输入端
u16 flag=9999,num=0;//设置数码管初值以及中断次数变量
void DelayMS(u8 i);
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void Timer0Init(void) //中断初始化
{
TMOD =0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值 1ms
TF0 = 0; //清除TF0标志
ET0 = 1; //定时/计数器T0中断允许开启
EA = 1; //开启总中断
TR0 = 1; //定时器0开始计时
}
void DIGdisplay()
{
u8 i;
for (i=0;i<4;i++){
switch(i){
case(0): LSA = 0 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag%10] ;DelayMS(1); break; //第一位数码管
case(1): LSA = 1 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag/10%10] ;DelayMS(1);break; //第二位数码管
case(2): LSA = 0 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/100%10] ; DelayMS(1);break; //第三位数码管
case(3): LSA = 1 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/1000] ; DelayMS(1);break; // 第四位数码管 这里延时是为了提高数码管亮度
}
P0 =0X00;//消隐
}
}
void time() interrupt 1//中断函数
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值 1ms
num++;
if(num==20) /20ms则跳数字
{
num=0;
flag--;
}
}
void main()
{
Timer0Init();
P0 = 0x00;
while(1)
{
DIGdisplay();
}
}
void DelayMS(u8 i)
{
//大约 1ms
u8 j=100;
while(i--)
{
while(j--);
}
}
仿真实验结果:
题目具体要求:
用单片机定时计数器产生高电平为50ms,低电平为100ms的方波信号。
实现方式:
使用定时计数器0产生中断,单片机的晶振频率为12MHZ,方波信号在P2.0口输出。
C语言程序代码:
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
***it LSA=P2^2;
***it LSB=P2^3;
***it LSC=P2^4;//设置38译码器的输入端
u16 flag=9999,num=0;//设置数码管初值以及中断次数变量
void DelayMS(u8 i);
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void Timer0Init(void) //中断初始化
{
TMOD =0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值 1ms
TF0 = 0; //清除TF0标志
ET0 = 1; //定时/计数器T0中断允许开启
EA = 1; //开启总中断
TR0 = 1; //定时器0开始计时
}
void DIGdisplay()
{
u8 i;
for (i=0;i<4;i++){
switch(i){
case(0): LSA = 0 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag%10] ;DelayMS(1); break; //第一位数码管
case(1): LSA = 1 ;LSB = 0 ; LSC = 0 ;P0 = smgduan[flag/10%10] ;DelayMS(1);break; //第二位数码管
case(2): LSA = 0 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/100%10] ; DelayMS(1);break; //第三位数码管
case(3): LSA = 1 ;LSB = 1 ; LSC = 0 ;P0 = smgduan[flag/1000] ; DelayMS(1);break; // 第四位数码管 这里延时是为了提高数码管亮度
}
P0 =0X00;//消隐
}
}
void time() interrupt 1//中断函数
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值 1ms
num++;
if(num==20) /20ms则跳数字
{
num=0;
flag--;
}
}
void main()
{
Timer0Init();
P0 = 0x00;
while(1)
{
DIGdisplay();
}
}
void DelayMS(u8 i)
{
//大约 1ms
u8 j=100;
while(i--)
{
while(j--);
}
}
仿真实验结果:
举报