你的定时器中断多长时间一次?脉冲频率是多少?你把判定程序放在定时器中断里面,那么每次定时到了才判定的 。如果脉冲频率太快会丢失的 。建议用外部中断 。中断一定要用边沿触发,比较准确的 。/*-----------------------------外部中断0处理程序--------------------------------*/voidINT0_Pro(void)interrupt0using1{count++;/*count定义为无符号整形变量:unsigned int,这里可以加上延时判断,避免脉冲干扰(也可以不考虑这个问题) 。这样,一个下降沿出现在外部0中断引脚的时候就计数一次*/}定时器里面计数3秒后,直接取用count的值就行了,用完了清零,进行下一轮计数.记得先开启中断,还有IT0=1;(外部0设置为边沿触发)还有,检查一下显示程序,是不是计算译码弄错了 。单片机的各种编程程序 比如流水灯
//实例:使用P0口流水点亮8位LED#include//包含单片机寄存器的头文件/*函数功能:主函数**/void main(void){while(1){P0=0xfe;//之一个灯亮delay();//调用延时函数P0=0xfd;//第二个灯亮delay();//调用延时函数P0=0xfb;//第三个灯亮delay();//调用延时函数P0=0xf7;//第四个灯亮delay();//调用延时函数P0=0xef;//第五个灯亮delay();//调用延时函数P0=0xdf;//第六个灯亮delay();//调用延时函数P0=0xbf;//第七个灯亮delay();//调用延时函数P0=0x7f;//第八个灯亮delay();//调用延时函数}}求个51单片机程序
#includeunsigned char time1s;void t0isr() interrupt 1 it KEY=P1^0; it PULSE=P1^1;{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time1s++;if(time1s>=20){time1s=0;PULSE=!PULSE;}}void delay(unsigned char x){unsigned char i,j;for(i=0;i【单片机编程实例(51单片机编程实例)】单片机程序一般是不让它运行结束的,所以一般让这个程序死在一个循环里面,一般用while(1)或者for(;;),然后再在里面编程,这样单片机不会停止工作 。
之一个程序,应该是一直低电平,a=4999的时候死在while(a==0)那个循环里了,而P1_1=0,所以不亮,可以改为:
#include it P1_1=P1^0;int a ;void main(){
while(1)
{
a=5000;P1_1=0 ;while(a--);
P1_1=1 ;
a=5000;while(a--);
}
这样会保持一直闪烁 。
第二个程序,从程序上看,应该只闪烁一次,外层循环再加一层死循环,就可以实现重复闪烁 。
求单片机C语言实例
#include#define timeset 65536-15535//定时器计数值 约50ms(6M晶振时)约100ms(12M晶振时)#define timeH (timeset & 0xff00)>>8#define timeL timeset & 0xffchar Time0_flag,Time1_flag;//定时器中断产生标记/*/函数名:定时器0中断函数调用:Time0_Int();参数:无返回值:无结果:启动定时器0计时中断备注:定时时间由计数值及系统晶振决定的//void Time0_Int(void) interrupt 1//定时器0 定时时间由timeset决定{TR0=0;//关定时器0TMOD=TMOD|0x1;//定时器0工作方式1TL0=timeL;//低位值TH0=timeH;//高位值IE=IE|0x02;//允许定时器0中断TR0=1;//计时开始/*以下是用户中断服务程序*///Time0_interrupter();//Time0_flag+=1;标记定时器0中断次数}/*/函数名:定时器1中断函数调用:Time1_Int();参数:无返回值:无结果:启动定时器1计时中断备注:定时时间由计数值及系统晶振决定的//void Time1_Int(void) interrupt 3//定时器1 定时时间由timeset决定{TR1=0;//关定时器0TMOD=TMOD|0x10;//定时器1工作方式1TL1=timeL;//低位值TH1=timeH;//高位值IE=IE|0x08;//允许定时器0中断TR1=1;//计时开始/*以下是用户中断服务程序*///Time1_interrupter();//Time1_flag+=1;标记定时器1中断次数}/*/函数名:主函数调用:main();参数:无返回值:无结果:备注:中断后处理//void main(){while(1){if(Time1_flag){Led(1);Time1_flag=0;//}if(Time0_flag){Led(0);Time0_flag=0;//}}//while()}