高手帮注释下这一条单片机输出PWM信号程序,谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高手帮注释下这一条单片机输出PWM信号程序,谢谢相关的知识,希望对你有一定的参考价值。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1= P3^4;
sbit KEY2= P3^5;
sbit PWM= P1^7;
#define PERIOD 1000
#define MIN_POSITIVE 100
#define MAX_POSITIVE 900
#define STEP 10

uint POSITIVE=MIN_POSITIVE;

void delay(uint i)

while(--i);


void init_timer0()

TMOD=0X01;
TL0=(POSITIVE-PERIOD)%256;
TH0=(POSITIVE-PERIOD)/256;
ET0=1;


void init_timer1()

TMOD|=0X10;
TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
ET1=1;
EA=1;


void TIMER0_ISR(void)interrupt 1

TL0=(POSITIVE-PERIOD)%256;
TH0=(POSITIVE-PERIOD)/256;
TR0=0;
TR1=1;
PWM=0;


void TIMER1_ISR(void)interrupt 3

TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
TR1=0;
TR0=1;
PWM=1;


void key_scan()

uint step=0;
step=(PERIOD-MIN_POSITIVE-100)/STEP;
KEY1=1;
KEY2=1;
if(KEY1==0||KEY2==0)

delay(100);
if(KEY1==0)

POSITIVE+=step;
if(POSITIVE>MAX_POSITIVE)
POSITIVE=MAX_POSITIVE;

if(KEY2==0)

POSITIVE-=step;
if(POSITIVE<MIN_POSITIVE)
POSITIVE=MIN_POSITIVE;

while(KEY1==0||KEY2==0);



void main()

init_timer0();
init_timer1();
TR0=1;
while(1)key_scan();

谢谢了大哥,我会追分感谢

#include <reg52.h> //头文件
#define uchar unsigned char
#define uint unsigned int
sbit KEY1= P3^4; //定义按钮
sbit KEY2= P3^5; //定义按钮
sbit PWM= P1^7;//PWM输出的管脚定义
#define PERIOD 1000 //pwm周期
#define MIN_POSITIVE 100 //最小占空比100/1000
#define MAX_POSITIVE 900 //最大占空比900/1000
#define STEP 10 //步长

uint POSITIVE=MIN_POSITIVE;

void delay(uint i)//延时函数

while(--i);


void init_timer0()//设置定时器

TMOD=0X01;
TL0=(POSITIVE-PERIOD)%256;//具体怎么实现的你看一下51单片机定时器的东西,TLO,THO。
TH0=(POSITIVE-PERIOD)/256;
ET0=1;


void init_timer1() // 初始化定时器

TMOD|=0X10;
TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
ET1=1;
EA=1;


void TIMER0_ISR(void)interrupt 1 //中断响应函数

TL0=(POSITIVE-PERIOD)%256;
TH0=(POSITIVE-PERIOD)/256;
TR0=0;
TR1=1;
PWM=0;


void TIMER1_ISR(void)interrupt 3 //中断响应函数

TL1=(0-POSITIVE)%256;
TH1=(0-POSITIVE)/256;
TR1=0;
TR0=1;
PWM=1;


void key_scan() 按钮扫描函数

uint step=0;
step=(PERIOD-MIN_POSITIVE-100)/STEP;
KEY1=1;
KEY2=1;
if(KEY1==0||KEY2==0)

delay(100);
if(KEY1==0)

POSITIVE+=step;
if(POSITIVE>MAX_POSITIVE)
POSITIVE=MAX_POSITIVE;

if(KEY2==0)

POSITIVE-=step;
if(POSITIVE<MIN_POSITIVE)
POSITIVE=MIN_POSITIVE;

while(KEY1==0||KEY2==0);



void main() //主函数

init_timer0();
init_timer1();
TR0=1;
while(1)key_scan();

//这里的意思就是高电平使用一个定时器,低电平使用一个定时器,其实可以使用一个定时器就可以完成这个任务。他的左右只是1ms响应一个中断,然后计数。
/****************************************/
#include <REGX51.H>
#define TIMER0_COUNT 0xFC18 //每秒中端1000次
unsigned long int m,a;

