扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
以12M晶振,50ms为例
创新互联建站专业IDC数据服务器托管提供商,专业提供成都服务器托管,服务器租用,绵阳服务器托管,绵阳服务器托管,成都多线服务器托管等服务器托管服务。
用定时器写
以下是中断程序
void pwm_1() interrupt 1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
P1^0=~P1^0;
}
#include
sbit wave=P1^0;
void SetupTimer0()
{
TMOD = 0XF0; //仅保留T1信息
TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器
TH0 = 256-250;//定时每0.25ms中断一次
TL0 = 256-250;
TR0 = 1; //开启定时器
ET0 = 1; //定时器0中断打开
}
data unsigned char us250;
data unsigned int ms;
bit WAVE; //用以记住当前wave的状态
void Timer0_ISR() interrupt 1 //定时中断服务程序,为按键消抖服务
{
if (++us2504) return;
us250=0; ++ms;
if (ms10) return;
//每10ms波形变化一次,20ms完成一个波形,所以波形是50Hz的
ms=0;
WAVE=~WAVE; wave=WAVE; //方波输出
}
void main()
{
us250=ms=0;
wave=WAVE=0;
SetupTimer0();
EA = 1; //全局中断打开
while(1); //在中断函数中实现方波输出
}
普通51的话需要模拟PWM,如果是加强版51有内置PWM模块,
PIC和AVR以及430还有STM也有集成PWM的型号!
如果是单纯输出方波的话就简单了。
程序如下:
//功能,按下P1_0的开关降低频率,按P1_1为升高频率
#includeAT89X52.H //引用AT89X52的库文件
#define uchar unsigned char //替换简称
#define uint unsigned int //替换简称
uchar sm; //定义临时变量
void delay_ms(uint ms) //延时子函数,一个循环12uS
{
while(--ms);
}
void T0_IRQ(void) interrupt TF0_VECTOR //定时器0中断函数
{
TH0=sm; //将变量赋予定时器0的高位
P2_0=!P2_0; //翻转IO
}
//寄存器初始化子函数
void mcu_init()
{
ET0=1; //开定时器0中断
EA=1; //开总中断
TMOD=0x01; //设置为16位定时器0
TH0=0xFF; //填充定时器高位
TR0=1; //开定时器0
sm=0xFF; //变量初始化
}
void main() //主函数
{
mcu_init(); //调用初始化函数
while(1) //主循环
{
if((!P1_0)||(!P1_1)) //检测是否有按键按下
{
delay_ms(8333); //延时去抖
if(!P1_0) //如果是P1_0按键按下
{
while(!P1_0); //等待按键放手
if(sm) //检测变量不为0
{
--sm; //自减1
P2_1=1; //取消边界LED
}
else P2_1=0; //到达边界点亮LED
}
else if(!P1_1) //否则如果P1_1按键按下
{
while(!P1_1); //等待按键放手
if(sm0xFF) //检测变量小于0xFF
{
++sm; //自加1
P2_1=1;
}
else P2_1=0;
}
}
}
}
最好还是不要用延时函数
比较准确的方法是利用定时器
以c51为例:
/*********定时器方波************/
/*********16位定时器************/
/************机器周期1us********/
/*********占空比50%*************/
/*********方波周期1s*************/
int a; // 定义全局整形变量
void int() interrupt 1
{
设置定时器初值为500;
a++;
if(a == 1000)
{
"输出取反"
}
}
本程序加了一个LCD1602,,,,你自己选择使用哈
#includereg52.h //包含头文件
#includeintrins.h
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar i , j ,n,z; //定义全局变量
sbit RS=P2^0; //定义端口
sbit RW=P2^1;
sbit E =P2^2;
sbit k=P2^7;
sbit k1=P2^6;
uchar code str0[]={"Sine Wave "}; //定义LCD1602显示字符数组
uchar code str1[]={"Triangle Wave"};
uchar code str2[]={"Square Wave "};
uchar code table[3][40]= //定义显示波形的二维数组
{
0x80,0x94,0xa7,0xb9,0xca,0xd9,0xe7,0xf1,0xf8,0xfd,
0xff,0xfd,0xf8,0xf1,0xe7,0xd9,0xca,0xb9,0xa7,0x94,
0x80,0x6c,0x55,0x46,0x35,0x25,0x18,0x0e,0x06,0x02,
0x00,0x02,0x06,0x0e,0x18,0x25,0x35,0x46,0x55,0x6c,
0x80,0x8c,0x99,0xa6,0xb3,0xc0,0xcc,0xd9,0xe6,0xf2,
0xff,0xf2,0xe6,0xd9,0xcc,0xc0,0xb3,0xa6,0x99,0x8c,
0x80,0x73,0x66,0x5a,0x4d,0x40,0x33,0x26,0x1a,0x0d,
0x00,0x0d,0x1a,0x26,0x33,0x40,0x4d,0x5a,0x66,0x73,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
void delay(uint z) //延时程序
{
for(z;z0;z--)
{
}
}
void Write_command(uchar cmd) //LCD1602写入命令程序
{
RS=0; //选择指令寄存器
RW=0; //写操作
E =1; //使能端
P1=cmd;
delay(1);
E =0;
delay(10); //延时 使LCD1602处于不忙状态
}
void Write_data(uchar cmd) //LCD1602写入数据命令
{
RS=1; //选择数据寄存器
RW=0; //写操作
E =1; //时能端
P1=cmd;
delay(1);
E=0;
delay(10); //延时 使LCD1602处于不忙状态
}
void Lcd_init() //LCD1602初始化程序
{
Write_command(0x38); //设置16*2显示 5*7点阵 8位数据接口
Write_command(0x0c); //LCD1602开显示 ,不显示光标
Write_command(0x06); //读或写一字符后指针加一 ,显示不移动
Write_command(0x80+0x00); //数据指针地址设置
}
void Display() //LCD1602显示英文程序
{
Lcd_init();
if (i==0)
{
for (n=0;n13;n++)
{
Write_data(str0[n]);
}
}
else if(i==1)
{
for(n=0;n13;n++)
{
Write_data(str1[n]);
}
}
else
{
for(n=0;n13;n++)
{
Write_data(str2[n]);
}
}
}
void main() //主函数
{
Display();
while(1)
{
for(j=0;j40;j++)
{
P0=table[i][j];
}
if(k==0) //开关程序
{
delay(1);
if(k==0);
{
if(k==0)
{
i++;
if (i==3) i=0;
Display();
}
}
while(k==0);
}
}
}
附上代码,讲解在后面:
public class Program
{
static void Main(string[] args)
{
ListPoint range = new ListPoint(5 * 5);
for (int i = 0; i 5; i++)
{
for (int j = 0; j 5; j++)
{
range.Add(new Point { X = j, Y = i });
}
}
//移动方向的顺序
MoveDirection[] md = new[]
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流