计算外中断0输入脉冲与外中断1输入脉冲的间隔时间(求C程序)
就是外中断0先输入一个脉冲波,然后外中断1下一个脉冲波到了,然后求他们俩的时间间隔,求大侠帮帮忙
计算出来的T怎么转换成个位,十位,百位。
大侠给我个程序把,我自己也不会写,但是我能看懂
追答这个应该不难写吧,我自己上班也没时间。
你可以自己了解一下,装个protues来仿真一下。
我先试试
追答我在百度知道看到了好几个这样的问题,这个难道是课设?
你自己先写一下,有问题的话贴出来我再帮你看看。
嗯嗯,好的,我现在就写
追答不需要显示,那部分程序我会编
追答unsigned int tx;
unsigned char tx_end;
//-----------------------------
void init()
{
TMOD = 0x01; //定时方式1
TH0 = 0;
TL0 = 0;
IT0 = 1; //下降沿触发中断
IT1 = 1;
EX0 = 1;
EX1 = 1;
EA = 1;
tx_end = 0;
}
//-----------------------------
void main()
{
init();
while(1) {
if(tx_end) {
tx_end = 0;
//显示 tx
}
}
}
//-----------------------------
void X0_INT() interrupt 0
{
TR0 = 1; //启动, 从0开始定时
}
//-----------------------------
void X1_INT() interrupt 2
{
TR0 = 0; //停止
tx = TH0 * 256 + TL0;
TH0 = 0;
TL0 = 0;
tx_end = 1; //设定标志
}
//-----------------------------
本程序,当fosc=12MHz时,检测的间隔时间,应在 0~65535us 之内。
我还想知道一点,怎么 tx_end = 1; //设定标志
if(tx_end) {
tx_end = 0;
这是什么意思?为什么上面是下面是 tx_end = 0?
当,外中断1输入脉冲后,就停止了 T0 的计时,并且,把时间存到了 tx。
之后,应该如何处理 tx,就不是中断程序所应该干的活了。
为此,应该通知主函数,继续接手,来处理 tx。
tx_end = 1; //设定标志 --这句,就是通知主函数的。
主函数:
if(tx_end) {
tx_end = 0;
就是进行数据处理的。
处理之后,应清除这个通知。即清零。
哥,你看看我上面的计算看看算的有没有错误,这个程序是动态显示吗
追答hudu = 0.018 * tx;
glys = cos(hudu);
temp = glys * 1000; //43.2
//以上算法,不知道对不对。
//可令 temp 为某个常数,即可知道,显示是否成功。
//即:
temp = 168;
gb = temp / 100;
gs = temp % 100 / 10;
gg = temp % 100 % 10;
lcd_pos(0x05); //显示位置,设定一次即可
lcd_wdat(digit[gb]); //百位显示 1
lcd_wdat(digit[gs]); //十位显示 6
lcd_wdat(digit[gg]); //个位显示 8
//试试看,能否显示 168。
哥,我不会把得到的2进制数转化为十进制,导致没法计算
追答temp = 168;
gb = temp / 100;
gs = temp % 100 / 10;
gg = temp % 100 % 10;
lcd_pos(0x05); //显示位置,设定一次即可
lcd_wdat(digit[gb]); //百位显示 1
lcd_wdat(digit[gs]); //十位显示 6
lcd_wdat(digit[gg]); //个位显示 8
//先不要算那些东西。
//你先试试看,能否显示 168。
这个可以显示168
追答那那么,显示就可以了。
问题是,检测到时间差,你想要显示什么?
应该有个公式、算法、思路,然后,才能编写出来程序。
我就是想显示那个时间差,可是得出的结果是二进制,难道单片机能显示二进制?
追答二进制数,通过下面这三句,不就变成十进制数了吗?
gb = temp / 100;
gs = temp % 100 / 10;
gg = temp % 100 % 10;
显示十进制:
lcd_wdat(digit[gb]); //百位显示 0~9
lcd_wdat(digit[gs]); //十位显示 0~9
lcd_wdat(digit[gg]); //个位显示 0~9