最近在学习制作电动撑衣杆这个项目,作为单片机新手,找不到关于伸缩杆的硬件与资料,师兄给的意见是类似于消防车云梯那种伸缩结构。
51的INT0口可以作为普通IO口吗?我想把这个IO口作为按键来使用。INT0口不是外部中断吗?(全局中断已经打开)会不会按键按下给他一个低电平,然后就进入中断了还有,程序中有关于T0计时器的程序,那么T0这个IO口还可以做普通IO口吗?还有51单片机的其他端口是不是都可以当作普通IO口来使用?关于这一块很迷茫。
用什么芯片放大电流信号的,如果用运放那么没有负电源信号就无法到达0电压,是不是要用专用芯片的
目的是想通过串口触摸屏控制单片机,实现输出PWM的脉宽和频率的单独调制。。。。stc89c52单片机一共两个定时器,因为脉宽和频率的单独调制功能就占用了T0和T1了,现在可以通过独立按键实现脉宽和频率的单独加减,但是如何通过串口来实现呢?打开串口就和前面的程序冲突了。或者说可以通过一个定时器实现PWM的脉宽和频率的单独调制吗?
遇到一个问题,就是要求3.3V电压供给单片机,那我可以选择STC89LE52RC单片机吗?但是这个单片机跟STC89C52RC单片机的原理图有什么不同吗?我和队友所有的仿真之类的都是基于STC89C52RC的,网上好少关于LE52这个单片机的资料。
各位大佬,画的HT1621B驱动板驱动液晶,烧录程序后液晶不显示程序如下。#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define uint32 unsigned long int#define CKSEL (*(uchar volatile xdata *)0xfe00)#define CLKDIV (*(uchar volatile xdata *)0xfe01)#define IRC24MCR (*(uchar volatile xdata *)0xfe02)sfr P1M0=0x92;sfr P1M1=0x91;sfr P_SW2 = 0xba;sbit _DAT=P1^6; //HT1621数据引脚sbit _CS=P1^0; //HT1621使能引脚sbit _WR=P1^1; //HT1621时钟引脚sbit _Vlcd=P1^7;//液晶/背光电源控制引脚,低电平有效void delay_ms(uint z) //主时钟频率24MHz{ uchar i=11 j=190; _nop_(); _nop_(); _nop_(); while(z--) { do { while (--j); } while (--i); }}void WriteBitR(uchar datuchar m){ uchar i; for (i=0;i<m;i++) { _WR=0; _nop_(); _DAT=dat&0x80; _nop_(); _WR=1; _nop_(); dat<<=1; } }void Write_cmd(uchar Cmd){ _CS=0; _nop_(); WriteBitR(0x804); //写入命令标志100 WriteBitR(Cmd8); //写入命令数据 _CS=1; _nop_();}void WriteOneData(uchar Addruchar Data){ _CS=0; WriteBitR(0xa03); //写入数据标志101 WriteBitR(Addr<<26); //写入地址数据 WriteBitR(Data8); //写入数据 _CS=1; _nop_();}void LCD_Init(void){ _CS=1; _WR=1; _DAT=1; Write_cmd(0x52); //0b1000 0101 0010 1/3duty 4com Write_cmd(0X30); //0b1000 0011 0000 内部时钟 Write_cmd(0x00); //0b1000 0000 0000 关振系统荡器和LCD偏压发生器 Write_cmd(0X0A); //0b1000 0000 1010 禁止看门狗 Write_cmd(0X02); //0b1000 0000 0010 打开系统振荡器 Write_cmd(0X06); //0b1000 0000 0110 打开LCD偏压}void display1(){ uchar m1; for(m1=0;m1<30;m1=m1+2) WriteOneData(m10xff);}void Init(){ P_SW2=0x80; CKSEL=0x00; P_SW2=0x00; P1M0=0x00; P1M1=0x00; _Vlcd=0; LCD_Init();}void main(){ Init(); while(1) { display1(); delay_ms(1); }}
#include <REGX51.H>#include"LCD1602.h"void Delay1ms(unsigned int xms) //@12.000MHz{ while(xms) { unsigned char i j; //定义毫秒的延时 i = 2; j = 239; do { while (--j); } while (--i); xms--; }}void dierduan (){ int years = 2020; //万年历 //定义初始值 int months = 7; int date = 15; int hour = 0; //从零开始 int minute = 0; int second = 0; LCD_Init(); LCD_ShowString(11"Date"); //LCD显示 LCD_ShowNum(16 years4); LCD_ShowNum(111 months2); LCD_ShowNum(114date2); LCD_ShowString(21"Time"); LCD_ShowNum(26 hour2); LCD_ShowNum(29 minute2); LCD_ShowNum(212 second2); LCD_ShowString(215"WE"); while(1) { if (second<60) //秒数增加 { second++; Delay1ms(1000); LCD_ShowNum(212 second2); } if(second==60) //分钟增加 { second = 0; minute++; LCD_ShowNum(29 minute2); } if(minute==60) //小时增加 { minute = 0; hour++; LCD_ShowNum(29 minute2); LCD_ShowNum(26 hour2); } if(hour==24) //天数增加 { hour=0; date++; LCD_ShowNum(26 hour2); LCD_ShowNum(114date2); LCD_ShowString(215"WE"); } if(date==30) //月份增加 { date=0; months++; LCD_ShowNum(111 months2); LCD_ShowNum(114date2); } if(months==12) //年份增加 { months=0; years++; LCD_ShowString(11"Date"); LCD_ShowNum(16 years4); LCD_ShowNum(111 months2); } if(P3_0==0) //长按键增加秒数 { Delay1ms(10); while(P3_0); Delay1ms(10); ++second; LCD_ShowNum(212 second2); } else if(P3_1==0) //长按键减少秒数 { Delay1ms(10); while(P3_1); Delay1ms(10); --second; LCD_ShowNum(212 second2); } else if(P3_2==0) { //长按键增加天数 Delay1ms(10); while(P3_2); Delay1ms(10); ++date; LCD_ShowNum(114date2); } else if(P3_3==0) //长按键减少天数 { Delay1ms(10); while(P3_3); Delay1ms(10); date--; LCD_ShowNum(114date2); } }}main (){ LCD_Init(); LCD_ShowString(11"Hello!"); //LCD显示Hello Delay1ms(10000); //延迟显示10秒 LCD_Init(); LCD_ShowString(11"WL1908104020"); // LCD显示 Delay1ms(6000); // 延迟6秒 LCD_Init(); LCD_ShowString(11"DUANZUNCHENG"); // LCD显示 Delay1ms(9000); // 延迟9秒 dierduan () ; while (1) { } }
华为手机没我耳机孔,只能用typec,那么接口里面是直接接到耳机,还是说有转换芯片的,可以同时充电和使用耳机吗
#include <reg52.h>unsigned char timer1;sbit DIR = P1^2;//位定义DIR为P1.0口,控制步进电机转向sbit ENA=P1^1; //位定义ENA为P1.1,控制步进电机的使能sbit PWM=P1^0;//控制输出脉冲void Delay(unsigned int t);void system_Ini() //调用子函数初始化定时器T1{ TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x33; //设置定时初值 TH0 = 0xFE; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时}void UsartInit(){SCON=0X50; //设置为工作方式1TMOD &= 0x0F; //设置定时器模式TMOD|=0X20; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XF3; //计数器初始值设置,注意波特率是4800的TL1=0XF3; ES=1; //打开接收中断EA=1; //打开总中断TR1=1; //打开计数器}bit receiveFlag = 0;main() {int count = 0;system_Ini(); //调用子函数初始化定时器 T1UsartInit();IE = 0X92;//开T0串口中断,开总中断10010010while(1){ if(receiveFlag) { count = 0; receiveFlag = 0; while(count < 205) { if (timer1>10) //决定这一个脉冲的周期时间,此处为0.5ms*10=5ms { timer1=0; count ++; } if (timer1<3) { PWM=0; } else { PWM = 1; } } } } }void T1zd(void) interrupt 1 //开定时器0中断 T0中断 {TH0 = 0xfe;TL0 = 0x33;timer1++;//计数+1}void Usart() interrupt 4 //串口相应中断{ RI = 0;//清除接收中断标志位 receiveFlag = 1;}void Delay(unsigned int t)//延时{ while(t--) { ; }}
我想问一下,我要在proteus中使用语音播放,但是没有语音芯片,就很苦恼,而我只能做仿真。我的实验内容是LCD显示的内容要通过语音播放出来,但是不知道怎么办?
考虑成本,AT89C2051单片机能否驱动WS2812 RGB LED,全静态工作频率:0Hz-24MHz,不知能否满足驱动要求。。
我是根据师傅的51单片机编程自学的 ,上电后lcd1602第一排显示方块,初始化后方块消失,接着写数据,没有反应。
自己写了个函数,参数为指向数组的指针,及计数变量,函数实现:void Uart2Send(unsigned char *punsigned char i) {unsigned char utemp; p[i]=0x00; #if 0 for(utemp=0;utemp<=i;utemp++) { //S2BUF=p[utemp]; S2BUF=utemp; while((S2CON & 0x02)==0); S2CON &= ~0x02; } #endif do { S2BUF=utemp; while((S2CON & 0x02)==0); S2CON &= ~0x02; utemp++; } while(utemp<=i);}函数调用:Uart2Send(&Re_R_buffer[0x00]10);Uart2Send(&Re_R_buffer[0x00]16);调试问题:1.//S2BUF=p[utemp];放开----非S2BUF=utemp;状态下,数组发送了两遍。 2.怀疑是循环的问题,改成先执行后判断的dowhie循环。实验结果:0,0 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF。没有在utemp>16时结束循环
#include <reg52.h>#define uchar unsigned char#define uint unsigned intvoid delay_ms (uint x){ uchar t; while(x--) for(t=0; t<120; t++); } void main() { uchar i; unsigned char table[]=(0xc0 0xf9 0xa4 0xb0 0x99 0x92 0x82 0xf8 0x80 0x90); SCON=0x00; while(i<10) { SBUF=table [i]; while(!TI); TI=0; i=(i+1)%10; delay_ms(1000); }}
51单片机做了一个指纹+rfid门禁识别系统rfid是p21-25口模拟的spi,刚开始波特率2400指纹是p30.31口uart,波特率9600刚开始两个合并起来不能用,我就把rfid的波特率也改到9600,就可以用了连接两个设备一定要同一波特率吗?
各位大佬好,我是新人最近学51单片机有一个问题一直困惑着我,就是关于串口中断函数何时进入的问题,如下面代码void Usart() interrupt 4{ u8 receiveData; receiveData=SBUF; RI = 0; SBUF=receiveData; while(!TI); TI=0; }复制代码上面的串口中断函数应该是在RI或TI置一的时候进入,上面的中断函数初次进入是RI=1,但是运行到SBUF=receiveData的时候,此时TI应该置0,等待TI置1,那假如在这个程序中,TI在中断程序中变成1,那中断程序是直接运行到末尾还是重新从头运行,毕竟TI=1触发了中断,应该重头再次运行。