2585|10

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

PWM产生不出来 [复制链接]

先上代码在说void Timer_0(void) interrupt 1//中断函数{
        TH0=(65536-50)/256;//(65536-n)为定时器初值
        TL0=(65536-50)%256;
        num++;
        if(num>10)num=1;
        else if(num<=8)output=0;//使占空比为7:3
        else output=1;
}
void main(void)
{
        cmg88();
        lcd_init();
        lcd_clear();
        Init();
        while(1)
        {
                xianshi();
//                pwm();
//                dianjikongzhi();       
        }
}

我的问题是在语法上,这个没错误了,可是就是没有输出高低电平


此帖出自51单片机论坛

最新回复

那是一个判忙,要比delay有效率,51判忙前要先置高电平,不同的主频时序上不太一样. #include "LCDDriver.h" /*//以下参数在19660800M晶振频率时测试,数值为手册标值 #define DELAY         {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} #define TAS                DELAY;//{};                                                        //140ns #define TDSW        DELAY;DELAY;DELAY;DELAY;DELAY;DELAY;//195ns #define TWEN        DELAY;DELAY;                                                //450ns                        */ //晶振12M #define DELAY         {_nop_();_nop_();_nop_();} #define TAS                DELAY;//{}; #define TDSW        DELAY;DELAY;DELAY;DELAY;DELAY;DELAY; #define TWEN        DELAY;DELAY;                                                 void LCD1602_Write_Command(uint8 cmd) {         lcd_rw=1; TAS;         do {                 lcd_en=0;                 lcd_en=1; TWEN;         }while (LCD_BUSYBIT); //end check busy         DATA_PORT = cmd; TDSW;         lcd_rw=0; TAS;         lcd_en=0;         DATA_PORT = 0xff; } void LCD1602_Write_Data(uint8 dat) {         lcd_rw=1; TAS;         do {                 lcd_en=0;                 lcd_en=1; TWEN;         } while (LCD_BUSYBIT);//end check busy         DATA_PORT = dat; TDSW;         lcd_rs=1;         lcd_rw=0; TAS;         lcd_en=0;         DATA_PORT = 0xff;         lcd_rs=0; } //LCD1602的初始化函数 void LCD1602_Init(uint8 mode) {         uint16 i=0;         lcd_rs=0;         while (--i);        //初始化等待         LCD1602_Write_Command(0x38);/*设置8位格式,2行,5*7*/         LCD1602_Write_Command(0x01);/*清除显示*/         LCD1602_Write_Command(0x06);/*设定输入方式,增量不移位*/         LCD1602_Write_Command(mode);/*0x0c整体显示,关光标,不闪烁*/ }   详情 回复 发表于 2014-3-9 18:11
点赞 关注
 

回复
举报

4005

帖子

0

TA的资源

版主

推荐
 
那是一个判忙,要比delay有效率,51判忙前要先置高电平,不同的主频时序上不太一样.

#include "LCDDriver.h"


/*//以下参数在19660800M晶振频率时测试,数值为手册标值
#define DELAY         {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

#define TAS                DELAY;//{};                                                        //140ns
#define TDSW        DELAY;DELAY;DELAY;DELAY;DELAY;DELAY;//195ns
#define TWEN        DELAY;DELAY;                                                //450ns                       
*/
//晶振12M
#define DELAY         {_nop_();_nop_();_nop_();}
#define TAS                DELAY;//{};
#define TDSW        DELAY;DELAY;DELAY;DELAY;DELAY;DELAY;
#define TWEN        DELAY;DELAY;                                                
void LCD1602_Write_Command(uint8 cmd)
{
        lcd_rw=1;
TAS;
        do {
                lcd_en=0;
                lcd_en=1;
TWEN;
        }while (LCD_BUSYBIT); //end check busy
        DATA_PORT = cmd;
TDSW;
        lcd_rw=0;
TAS;
        lcd_en=0;
        DATA_PORT = 0xff;
}

