求写一个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
拜托各位大神,我不懂程序,有没讲清楚的地方尽管问,我第一时间补充说明,不要怀疑我的热情,只要你留了言,我都会半天内回复,就怕没人回答!!!拜托!!! 展开
一个测速模块,输出低电平有效,把它接到单片机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
拜托各位大神,我不懂程序,有没讲清楚的地方尽管问,我第一时间补充说明,不要怀疑我的热情,只要你留了言,我都会半天内回复,就怕没人回答!!!拜托!!! 展开
3个回答
展开全部
程序简单,吃完饭饭看有时间没
#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;
}
差不多就这样吧,你试试,我没验证过,不行再问
#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;
}
展开全部
这是非常简单,开关控制电路?如果它是低电压和低电流,晶体管开关直接用就行,不具有进行中继。我这里有一些你需要的信息,可以来找我随时在线,等待答复。如果你不在线,你可以给我留言,立即回复。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果精度要求太高 建议把你的3.0口换成中断口 用低电平触发方式 如果精度采集不高的话 就用定时器中断扫描的方式去判断 小数点的话 你可以先给它扩大倍数 显示的时候再缩小倍数 还有你的硬件电路 总要给出一个吧 不然人怎么给你弄呢
追问
硬件电路就是把模块连起来就好了,传感器是VCC、GND和电平输出三个脚,数码管也是模块的,直接把十二个引脚跟I/O口接上就能用,我想学单片机但老是入不了门,你能不能给我设计个程序实现上面说的功能啊?I/O口可以由你自己设定,如果不方便在这发的话可以发我邮箱,xyj12000t@163.com 刚才有个回答莫名消失了,真是气人
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询