咱俩玩一会儿呀
咱俩玩一会儿呀
关注数: 0
粉丝数: 335
发帖数: 10,161
关注贴吧数: 9
stc15+mic电平指示
电平指示器
开发电路板喽,做不好练习了 有需要的大叫呀。
单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,32位单片机,发展到现在的800M的高速单片机。
分享单按键开关机电路
分享单键开关机电路图 完
吧主快做一个,STC看门狗,现在需要这个程序 我不会呀 吧主快做一个,STC看门狗,现在需要这个程序 我不会呀
STC 识别CPU号(吧主捣乱之5之第三次) //此程序是检测ID号是否正确,如正确 P2是流水灯,如果错的,是全闪灯。 #include <reg51.h> //波特率2400,下载后可以按下复位 #include<intrins.h> typedef unsigned int u16; typedef unsigned char u8; //#define ID_ADDR_RAM 0x1F0 //读RAM的8位,最后七位是全球 ID唯一号(89C52RC) //#define ID_ROM_RAM 0x1FF8 //读ROM的8位,最后七位是全球 ID唯一号(89C52RC) #define ID_ADDR_RAM 0x0F1 //读RAM的8位,最后七位是全球 ID唯一号(89C52RC) #define ID_ROM_RAM 0x1FF8 //读ROM的8位,最后七位是全球 ID唯一号(89C52RC) u8 idata *iptr; u8 code *stcid; u8 IDF; u8 SysId[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //u8 SysId[7]={0xF0,0x02,0x01,0xF4,0x16,0x71,0x3C}; u8 code McuId[7]={0xF0,0x02,0x81,0xF4,0x16,0x31,0x3C}; //F0 02 81 F4 16 31 3C 此数组改成CPU数组 //u8 code McuId[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //F0 02 81 F4 16 31 3C void delay(u16 i) { while(i--); } void main(void) { u8 i,k; { iptr=ID_ADDR_RAM; //从ROM区读取ID号 for (k=0; k<7; k++) //读7个字节 { SysId[k]=*(iptr+k); } } P2=0xfe; if(SysId[0]==McuId[0] && SysId[1]==McuId[1] && SysId[2]==McuId[2] && SysId[3]==McuId[3] && SysId[4]==McuId[4] && SysId[5]==McuId[5] && SysId[6]==McuId[6]) { while(1) { for(i=0;i<7;i++) //将led左移一位 { P2=_crol_(P2,1); delay(50000); //大约延时450ms } for(i=0;i<7;i++) //将led右移一位 { P2=_cror_(P2,1); delay(50000); //大约延时450ms } } } else { while(1) { // P0=SysId[2]; // P0=McuId[2]; P2=0; delay(50000); //大约延时450ms P2=0xFF; delay(50000); //大约延时450ms } } }
我知道做什么了,你看看咋样,智能小车,通用控制板。 首先,主控,用C51或,STM32(两个版本。) 四或六路寻迹模块(外加两路,是扩展使用) WIFI 蓝牙,2.4G无线模块,也可以外加一个485无线模块 四路电机驱动,和两路舵机驱动, 一路超声波。,你看看咋 样,有功能往上加。
看下我的单片机素不素很帅呢, STC下载器,8位WS2812,加上STC15W204S-sop8 哈哈哈,啦啦啦
C语言直接操作指定内存和外部内存(吧主捣乱之4) #include<reg52.h> //#define char signed char typedef unsigned int u16; typedef unsigned char u8; #define Addr_RAM 0x1000 //数值个数开始地址 #define Addr_Number_RAM 0x0030 //正零负数量地址 signed xdata talble[20] _at_(0x1000); signed xdata table[20]={-1,-2,-3,-4,-5,0,0,1,2,3,4,5,6,7,8,9,10,-1,-10,20}; u16 xdata *iptr; u8 idata *iptr1; void main(void) { u8 i,k,l,m; signed j; for (i=0; i<20; i++) { j=(table[i]); if(j>0) {k++; iptr1=Addr_Number_RAM; *iptr1=k; } } for (i=0; i<20; i++) { j=(table[i]); if(j==0) {l++; iptr1=Addr_Number_RAM+1; *iptr1=l; } } for (i=0; i<20; i++) { j=(table[i]); if(j<0) {m++; iptr1=Addr_Number_RAM+2; *iptr1=m; } } while(1); } 编写一段程序,将外部RAM中1000H单元开始的20个带符号数,按照正数、零、负数进行分类统计,将正数、零、负数的个数分别存放到内部RAM的30H、31H、32H单元中。
16路PWM输出(吧主捣乱之3) /************* 功能说明 ************** 使用Timer0模拟16通道PWM驱动程序。 输出为 P1.0 ~ P1.7, P2.0 ~ P2.7, 对应 PWM0 ~ PWM15. 定时器中断频率一般不要超过100KHZ, 留足够的时间给别的程序运行. 本例子使用22.1184MHZ时钟, 25K的中断频率, 250级PWM, 周期为10ms. 中断里处理的时间不超过6us, 占CPU时间大约为15%. ******************************************/ #include <reg52.h> #define MAIN_Fosc 22118400UL //定义主时钟 #define Timer0_Rate 25000 //中断频率 typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sfr AUXR = 0x8E; #define Timer0_Reload (65536UL -(MAIN_Fosc / Timer0_Rate)) //Timer 0 重装值 //************** PWM8 变量和常量以及IO口定义 *************** //******************** 8通道8 bit 软PWM ******************** #define PWM_DUTY_MAX 250 // 0~255 PWM周期, 最大255 #define PWM_ON 1 // 定义占空比的电平, 1 或 0 #define PWM_OFF (!PWM_ON) #define PWM_ALL_ON (0xff * PWM_ON) u8 bdata PWM_temp1,PWM_temp2; //影射一个RAM,可位寻址,输出时同步刷新 sbit P_PWM0 = PWM_temp1^0; // 定义影射RAM每位对应的IO sbit P_PWM1 = PWM_temp1^1; sbit P_PWM2 = PWM_temp1^2; sbit P_PWM3 = PWM_temp1^3; sbit P_PWM4 = PWM_temp1^4; sbit P_PWM5 = PWM_temp1^5; sbit P_PWM6 = PWM_temp1^6; sbit P_PWM7 = PWM_temp1^7; sbit P_PWM8 = PWM_temp2^0; sbit P_PWM9 = PWM_temp2^1; sbit P_PWM10 = PWM_temp2^2; sbit P_PWM11 = PWM_temp2^3; sbit P_PWM12 = PWM_temp2^4; sbit P_PWM13 = PWM_temp2^5; sbit P_PWM14 = PWM_temp2^6; sbit P_PWM15 = PWM_temp2^7; u8 pwm_duty; //周期计数值 u8 pwm[16]; //pwm0~pwm15 为0至15路PWM的宽度值 bit B_1ms; u8 cnt_1ms; u8 cnt_20ms; /**********************************************/ void main(void) { u8 i; AUXR |= (1<<7); // Timer0 set as 1T mode TMOD &= ~(1<<2); // Timer0 set as Timer TMOD &= ~0x03; // Timer0 set as 16 bits Auto Reload TH0 = Timer0_Reload / 256; //Timer0 Load TL0 = Timer0_Reload % 256; ET0 = 1; //Timer0 Interrupt Enable PT0 = 1; //高优先级 TR0 = 1; //Timer0 Run EA = 1; //打开总中断 cnt_1ms = Timer0_Rate / 1000; //1ms计数 cnt_20ms = 20; for(i=0; i<16; i++) pwm[i] = i * 15 + 15; //给PWM一个初值 while(1) { if(B_1ms) //1ms到 { B_1ms = 0; if(--cnt_20ms == 0) //PWM 20ms改变一阶 { cnt_20ms = 20; for(i=0; i<16; i++) pwm[i]++; } } } } /********************** Timer0 1ms中断函数 ************************/ void timer0 (void) interrupt 1 { P1 = PWM_temp1; //影射RAM输出到实际的PWM端口 P2 = PWM_temp2; if(++pwm_duty == PWM_DUTY_MAX) //PWM周期结束,重新开始新的周期 { pwm_duty = 0; PWM_temp1 = PWM_ALL_ON; PWM_temp2 = PWM_ALL_ON; } ACC = pwm_duty; if(ACC == pwm[0]) P_PWM0 = PWM_OFF; //判断PWM占空比是否结束 if(ACC == pwm[1]) P_PWM1 = PWM_OFF; if(ACC == pwm[2]) P_PWM2 = PWM_OFF; if(ACC == pwm[3]) P_PWM3 = PWM_OFF; if(ACC == pwm[4]) P_PWM4 = PWM_OFF; if(ACC == pwm[5]) P_PWM5 = PWM_OFF; if(ACC == pwm[6]) P_PWM6 = PWM_OFF; if(ACC == pwm[7]) P_PWM7 = PWM_OFF; if(ACC == pwm[8]) P_PWM8 = PWM_OFF; if(ACC == pwm[9]) P_PWM9 = PWM_OFF; if(ACC == pwm[10]) P_PWM10 = PWM_OFF; if(ACC == pwm[11]) P_PWM11 = PWM_OFF; if(ACC == pwm[12]) P_PWM12 = PWM_OFF; if(ACC == pwm[13]) P_PWM13 = PWM_OFF; if(ACC == pwm[14]) P_PWM14 = PWM_OFF; if(ACC == pwm[15]) P_PWM15 = PWM_OFF; if(--cnt_1ms == 0) { cnt_1ms = Timer0_Rate / 1000; B_1ms = 1; // 1ms标志 } } 没测试,官方例程
STC自带的EEPRM做的开机次数记录(吧主捣乱之2) //以下程序,是例用STC自带的EEPROM,掉线存储,计录开机次数,以STC89C52RC为例 //按下复位也可以,单片机断电也可以 #include "reg51.h" #include "intrins.h" typedef unsigned int u16; typedef unsigned char u8; typedef unsigned char BYTE; typedef unsigned int WORD; u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71}; /*Declare SFR associated with the IAP */ sfr IAP_DATA = 0xE2; //Flash data register sfr IAP_ADDRH = 0xE3; //Flash address HIGH sfr IAP_ADDRL = 0xE4; //Flash address LOW sfr IAP_CMD = 0xE5; //Flash command register sfr IAP_TRIG = 0xE6; //Flash command trigger sfr IAP_CONTR = 0xE7; //Flash control register /*Define ISP/IAP/EEPROM command*/ #define CMD_IDLE 0 //Stand-By #define CMD_READ 1 //Byte-Read #define CMD_PROGRAM 2 //Byte-Program #define CMD_ERASE 3 //Sector-Erase /*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/ //#define ENABLE_IAP 0x80 //if SYSCLK<40MHz #define ENABLE_IAP 0x81 //if SYSCLK<20MHz //#define ENABLE_IAP x82 //if SYSCLK<10MHz //#define ENABLE_IAP 0x83 //if SYSCLK<5MHz //Start address for STC89C58xx EEPROM #define IAP_ADDRESS 0x02000 //自带EEPROM存储器地址 BYTE dat; //Data buffer void Delay(BYTE n); void delay_1ms(BYTE o); void IapIdle(); BYTE IapReadByte(WORD addr); void IapProgramByte(WORD addr, BYTE dat); void IapEraseSector(WORD addr); void main() { WORD i; //定义变量I为开机次数 P0=0; Delay(2); IapReadByte(IAP_ADDRESS); //开机先读一次地址的数据,以STC89C52RC为例, i=dat; i=i+1; //开机次数加1 if(i==100) //当开机次数大于100,从1开计 {i=0;} IapEraseSector(IAP_ADDRESS); // 在写入数据前先要擦掉这个地址数据 IapProgramByte(IAP_ADDRESS, i); // 写入数据 //P2=i; while (1) { P2=0; //以下是显示部分,根据自己的板改下就可以了 P0=smg[i%10/1]; //没了 delay_1ms(1); P0=0; P2=4; P0=smg[i%100 / 10]; delay_1ms(1); P0=0; } } /*---------------------------- Software delay function ----------------------------*/ void Delay(BYTE n) { WORD x; while (n--) { x = 0; while (++x); } } void delay_1ms(BYTE o) { while(o--); } /*---------------------------- Disable ISP/IAP/EEPROM function Make MCU in a safe state 读写使能 ----------------------------*/ void IapIdle() { IAP_CONTR = 0; //Close IAP function IAP_CMD = 0; //Clear command to standby IAP_TRIG = 0; //Clear trigger register IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area IAP_ADDRL = 0; //Clear IAP address to prevent misuse } /*---------------------------- Read one byte from ISP/IAP/EEPROM area Input: addr (ISP/IAP/EEPROM address) Output:Flash data 从一个字节读一个字节 输入:地址(ISP/IAP / EEPROM的地址) 输出:闪存数据 ----------------------------*/ BYTE IapReadByte(WORD addr) { IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high IAP_TRIG = 0x46; //Send trigger command1 (0x46) IAP_TRIG = 0xb9; //Send trigger command2 (0xb9) _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete dat = IAP_DATA; //Read ISP/IAP/EEPROM data IapIdle(); //Close ISP/IAP/EEPROM function return dat; //Return Flash data } /*---------------------------- Program one byte to ISP/IAP/EEPROM area Input: addr (ISP/IAP/EEPROM address) dat (ISP/IAP/EEPROM data) Output:- 将一个字节编程到 输入:地址(ISP/IAP / EEPROM的地址) 数据(数据) 输出:— ----------------------------*/ void IapProgramByte(WORD addr, BYTE dat) { IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high IAP_DATA = dat; //Write ISP/IAP/EEPROM data IAP_TRIG = 0x46; //Send trigger command1 (0x46) IAP_TRIG = 0xb9; //Send trigger command2 (0xb9) _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete IapIdle(); } /*---------------------------- Erase one sector area Input: addr (ISP/IAP/EEPROM address) Output:- 擦除一个扇区区域 输入:地址(ISP/IAP / EEPROM的地址) 输出:— ----------------------------*/ void IapEraseSector(WORD addr) { IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high IAP_TRIG = 0x46; //Send trigger command1 (0x46) IAP_TRIG = 0xb9; //Send trigger command2 (0xb9) _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete IapIdle(); } 程序稍长,英文注释我没改,懒,,加了一点点中文注释
给吧吧主捣个乱,读STC全球唯一号程序 //此程序是读STC全球唯一号发送到串口 #include <reg51.h> //波特率2400,下载后可以按下复位 typedef unsigned int u16; typedef unsigned char u8; #define ID_ADDR_RAM 0x1F0 //读RAM的8位,只有最后七字节是全球 ID唯一号(STC89C52RC为例,其它型号可以查地址) #define ID_ROM_RAM 0x1FF8 //读ROM的8位,只有最后七字节是全球 ID唯一号(STC89C52RC为例,其它型号可以查地址) u8 idata *iptr; u8 code *stcid; void InitUART(void) { TMOD = 0x20; SCON = 0x50; TH1 = 0xF3; TL1 = TH1; PCON = 0x00; EA = 1; ES = 1; TR1 = 1; } void SendOneByte(unsigned char c) { SBUF = c; while(!TI); TI = 0; } void main(void) { u8 i; InitUART(); { iptr=ID_ADDR_RAM; //从ROM区读取ID号 for (i=0; i<8; i++) //读7个字节 { SendOneByte(*iptr++); //发送ID到串口 // stcid=ID_ROM_RAM+i; //从ROM区读取ID号 // SendOneByte(*stcid); //发送ID到串口 } } while(1); } void UARTInterrupt(void) interrupt 4 { if(RI) { RI = 0; } else TI = 0; } 其它型号,请查ROM地址,在最后七个字节位置, 其它型号,请查RAM地址,在最后七个字节位置,(下载时要钩选,在代码后添加ID号)
给大家介绍一个电路玩!~非原创 可以得到一个闪灯的效果,D880,,,可以用8050代替。
回贴程序!~ #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P0^1; sbit LSB=P0^2; sbit LSC=P0^3; sbit LSD=P0^4; sbit LSE=P0^5; sbit LSF=P0^6; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 u8 code smgduan1[]={0x5b,0x3f,0x06,0x7f,0x3f,0x4f};//显示0~F的值 void delay(u16 i) { while(i--); } void DigDisplay() { u8 i; for(i=0;i<6;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=1;LSC=1;LSD=1;LSE=1;LSF=1; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=1;LSD=1;LSE=1;LSF=1; break;//显示第1位 case(2): LSA=1;LSB=1;LSC=0;LSD=1;LSE=1;LSF=1; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=1;LSD=0;LSE=1;LSF=1; break;//显示第3位 case(4): LSA=1;LSB=1;LSC=1;LSD=1;LSE=0;LSF=1; break;//显示第4位 case(5): LSA=1;LSB=1;LSC=1;LSD=1;LSE=1;LSF=0;; break;//显示第5位 } P1=smgduan1[i];//发送段码 delay(100); //间隔一段时间扫描 P1=0x00;//消隐 } } void main() { while(1) { DigDisplay(); //数码管显示函数 } }
欢迎新老朋友入坑 Q群 711621263 欢迎新老单片机爱好都入坑C51 STM32 技术交流,闲聊请绕道!~谢谢合作
回贴程序 /******************************************************************************* * 实 验 名 : 步进电机实验 * 使用的IO : 电机用P1口,键盘使用P3.0、P3.1、P3.2、P3.3 * 实验效果 : 按下K1键,顺时针转,按下K2键,逆时针转,按下K3键,低速, *按下K4键,高速。 * 注 意 :由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验 *效果,最好把红外线先取下来。 *******************************************************************************/ #include "reg52.h" //电机IO #define GPIO_MOTOR P1 //sbit F1 = P1^0; //sbit F2 = P1^1; //sbit F3 = P1^2; //sbit F4 = P1^3; //按键IO sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3; unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序 unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转顺序 unsigned char Direction,Speed; void Delay(unsigned int t); void Motor(); /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main(void) { unsigned char i; Speed=30; while(1) { if(K1==0) //检测按键K1是否按下 { Delay(1); //消除抖动 if(K1==0) { Direction=1; } while((i<200)&&(K1==0)) //检测按键是否松开 { Delay(1); i++; } i=0; } if(K2==0) //检测按键K1是否按下 { Delay(1); //消除抖动 if(K2==0) { Direction=2; } while((i<200)&&(K2==0)) //检测按键是否松开 { Delay(1); i++; } i=0; } if(K3==0) //检测按键K1是否按下 { Delay(1); //消除抖动 if(K3==0) { Speed=13; } while((i<200)&&(K3==0)) //检测按键是否松开 { Delay(1); i++; } i=0; } if(K4==0) //检测按键K1是否按下 { Delay(1); //消除抖动 if(K4==0) { Speed=40; } while((i<200)&&(K4==0)) //检测按键是否松开 { Delay(1); i++; } i=0; } Motor(); } } /******************************************************************************* * 函 数 名 : Motor * 函数功能 : 电机旋转函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Motor() { unsigned char i; for(i=0;i<8;i++) { if(Direction==1) GPIO_MOTOR = FFW[i]&0x1f; //取数据 if(Direction==2) GPIO_MOTOR = FFZ[i]&0x1f; Delay(Speed); //调节转速 } } /******************************************************************************* * 函 数 名 : Delay * 函数功能 : 延时 * 输 入 : t * 输 出 : 无 *******************************************************************************/ void Delay(unsigned int t) { unsigned int k; while(t--) { for(k=0; k<80; k++) { } } }
单片机技术交流 单片机技术交流Q群,聊天的请绕道。711621263
求助,有没有懂TS1070人机界面的高手 我有N多个问题要问,如通信电缆要怎么连,通信协议等等。
1
下一页