单片机脉冲计数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验报告
班级:自动0903
姓名:
一.软件实验
实验题目:脉冲计数(定时/计数器实验)
1,实验目的:熟悉单片机内部定时/计数器功能,掌握初始化编程方法。
2,实验内容:把外部中断0输入的脉冲进行计数,并送数码管显示。
仿真电路图如下所示:设定频率发生器为50Hz
程序如下:
#include
sbit P2_0=P2^0; //数码管选定位
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; unsigned int motorspeed;
unsigned char GE,SHI,BAI,QIAN;
unsigned int counter=0; //脉冲数
unsigned int calsp; //设定多长时间计算一次
void display(); //数码管显示
void delay(); //延迟函数
void calspeed();
void main()
{
EA=1; //开启总中断
EX0=1; //开启外部中断0
IT0=1; //设置成下降沿触发方式
TMOD=0x01; //设置定时器0为模式1,即16位计数模式
TH0=(65536-10000)/256; //计数时间为10ms
TL0=(65536-10000)%256;
ET0=1; //开启定时器0中断
TR0=1; //启动定时器0
P2=P2&0xf0;
while(1)
{
display();
calspeed();
}
}
void calspeed()
{
if(calsp>=100) //100*10ms=1s计算一次
{
motorspeed=counter;
counter=0; //清零脉冲数
calsp=0; //清零标志
}
}
void _TIMER0() interrupt 1
{
TH0=(65536-10000)/256; //重新装入初值,计数时间为10ms TL0=(65536-10000)%256;
calsp++;
}
void _INT0() interrupt 0
{
counter++;
}
void display() //数码管显示函数{
GE=motorspeed%10;
SHI=motorspeed/10%10;
BAI=motorspeed/100%10;
QIAN=motorspeed/1000%10;
P2_0=1;
P0=table[QIAN];
delay();
P2_0=0;
P2_1=1;
P0=table[BAI];
delay();
P2_1=0;
P2_2=1;
P0=table[SHI];
delay();
P2_2=0;
P2_3=1;
P0=table[GE];
delay();
P2_3=0;
}
void delay() //延迟函数
{
unsigned char i=10;
while(i--)
;
}
二.硬件实验
实验题目:用单片机控制二极管
1,实验目的:熟悉用单片机控制二极管及其编程方法2,实验内容:跑马灯显示二极管
仿真电路图如下所示:
程序如下:
#include
#include
void delay();//延时子函数
void main(void)
{
unsigned char temp;
temp=0xfe;
while(1)
{
P2=temp;
delay();
temp=_crol_(temp,1);
}
}
void delay()
{
unsigned int y;
y=10000;
while(y--)
;
}