过年了,我也来发年终奖,大家快来抢,哈哈!顺便把我的一点小小的成果也和大家分享。
可惜总共就只有100分,本来想把全部都给大家的。感觉在csdn上还是学到了不少东西,虽然我还很菜,可是潜力很大,呵呵。
我写的程序,大家别笑话我哈,程序的用途:测量脉冲宽度,即高电平持续的时间,用的是定时器t0,选取P3^2为输入i/o口,用数码管显示,能测量的脉冲宽度为999.9ms
借此机会积攒点人品,来年大爆发!我的股票天天涨停,哈哈。也祝csdn的同仁们发财,发财,发大财!yeah,over!发完了就睡觉
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
void led_display(void);
void delay(uint tc);
void init_at89c52(void);
void time_count(void);
sbit number0=P1^0;
sbit number1=P1^1;
sbit number2=P1^2;
sbit number3=P1^3;
unsigned long int count;
uint overflow_count=0;
uint time;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,};
void main(void)
{
init_at89c52();
while(1)
{ time_count();
led_display();
}
}
void init_at89c52()
{
TMOD=0x10; //定时器T0,允许使用,定时方式,模式1
TH0=0;TL0=0; //计数器初值为0
TR0=0;
ET0=1;EA=1;
}
void led_display(void)
{
//count=12300;
time=(count&0xfffff)/100;
number3=0;number2=1; number1=1; number0=1;
P0=table[time/1000];
delay(5);
number3=1;number2=0; number1=1; number0=1;
P0=table[(time-1000*(time/1000))/100];
delay(5);
number3=1;number2=1; number1=0; number0=1;
P0=table[(time-100*(time/100))/10]|0x80;;
delay(5);
number3=1;number2=1; number1=1; number0=0;
P0=table[time%10];
delay(5);
number3=1;number2=1; number1=1; number0=1;
}
void time_count()
{
while(P3_2)
{
TR0=1; //开计数器
}
TR0=0;
count=65536*overflow_count+TH0*256+TL0;
}
void t0_response(void)interrupt 1
{
++overflow_count;
}
void delay(uint tc) //延时程序
{
while( tc != 0 )
{
unsigned int i;
for(i=0; i<100; i++);
tc--;
}
}
[解决办法]
这种接分的活我最喜欢
呵呵。。。
[解决办法]
还有这么好的事情,我顶上!顶!顶!顶!!!!!!!!!!!嘻嘻
[解决办法]
ding
[解决办法]
领红包来了
呵呵
[解决办法]
领奖金罗
呵呵
[解决办法]
我也要
[解决办法]
谢谢,谢谢,不过建议用上OS,可好玩了
[解决办法]
恭喜发财
[解决办法]
顶哦
[解决办法]
来奔小康了,不知道楼主是做的什么项目,单片机控制的么
[解决办法]
jf
[解决办法]
谢谢楼主对本版的支持
OS估计就是实时操作系统UCOSII
[解决办法]
接分先。
用来学习定时器挺好。建议后续的深入学习,不要使用while()循环,除了main()最后的死循环。
如果想继续优化,那就如下:
既然有高电平,那必然有上下沿。
就用“外部中断”,初始化为“上升沿触发”。
检测到上升沿,就设“某个全局变量”为1,并设“外部中断”为下降沿触发。
检测到下降沿,就设“该全局变量”为0,并设“外部中断”为上升沿触发。
在定时器中断里,定时检测“该全局变量”,如果为1,就开始计时累加,如果为0,就停止计时。
定时器的检测时间设置(比如1uS)就决定了测量的最终精度。
[解决办法]
哈哈 uCOS-II 太大 我自己写了一个小 OS,学习一下。项目中用uCOS-II不是太多
[解决办法]
学习!!
[解决办法]
准备发财
[解决办法]
晶振是有精度误差的,比如20ppm(ppm: 百万分之),一般的足够了。
os=operation system,操作系统,理解正确。
51的RAM太小,一般不建议用OS,即使是uCOSII。
如果要用OS的,那就是对实时要求不高,有人机操作界面(UI)需求的。
[解决办法]
普通的晶振频率准确度约为 100ppm.
[解决办法]
初来乍道
接分!!!!!!!!!!!!!!!!!!!!!!!
[解决办法]
呵呵
[解决办法]
接分
[解决办法]
呵呵,看看接分
[解决办法]
接分走人
[解决办法]
接分!!!!!!!!!!!
[解决办法]
接,接,接,接,接,接,接,接
[解决办法]
顶啊
[解决办法]
谢谢,接分!
希望好的程序大家多分享呀!
[解决办法]
股就两个字,涨涨
[解决办法]
顶顶顶
[解决办法]
希望你的股票天天涨,同时我的股票也天天涨停!
[解决办法]
jf
[解决办法]
顶一个
[解决办法]
不错.........
[解决办法]
这么好。不错啊。向你学习。
[解决办法]
接分
[解决办法]
40楼
------------------------------------------------
单片机的触发方式只有下降沿触发和低电平触发两种方式,具体怎么做,还望明示啊!
如何检测上升沿和下降沿呢?你给的方案好像有点问题啊
51单片机吧?的确没有上升沿触发,那下降沿触发后,在定时器中断里累加计时,同时判断外部中断引脚的电平。如果为1(高),就停止计时。
[解决办法]
先顶一下,再慢慢看程序!!
[解决办法]
来学习定时器
[解决办法]
先讨个利市……
[解决办法]
按键的抖动还处理了?最好加个RC滤波,然后看效果。
[解决办法]
接分,学习!
[解决办法]
good
[解决办法]
接分了!!!
[解决办法]
接分!!!
学习
[解决办法]
jf
[解决办法]
jf
[解决办法]
up
[解决办法]
up
[解决办法]
jf
[解决办法]
47楼
人手按下按键会有抖动,一般的处理:获取该信号后,延迟10ms,然后再次判断该信号,如果确认(高或者低),则认为是按键按下了。
至于延迟是delay()这样的死等待,还是使用中断触发定时器等待,就看你希望的效率了。
硬件的RC就简单,比如10mS延迟的RC电路,确保稳定8-10mS,才会正式触发,也就是确保信号稳定。
[解决办法]
给点分吧
[解决办法]
一说给分都来了啊 呵呵 我可是来看你的成果的 哈哈
[解决办法]
现在CSDN的抢分可没有以前老版的好玩了
很是没有劲...
[解决办法]
void init_at89c52()
{
TMOD=0x10; //定时器T0,允许使用,定时方式,模式1
TH0=0;TL0=0; //计数器初值为0
TR0=0;
ET0=1;EA=1;
}
按LZ的意思 TMOD=0x01吧
[解决办法]
沙发,顶咯,恭喜发财哟~~~~
[解决办法]
程序下次看
[解决办法]
谢谢,接分!
希望好的程序大家多分享呀!
[解决办法]
嚎嚎,都看看中招拉~~~~~~~~他都没给分的
[解决办法]
继续接!!!!!!
[解决办法]
接分,学习!
[解决办法]
jf
[解决办法]
jf
[解决办法]
这么多人都来了,我也来了
[解决办法]
一定要接住
[解决办法]
事隔多年,没想到lz又继续续楼了,支持一下。
刚毕业?做芯片设计出身的?看上面,你对单片机是刚入门,不过看你用CPLD VHDL,应该不是新入行的。之前怎么发展的?
[解决办法]
国企压力不大,同样也逼不出你的潜能。如果想靠自学,可以,不过效率不会很高。
不管学什么,最好的方法就是在项目中学习,边用变学,边学边用,效率特别高,印象也会特别深。
年龄允许的话,倒不如跳出去,找个压力大的公司做个2、3年,保证效果很好。然后再找类似国企这样适合养老的,靠经验继续。
[解决办法]
还是有人支持滴...
[解决办法]
支持,俺也学了几天VHDL,再学习一下
[解决办法]
输入0000和1111时输出0?
这是个啥电路?
替计数器输出进位信号的?
[解决办法]
印象中ARCHITECTURE的语句是并行的啊……
主程序里调用PORT MAP的都在ARCHITECTURE里,怎么实现延时的?
PROCESS里也没看到延时诶……
讲讲明白,嘿嘿,学习一下
[解决办法]
难道VHDL写的是和楼顶那个单片机程序配合使用的?
[解决办法]
这就是成熟的代价
[解决办法]
^_^,,现实
[解决办法]
o(∩_∩)o...
俺也来接分~~~
[解决办法]