用51单片机每0.5秒P1.1输出一个宽度可变脉冲为1ms的倍数,没16个在重复。求大神给个完整的编程,谢谢 30

嗯我是基于c语言的!!如果能副上个原理图最好有AT89S5130uf电容2个20uf1个按键开关2个12M晶振4个电阻... 嗯我是基于c语言的!!
如果能副上个原理图最好
有AT89S51 30uf电容2个 20uf1个 按键开关2个 12M晶振 4个电阻
展开
 我来答
随和还犀利的小板栗0a
2012-12-17 · TA获得超过392个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:301万
展开全部
都没人回答了,帮帮你吧,记得选为满意答案哦
#include<REG51.h>
//#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

typedef signed char s8;
typedef signed int s16;
typedef signed long s32;

#define CNT 1000 //初始值#define WIDTH (u16)500 //脉冲宽度500ms
sbit ClkOut = P1^1;
u8 OutHCnt; //高电平输出次数
u8 ClkH;
u16 ClkL; //输出脉冲高电平和低电平宽度
/************************************************************************************** 函数定义 */
void InitTimer0(void); //timer0初始化函数

/******************************************************************************** timer0中断函数 */
void T0Isr(void) interrupt 1
{
TL0 = (65536 - CNT) % 256;
TH0 = (65536 - CNT) / 256; //初始值
if(ClkOut)
{
if( ++ OutHCnt == ClkH)
{
OutHCnt = 0;
ClkOut = 0;
if(++ ClkH == 16)
ClkH = 1;
ClkL = WIDTH - (u16)ClkH;
}
}
else if(-- ClkL == 0)
ClkOut = 1;
}

/****************************************************************************** timer0初始化函数 */
void InitTimer0(void)
{
ET0 = 0;
TR0 = 0;
TF0 = 0;
ClkH = 1;
ClkL = WIDTH - ClkH;
OutHCnt = 0;

TMOD &= 0xf0; //清除原来设置
TMOD |= 0x01; //设置工作模式:计时器模式1
TL0 = (65536 - CNT) % 256;
TH0 = (65536 - CNT) / 256; //初始值
TR0 = 1;
ET0 = 1;
ClkOut = 0;
}

/************************************************************************************** main函数 */
void main(void)
{
InitTimer0();
EA = 1;
for(;;)
;
}
不至于吧,这么简单的东西也要原理图???
追问
这个我只学过c语言,对大大的一些用语我看不懂是用汇编语言的吗?希望能得到c语言的
追答
你学过C语言,那不至于连C和汇编都分不清楚吧?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式