void LCD1602_Write_Data(uint8 dat)
{
        lcd_rw=1;
TAS;
        do {
                lcd_en=0;
                lcd_en=1;
TWEN;
        } while (LCD_BUSYBIT);//end check busy
        DATA_PORT = dat;
TDSW;
        lcd_rs=1;
        lcd_rw=0;
TAS;
        lcd_en=0;
        DATA_PORT = 0xff;
        lcd_rs=0;
}

//LCD1602的初始化函数
void LCD1602_Init(uint8 mode)
{
        uint16 i=0;
        lcd_rs=0;
        while (--i);        //初始化等待
        LCD1602_Write_Command(0x38);/*设置8位格式,2行,5*7*/
        LCD1602_Write_Command(0x01);/*清除显示*/
        LCD1602_Write_Command(0x06);/*设定输入方式,增量不移位*/
        LCD1602_Write_Command(mode);/*0x0c整体显示,关光标,不闪烁*/
}

此帖出自51单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我觉得是哪有逻辑错误
此帖出自51单片机论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

板凳
 
你中断周期太短了,这点时间中断服务执行不完.
你试试定时器的自动重装模式,能好些不过也有个限度.
此帖出自51单片机论坛

点评

是没进中断,把1602初始化屏蔽就有输出了,可是没有重复使用I/O口怎么就影响了?  详情 回复 发表于 2014-3-9 11:22
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

4
 
没准根本就没有进入中断函数,看看你的定时器中断是不是配置正确了
此帖出自51单片机论坛

点评

你答对了,没进中断,是1602的初始化影响了中断。不过怎么影响还没找到,又没有重复使用I/O口,正在检修  详情 回复 发表于 2014-3-9 11:21
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

5
 
yuanlai2010 发表于 2014-3-9 11:11
没准根本就没有进入中断函数,看看你的定时器中断是不是配置正确了

你答对了,没进中断,是1602的初始化影响了中断。不过怎么影响还没找到,又没有重复使用I/O口,正在检修
此帖出自51单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

6
 
huo_hu 发表于 2014-3-9 10:31
你中断周期太短了,这点时间中断服务执行不完.
你试试定时器的自动重装模式,能好些不过也有个限度.

是没进中断,把1602初始化屏蔽就有输出了,可是没有重复使用I/O口怎么就影响了?
此帖出自51单片机论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

7
 
1602有类似while(checkbusy)的东西再加连接不正常
此帖出自51单片机论坛

点评

我一行一行的屏蔽,终于发现是写指令时有问题,就是while(checkbusy)有问题,我把写指令的函数判忙改为了delayms(15),就输出正常了,温湿度也对。话说好厉害啊,这种经验都有。我想多问一句,为什么写数里的判忙没  详情 回复 发表于 2014-3-9 15:52
 
 
 

回复

315

帖子

8

TA的资源

一粒金砂(中级)

8
 
能全贴出来吗?这样子,问题只能靠有经验的人猜。要么你就一点点程序测试···
此帖出自51单片机论坛

点评

谢谢啊,我一行一行的找,发现了错误。  详情 回复 发表于 2014-3-9 15:53
 
个人签名给生活一个梦想,给奋斗一个方向!---淘宝搜索逸嵌电子工作室
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

9
 
huo_hu 发表于 2014-3-9 11:44
1602有类似while(checkbusy)的东西再加连接不正常

我一行一行的屏蔽,终于发现是写指令时有问题,就是while(checkbusy)有问题,我把写指令的函数判忙改为了delayms(15),就输出正常了,温湿度也对。话说好厉害啊,这种经验都有。我想多问一句,为什么写数里的判忙没有出错?
此帖出自51单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

10
 
奋斗吧小鱼儿 发表于 2014-3-9 13:07
能全贴出来吗?这样子,问题只能靠有经验的人猜。要么你就一点点程序测试···

谢谢啊,我一行一行的找,发现了错误。
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表