在protues仿真中,我的电路调节protues中光敏电阻阻没有用,求大神看看哪里错了

查看: 3389|回复: 4
protues仿真数码管的问题
顺便请大家帮我看看代码
本代码的目的是通过按键修改输出方波的占空比&&方波利用中断产生& & 同时将一个数据显示到数码管上面
实物下载的时候&&数码管能够正常显示&&为什么仿真的时候就是看不到呢?&&修改过很多参数&&硬是没弄出来&&
&&修改显示程序中的延时时长的时候&&还会影响到按键的扫描&&
& && & 而且中断计算的时候&&算好了周期是200Hz的&&结果只有122Hz&&不知道问题出现在哪里&&请大家帮忙看看
(28.3 KB, 下载次数: 168)
10:31 上传
点击文件名下载附件
Y@`M4U$CWJG1`H~{U)J8D.jpg (83.58 KB, 下载次数: 13)
10:29 上传
#include &reg51.h&
#include &intrins.h&
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};& & & & & & & & & & & & & & & & & & & & //共阳数码管0-9数字代码;
uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7};
sbit pwmout=P1^0; & & & &&&& & & & // 定义PWM输出挂在P1.0端口
sbit K0=P1^1;& && && & & & & & & & // 定义按键挂在P1.1端口
sbit K1=P1^2;& & & && & & & & & & & & & // 定义按键挂在P1.2端口
sbit K2=P1^3;& & & && & & & & & & & & & // 定义按键挂在P1.3端口
sbit duan=P2^0;& & & & & & & & & & & & //利用74HC573显示数码管
sbit wei=P2^1;
/******************函数声明******************/
void delayms(uint xms);& & & & & & & & & & & && & & & & &
void display(uchar num);
void key(void);
/**********************************************
函数功能:软件延时
入口参数:
出口参数:脉宽(机多少个时间单位)
**********************************************/
/**********延时函数--xms决定延时长度**********/&&
void delayms(uint xms)
{
& & & & uint i,j;
& & & & for(i=i&0;i--)
& & & & & & & & for(j=110;j&0;j--);
}
/**********************************************
函数功能:按键检测及处理
入口参数:
出口参数: 脉宽(多少个时间单位)
***********************************************/
void key()
{
& & & & if(K0==0)& && && && &&&& & & & & & & & & & & & //加数 按键有按下?
& & {
& & & & & & & & delayms(5);& & & & & & & & & & & & & & & & & & & & & & & & //软件法延时消抖动
& & & & & & & & if (K0==0)& &&&& & & & & & & & & & & & & & & & & & & & //按键确实按下了吗?
& & & & & & & & {
& & & & & & & & & & & & numkey=numkey+1;&&& & & & & & & & & & & & //每次按一下,按键值+1,相当于增加1/255
& & & & & & & & & & & & if(numkey==256)
& & & & & & & & & & & & & & & & numkey=0;
& & & & & & & & & & & & while(!K0);& & & & & & & & & & & & & & & & & & & & //松手检测
& & & & & & & & }
& & }
& & & & if(K1==0)& & & & & & & & & & & && & & & & & & & & & & & & & //减数
& & & & {
& & & & & & & & delayms(5);
& & & & & & & & if(K1==0)
& & & & & & & & {
& & & & & & & & & & & & if(numkey==0)& & & & & & & & //判断是否为“0”,避免变为255电压跳变
& & & & & & & & & & & & & & & & numkey=0;
& & & & & & & & & & & & else numkey=numkey-1;
& & & & & & & & & & & & while(!K1);
& & & & & & & & }
& & & & }
& & & & if(K2==0)& & & & & & & & & & & && & & & & & & & & & & & & & //清零
& & & & {
& & & & & & & & delayms(5);
& & & & & & & & if(K2==0)
& & & & & & & & {
& & & & & & & & & & & & numkey=0;
& & & & & & & & & & & & while(!K2);
& & & & & & & & }
& & & & }
}
/***************数码管显示函数*****************/
void display(uchar num)
{
& & & & P2=table[num/100];
& & & & P0=tablewe[1];& &
& & & & delayms(2);
& & & & P0=0
& & & & P2=0
& & & & delayms(2);& & & & & & & & & & & & & & & &&&
& & & & P2=table[(num%100)/10];& & & & & & & & //段信号
& & & & P0=tablewe[2];& && & & & & & & & & & & & //位信号
& & & & delayms(2);
& & & & P0=0
& & & & P2=0
& & & & delayms(2);& & & & & & & & & & & & & & & &&&
& & & & P2=table[num%10];
& & & & P0=tablewe[3];& &
& & & & delayms(20);
& & & & P0=0
& & & & P2=0
& & & & delayms(2);& & & &
/*& & & & wei=1;
& & & & P0=tablewe[1];
& & & & wei=0;
& & & & duan=1;
& & & & P0=table[num/100];
& & & & duan=0;& & & & & & & & & & & & & & & &&&*/
& & & &
/*****************定时器设置*******************/
void InitTimer0()
{
& & TMOD |=0x01;
//& & & & TH0 = 0
//& & & & TL0 = 0xa3;
//& & & & TH0 = 0
//& & & & TL0 = 0xf6;//0.01ms& & & &&&12MHz晶振
& & & & TH0=(6;& & & && & //20us
& & & & TL0=(6;&&
& & EA = 1;
& & ET0= 1;
& & TR0= 1;
}
/*****************PWM输出函数*******************/
/*void pwm()
{
//& & & &
//& & & & a=key();
& & & & if(N1&25)pwmout=1;
& & & & else pwmout=0;
}& & & & & & & & & & & & & & & & & & & & & & & & */
void Timer0Interrupt(void) interrupt 1
{
& & & & static unsigned char N1=0;
//& & & & TH0 = 0
//& & & & TL0 = 0xf6;//0.01ms& & & &&&12MHz晶振
& & & & TH0=(6;& & & && & //20us
& & & & TL0=(6;&&
& & & & N1++;
& & & & if(N1==256)N1=0;& & & &&&//周期T=6ms& & & & 50Hz
& & & & if(N1&=numkey)pwmout=1;
& & & & else pwmout=0;
}
/*******************主函数*********************/
void main(void)
{
//& & & && & & & & & & & //临时变量
& & & & InitTimer0();
& & & & while(1)
& & {& & & &
& & & & & & & & key();
& & & & & & & & display(numkey);& & & && &
//& & & & & & & & temp=key();& & & & & & & & //读按键,获得处理值(脉宽)
//& & & & & & & & pwmout=1;
//& & & & & & & & delay(temp); & & & & //temp(返回值)传给形参,产生temp个时间单位的高电平
//& & & & & & & & pwmout=0;
//& & & & & & & & delay(255-temp);& && && && && & //产生255-temp个时间单位的低电平
& & & & & & & &
//& & & & & & & & pwm();
& & & & }
}复制代码
1.在实体电路正常的话,那么问题在仿真电路上,在软件里驱动LED不用那么复杂的驱动电路,可以直接接在单片机IO口
2.定时器中断周期设定20us过短,中断代码稍长一点就会出问题
bg8ux 发表于
2.定时器中断周期设定20us过短,中断代码稍长一点就会出问题
我做的是一个简单的数控电源&&给317一个参考电压&&输出2-20v的电压&&那我就要通过PWM控制得到0.75-18.75的参考电压&&单片机输出最高电压是5v&&需要通过运放将电压放大&&理论上PWM波可以是0%-100%占空比&&也就是需要放大18.75/5倍& &电压步进选择为0.1v&&PWM输出电压增量5/187.5v&&占空比增量1/187.5
为了简化数据&&把187.5改为188
得到输出最高电压为20.05(考虑误差根本可以忽略不计)&&现在N1量的范围确定了& &单位定时时长为多少合适呢?&&一般有人说为100-200Hz较合适,但是在程序运行中&&发现显示程序调用的时候&&其消隐延时对按键的判断有一定影响(按键时间需要按久一点才能判断)&&不知道是中断问题&&还是其它什么原因&&至今没弄明白……
疯糖蔚男的天 发表于
我做的是一个简单的数控电源&&给317一个参考电压&&输出2-20v的电压&&那我就要通过PWM控制得到0.75-18.75的 ...
不知道我的周期算法是不是错了& &我是按照T=1/f& &比如频率为100Hz&&周期为10ms&&分为188个小段&&每一段时间为53us&&所以给定时器一个定时长53us&&
可是实际得到的频率总是比计算值小&&比如计算值100Hz&&却只得到82Hz的频率& &不知道错在哪里
微信:caoyin513 QQ: E-mail:
Powered by

我要回帖

更多关于 光敏电阻电路 的文章

 

随机推荐