static void timer0_isr(void) interrupt 1 using 1

TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
m++;

static void timer0_initialize(void)

EA=0; /* 设定系统不接受所有的中断 */
m=0;
TR0=0; /* 关闭Timer0 */
TMOD =0x01; /* 设定计时器0为16位的工作模式 */
TL0=(TIMER0_COUNT & 0x00FF); /* 设定TL0的数值 */
TH0=(TIMER0_COUNT >> 8); /* 设定TH0的数值 */
PT0=0; /* 设定计时器0有比较高的优先级 */
ET0=1; /* 设定接受Timer0的中断 */
TR0=1; /* 启动Timer0 */
EA=1; /* 设定系统接受中断 */


void main (void)

timer0_initialize();
P2_0=0;
P2_1=1;
P3_0=0;
P3_1=1;

a=25;
while(1)

if(m==a)

P2_2=0;
P3_2=0;

if(m==50)

P2_2=1;
P3_2=1;
m=0;



/****************************************/
这是我之前写的程序,你看看吧。希望对你有帮助,这个好理解点
参考技术A 哈哈,在作弊呢!把单片机那本书,看5遍!你肯定能搞清楚!追问

额,作弊下嘛,我真不懂这源码,看了就头痛

C语言 四则运算 各位C语言高手帮忙做下这题!!谢谢谢谢谢谢

一、题目:四则运算

二、目的与要求

1. 目的:

通过编写四则运算程序,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。

2. 基本要求:

1)要求用C语言编程,在Visual C++环境下调试完成;

2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;

3)要求应用本课所讲授的程序设计语言知识来解决问题.

三、设计方法和基本原理

1. 课题功能描述

本程序的功能,就是实现数的加减乘除四则运算,如自动计算3+5*8的结果。

2. 问题详细描述

程序运行时,首先提示用户输入四则运算表达式(表达式中最多有3个运算符,数据范围为1-100的整数);

输入结束后,程序自动进行计算并给出结果。

如:输入13-10+5/8时输出3.625。

3. 问题的解决方案

注意:问题的解决方案有很多,下面给出的仅供同学们参考。

该问题主要注意四则运算的优先级问题:乘除运算比加减运算优先级高,同级运算按从左到右的顺序运算。

本程序应采用模块化设计方法,设计几个功能模块。例如(仅供参考):

字符串解析函数(将输入字符串分解成数和运算符)

将数据(字符数组中)转换成十进制数(long)
判读是否存在高优先级运算符,若存在首先计算其运算结果并保存。
同级运算按先后顺序进行。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define maxsize 50
void trans(char str[],char exp[])/*将算术表达式str转换成后缀表达式exp*/

struct
char data[maxsize]; /*存放运算符*/
int top; /*栈指针*/
opr; /*定义运算符栈*/
char ch;
int i=0,t=0; /*t作为exp的下标,i作为str的下标*/
opr.top=-1; /*初始化设定top的值为负一*/
ch=str[i];i++; /*逐个读取字符串中的字符*/
while (ch!='\0') /*str表达式未扫描完时循环*/
switch(ch) /*判定*/

case '(':
opr.top++;opr.data[opr.top]=ch; /*判定为'('号,则将其入栈opr*/
break;
case ')':
while (opr.data[opr.top]!='(') /*判定为')'号*/
exp[t]=opr.data[opr.top]; /*将栈opr中'('以后的字符依次删除并存入数组exp中*/
opr.top--;
t++;

opr.top--; /*将左括号删除*/
break;
case '+': /*判定为加号或减号*/
case '-':
while (opr.top!=-1 &&opr.data[opr.top]!='(')
exp[t]=opr.data[opr.top]; /*将当前栈opr中(以前的所有字符依次删除并存入数组exp中*/
opr.top--;
t++;

opr.top++;opr.data[opr.top]=ch; /*将ch存入栈opr中*/
break;
case '*':
case '/':
while (opr.data[opr.top]=='*'||opr.data[opr.top]=='/'||opr.data[opr.top]=='^')
exp[t]=opr.data[opr.top]; /*将当前栈opr中连续的'*'或'/'或'^'依次删除并存入数组exp中*/
opr.top--;
t++;

