void PWM_config(void) { P3M0 &= ~0x80; P3M1 &= ~0x80; P3 &= ~0x80; //ÉèÖÃP3.7µçƽ P_SW2 |= 0x80; PWMCKS = 0x00; PWMC = CYCLE; //ÉèÖÃPWMÖÜÆÚ PWM2T1 = 1; PWM2T2 = 0; PWM2CR = 0x00; //PWM2Êä³öµ½P3.7q PWMCFG = 0x00; //ÅäÖÃPWMµÄÊä³ö³õʼµçƽ PWMCR = 0x01; //ʹÄÜPWMÐźÅÊä³ö PWMCR |= 0x80; //ʹÄÜPWMÄ£¿é P_SW2 &= ~0x80; }
时间: 2024-02-14 22:31:34 浏览: 117
这段代码是用于配置PWM(脉冲宽度调制)的函数。该函数的作用是设置P3.7引脚为PWM输出,并进行相应的配置。
代码中的具体操作如下:
1. 清除P3.7的端口模式控制寄存器(P3M0)和端口模式寄存器(P3M1)的最高位,将其设为普通推挽输出模式。
2. 清除P3.7引脚的输出,即将其置为低电平。
3. 设置P_SW2寄存器的最高位为1,用于切换PWM2引脚的映射。
4. 设置PWMCKS寄存器为0x00,选择PWM时钟源为系统时钟。
5. 设置PWMC寄存器的值为CYCLE,用于设置PWM周期。
6. 设置PWM2T1寄存器的值为1,用于设置PWM2的占空比高位。
7. 设置PWM2T2寄存器的值为0,用于设置PWM2的占空比低位。
8. 清除PWM2CR寄存器,将PWM2输出到P3.7引脚。
9. 清除PWMCFG寄存器,将PWM输出的初始电平设置为低电平。
10. 设置PWMCR寄存器为0x01,启用PWM输出。
11. 设置PWMCR寄存器的最高位为1,使能PWM模块。
12. 清除P_SW2寄存器的最高位,恢复PWM2引脚的映射。
通过以上操作,函数完成了PWM的配置,使得P3.7引脚可以输出PWM信号。
相关问题
#include "reg51.h" #include "intrins.h" #define FOSC 11059200UL #define BRT (65536 - FOSC / 115200 / 4) sfr AUXR = 0x8e; sfr T2H = 0xd6; sfr T2L = 0xd7; sfr S2CON = 0x9a; sfr S2BUF = 0x9b; sfr IE2 = 0xaf; sfr P0M1 = 0x93; sfr P0M0 = 0x94; sfr P1M1 = 0x91; sfr P1M0 = 0x92; sfr P2M1 = 0x95; sfr P2M0 = 0x96; sfr P3M1 = 0xb1; sfr P3M0 = 0xb2; sfr P4M1 = 0xb3; sfr P4M0 = 0xb4; sfr P5M1 = 0xc9; sfr P5M0 = 0xca; bit busy; char wptr; char rptr; char buffer[16]; void Uart2Isr() interrupt 8 { if (S2CON & 0x02) { S2CON &= ~0x02; busy = 0; } if (S2CON & 0x01) { S2CON &= ~0x01; buffer[wptr++] = S2BUF; wptr &= 0x0f; } } void Uart2Init() { S2CON = 0x10; T2L = BRT; T2H = BRT >> 8; AUXR = 0x14; wptr = 0x00; rptr = 0x00; busy = 0; } void Uart2Send(char dat) { while (busy); busy = 1; S2BUF = dat; } void Uart2SendStr(char *p) { while (*p) { Uart2Send(*p++); } } void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; Uart2Init(); IE2 = 0x01; EA = 1; Uart2SendStr("Uart Test !\r\n"); while (1) { if (rptr != wptr) { Uart2Send(buffer[rptr++]); rptr &= 0x0f; } } } 修改此程序使发送者发送字母o接收者连接的板子中端口P2.5灯开始亮其余灯灭
将程序中的 P2M1 和 P2M0 的值改为 0x20,即可将 P2.5 设置为推挽输出模式。然后在主函数中加入以下代码,即可实现发送字母o时点亮 P2.5 灯,停止发送时熄灭 P2.5 灯的功能:
```
while (1) {
if (rptr != wptr) {
if (buffer[rptr] == 'o') {
P2_5 = 0; // 点亮 P2.5 灯
} else {
P2_5 = 1; // 熄灭 P2.5 灯
}
Uart2Send(buffer[rptr++]);
rptr &= 0x0f;
}
}
```
需要注意的是,程序中的 P2_5 是对 P2.5 引脚进行操作的宏定义,需要根据具体的单片机型号进行修改。
#include “config.h” void Port_Init();位 LED = P2^0;void main() { Port_Init(); // Timer0_Init();Uart1_Init();Uart1String(“hello1\n”);指示灯 = 0;clrStruct();while(1) { parseGpsBuffer(); printGpsBuffer(); } }void Port_Init() { P1M1=0x00;P1M0=0x00;P0M1=0x00;P0M0=0x00;P2M1=0x00;P2M0=0x00;P3M1=0x00;P3M0=0x00;}在这个函数里面添加一个液晶显示显示经纬度
好的,你需要添加一个LCD1602显示屏,然后连接到微控制器上,并且需要一个LCD1602的驱动程序。以下是一个简单的LCD1602驱动程序示例:
```
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit LCD_D4 = P0^4;
sbit LCD_D5 = P0^5;
sbit LCD_D6 = P0^6;
sbit LCD_D7 = P0^7;
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 120; j++);
}
}
void LCD_WriteCommand(unsigned char cmd)
{
RS = 0;
RW = 0;
LCD_D7 = cmd & 0x80;
LCD_D6 = cmd & 0x40;
LCD_D5 = cmd & 0x20;
LCD_D4 = cmd & 0x10;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
LCD_D7 = cmd & 0x08;
LCD_D6 = cmd & 0x04;
LCD_D5 = cmd & 0x02;
LCD_D4 = cmd & 0x01;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
}
void LCD_WriteData(unsigned char dat)
{
RS = 1;
RW = 0;
LCD_D7 = dat & 0x80;
LCD_D6 = dat & 0x40;
LCD_D5 = dat & 0x20;
LCD_D4 = dat & 0x10;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
LCD_D7 = dat & 0x08;
LCD_D6 = dat & 0x04;
LCD_D5 = dat & 0x02;
LCD_D4 = dat & 0x01;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
}
void LCD_Init()
{
LCD_WriteCommand(0x28); // 16×2显示,5×7点阵,4位数据接口
LCD_WriteCommand(0x0C); // 开启显示,不显示光标,不闪烁
LCD_WriteCommand(0x06); // 光标移动时不要移动屏幕
LCD_WriteCommand(0x01); // 清屏
}
void LCD_DisplayString(unsigned char x, unsigned char y, unsigned char *s)
{
unsigned char i = 0;
if (x < 16)
{
x |= 0x80;
switch (y)
{
case 0:
i = 0;
break;
case 1:
i = 0x40;
break;
case 2:
i = 0x10;
break;
case 3:
i = 0x50;
break;
}
i += x;
LCD_WriteCommand(i);
}
while (*s)
{
LCD_WriteData(*s++);
}
}
void main()
{
Port_Init();
Uart1_Init();
LCD_Init();
Uart1String("hello1\n");
while (1)
{
parseGpsBuffer();
printGpsBuffer();
// 在LCD1602显示经纬度
LCD_DisplayString(0, 0, "Lat: "); // 在第一行显示Lat:
LCD_DisplayString(5, 0, Latitude); // 在第一行显示经度
LCD_DisplayString(0, 1, "Lon: "); // 在第二行显示Lon:
LCD_DisplayString(5, 1, Longitude);// 在第二行显示纬度
}
}
```
这样,当你运行程序时,LCD1602将显示经纬度。注意,在代码中的parseGpsBuffer()和printGpsBuffer()函数中,需要将经纬度分别存储在变量Latitude和Longitude中。
阅读全文