求写一个51单片机C语言程序,不复杂的,在线求助!!!感谢您八辈祖宗!!内有详细说明

程序是用来小车路程显示的,STC单片机,12M晶振一个测速模块,输出低电平有效,把它接到单片机P3.0口,还有一个4位八段数码管,共阳编码,每位选通为低电平选通。4个位选... 程序是用来小车路程显示的,STC单片机,12M晶振

一个测速模块,输出低电平有效,把它接到单片机P3.0口,还有一个4位八段数码管,共阳编码,每位选通为低电平选通。4个位选分别接P3.2到P3.5,8个段选接P1.0到P1.7。显示码都是按顺序接的。0xC0, 0xF9, 0xA4 , 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90

测速模块正常是高电平,要求每输出一个低电平,单片机就乘以0.66在数码管上显示,不断累加,显示是XXX.X,即始终是一位小数,第二位小数不显示。是累加哦,进来一个信号,就加0.66

拜托各位大神,我不懂程序,有没讲清楚的地方尽管问,我第一时间补充说明,不要怀疑我的热情,只要你留了言,我都会半天内回复,就怕没人回答!!!拜托!!!
展开
 我来答
qep345
2013-04-10 · TA获得超过104个赞
知道答主
回答量:131
采纳率:0%
帮助的人:45万
展开全部
程序简单,吃完饭饭看有时间没

#include <reg52.h>

code unsigned char temp[] = {0xC0, 0xF9, 0xA4 , 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
unsigned int num;
unsigned char table[4];

void main()
{
TMOD = 0X01;

TH0 = 0XFC;

TL0 = 0X18;

EA = 1;
TR0 = 1;
ET0 = 1;

EX0 = 1;

while(1)

{
;

}

}

void INT0() interrupt 0
{
num += 66;

table[3] = num / 1000;

table[2] = num / 100 % 10;

table[1] = num / 10 % 10;

table[0] = num % 10;

}

void TIMER0() interrupt 1
{
static unsigned char i = 0,j = 0;

TH0 = 0XFC;
TL0 = 0X18;
if(i >= 10)
{
i = 0;

P3 |= 4 << j;

P0 = temp[table[j]];
if(j = 1)

P0 |= 0X7F;

if(j >= 3)

j = 0;

else

j += 1;

}
else

i += 1;

}

差不多就这样吧,你试试,我没验证过,不行再问
更多追问追答
追问
你的这个程序我暂时还没法试,也看不懂啊,你能否注释一下?虽然注释了我也看不懂,汗。。不过我还有几个小白问题想问:
1、这个程序里面单片机的I/O口是怎么分配的啊?我照着题干上面的接线可以吗?我刚才胡乱翻了一下书,好像P3.2和P3.3是INT0和INT1,这个是不是专用引脚啊?
2、我找了一些数码管显示的程序,好像都有延时函数什么的,怎么这个程序看不到啊?
追答
我用的是定时器做延时,动态扫描   我注释下吧  好像之前的那个不能注释 了,得重新搞个
#include
code unsigned char temp[] = {0xC0, 0xF9, 0xA4 , 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//共阳极数码管段码
unsigned int num;
unsigned char table[4];
void main()
{
TMOD = 0X01;//定时器0 16位定时器
TH0 = 0XFC; //定时器0 初值0xfc18
TL0 = 0X18;
EA = 1; //全局中断
TR0 = 1; //开定时器0
ET0 = 1; //允许定时器0中断
EX0 = 1; //允许外部中断0
while(1)
{
;
}
}
void INT0() interrupt 0 //外部中断处理函数
{
num += 66; //没获得一次低电平+0.66 此处扩大100倍
table[3] = num / 10000; //取num值的百位,因为扩大了100,所以是10000
table[2] = num / 1000 % 10;//十位
table[1] = num / 10 0% 10;//个位
table[0] = num / 10 % 10; //小数位
}
void TIMER0() interrupt 1
{
static unsigned char i = 0,j = 0;
TH0 = 0XFC;
TL0 = 0X18;
if(i >= 10) //10ms扫描数码管
{
i = 0;
P3 |= 4 = 3)
j = 0;
else
j += 1;
}
else
i += 1;
}
qicornan
2013-05-01 · TA获得超过2.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:48%
帮助的人:1628万
展开全部
这是非常简单,开关控制电路?如果它是低电压和低电流,晶体管开关直接用就行,不具有进行中继。我这里有一些你需要的信息,可以来找我随时在线,等待答复。如果你不在线,你可以给我留言,立即回复。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
251wrj
2013-04-11 · 超过18用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:43.4万
展开全部
如果精度要求太高 建议把你的3.0口换成中断口 用低电平触发方式 如果精度采集不高的话 就用定时器中断扫描的方式去判断 小数点的话 你可以先给它扩大倍数 显示的时候再缩小倍数 还有你的硬件电路 总要给出一个吧 不然人怎么给你弄呢
追问
硬件电路就是把模块连起来就好了,传感器是VCC、GND和电平输出三个脚,数码管也是模块的,直接把十二个引脚跟I/O口接上就能用,我想学单片机但老是入不了门,你能不能给我设计个程序实现上面说的功能啊?I/O口可以由你自己设定,如果不方便在这发的话可以发我邮箱,xyj12000t@163.com  刚才有个回答莫名消失了,真是气人
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式