opr.top++;opr.data[opr.top]=ch; /*将ch存入栈opr中*/
break;
case '^': /*判定为乘方号*/
while (opr.data[opr.top]=='^')
exp[t]=opr.data[opr.top]; /*将当前栈opr中连续的'^'依次删除并存入数组exp中*/
opr.top--;
t++;

opr.top++;opr.data[opr.top]=ch; /*将ch存入栈opr中*/
break;
case ' ': break; /*过滤掉空格*/
default:
while(ch>='0'&& ch<='9'||ch=='.') /*判定为数字*/
exp[t]=ch;t++; /*将后续数字依次存入数组中*/
ch=str[i];i++;

i--;
exp[t]='#';t++; /*用#标示一个数值串结束*/

ch=str[i];i++;

while (opr.top!=-1) /*此时str扫描完毕,栈不空时循环*/
exp[t]=opr.data[opr.top];
t++;opr.top--;

exp[t]='\0'; /*给exp表达式添加结束标示*/

float compvalue(char exp[]) /*计算后缀表达式的值*/

struct
float data[maxsize]; /*存放数值*/
int top; /*栈指针*/
st; /*定义数值栈*/
float d,d2;double po;
char ch;
int t=0,flag=1,i,count; /*t作为exp的下标*/
st.top=-1;
ch=exp[t];t++;
while (ch!='\0') /*exp字符串为扫描完时循环*/
switch(ch)

case '+':st.data[st.top-1]=st.data[st.top-1]+st.data[st.top]; /*执行两次退栈,并将计算结果入栈*/
st.top--;break;
case '-':st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
st.top--;break;
case '*':st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];
st.top--;break;
case '/':
if(st.data[st.top]!=0)
st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
else
printf("\n除零错误!\n");
exit(0); /*除数为零,异常退出*/

st.top--;break;
case '^':
po=pow(st.data[st.top-1],st.data[st.top]); st.data[st.top-1]=(float)po;/*调用pow子函数进行乘方运算*/
st.top--;break;
default:
d=0; flag=1; d2=0; /*将数字字符转换成对应的数值存放到d中*/
while(ch>='0'&&ch<='9'&&flag) /*判定为数字字符*/
d=10*d+ch-'0';
ch=exp[t];t++;
if(ch=='.')
flag=0;


if(flag==0)
ch=exp[t];t++;count=0;
while(ch>='0'&&ch<='9') /*判定为数字字符*/
d2=10*d2+ch-'0';
ch=exp[t];t++;count++;

for(i=1;i<=count;i++)
d2=0.1*d2;

d+=d2;
st.top++;
st.data[st.top]=d;

ch=exp[t];t++;

return st.data[st.top];

int main()

char str[maxsize],exp[maxsize]; /*str存储原算术表达式,exp存储对应的后缀表达式*/
printf("the arithmetic expression is:\n");
gets(str);
trans(str,exp);
printf("the postfix expression is:%s\n",exp);
printf("the result is %g\n",compvalue(exp));
参考技术A 败笔技术论坛,中国最大的编程论坛,建议你上那去学习吧

参考资料:败笔网络安全小组

参考技术B 在网吧 1361019294 我的Q 加老回去给你说。机子上有。 参考技术C 我就喜欢害人:)
#include
#include
#include
#define
err
-1
#define
max
100
/*定义堆栈的大小*/
int
stack[max];
/*用一维数组定义堆栈*/
int
top=0;
/*定义堆栈指示*/
int
push(int
i)
/*存储运算数,入栈操作*/

if(top
评论
0
0
加载更多

以上是关于高手帮注释下这一条单片机输出PWM信号程序,谢谢的主要内容,如果未能解决你的问题,请参考以下文章

单片机ad与pwm问题

单片机如何产生PWM信号

shell脚本中 的 单引号和反引号经常混淆,请高手帮我区别它们的功能,谢谢

单片机710PWM

使用HAL库开发STM32:使用Timer输出PWM信号

java操作oracle程序,高手帮看下这程序?