作者vincentno1 (Vincent老头)
看板C_and_CPP
标题[问题] 用c写8051晶片
时间Sat Jun 13 13:04:46 2009
我试着想用8051写一个脚踏车测速器
大概的设计是这样:
使用at89c51晶片
用keil uVision3写c语言
脚踏车车轮每转一圈会经由Schmitt trigger送一个负源触发到8051的pin12(外源中断)
然後利用8051计算其周期而算出速率
再由8051的P2输出二位数到两个7447在到7段LED数字显示器
现在Schmitt trigger与7447的部份都没有问题
问题是我用keil uVision3写的程式烧进去都不会WORK
(就连写最简单的跑马灯也不WORK)
是不是我在写C程式的时候少了些什麽?
请高手帮我看看
-----------------------------------------------------------------
#include <regx51.h>
int counter,i; //counter为计时器; i为轮胎圈数;
int a,b,c,d,e; //A作为总数值(速率) B输出暂存 C十位数暂存 D个位数暂存 E延迟用变
数
float period,r,p; //period周期; r为轮胎半径;
main()
{
//计时器
TMOD=0x00; //mode 0
TH0=(8192-1000)/12; //1000us=1ms
TL0=(8192-1000)%12;
TR0=1; //timer start
//中断器
IE=0x83; // EX0=1; ET0=1; EA=1;
TCON=0x01; // 使外源中断1为负源处发;
//速率计算and二位数显示
a=0x00; //将速率设0
P2=a; //先使两个七段都显示0
for(e=0;e<3200;e++); //延迟
while(1)
{
r=0.0005; //设r为0.0005 km
p=period/1000/3600; //把周期单位改成hr
a=2*3.14*r/p; //计算出速率(km/hr)
if(a>99) a=99; //防暴表
c=a/10; //将总数除以10取商数得到十位
d=a%10; //将总数除以10取余数得到个位
c=c<<4; //将十位数(二进制)左移4位数
d=d&0x0f; //将各位数的上面四位数清为零
b=c+d; //将十位及个位数合并成8BIT BCD
P2=b; //将有个位十位数的BCD码由P2输出
for(e=0;e<15000;e++); //延迟
}
}
void timer0_int(void)interrupt 1 //计时器中断0的副程式
{
TH0=(8192-1000)/12;
TL0=(8192-1000)%12;
counter++;
}
void int0(void)interrupt 0 //外源中断0副程式
{
i++;
if(i==1) counter=0; //开始计时
if(i==6) //取五圈的平均周期
{
period=counter/5; //周期单位为ms
i=0;
}
}
-----------------------------------------------------------------
谢谢...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.214.71
1F:→ vincentno1:不太确定可否po这里 不行的话我会自d 06/13 13:07