0基础快速入门C语言单片机编程

  qt的安装路径必须是全英文的,其余默认便可

  第一步:点击New project或者在编辑中项目中选择新建项目,或者点击左上角的文件选择新建文件或项目

  第二步:在弹出的对话框中选择Non-QT project........

  

0基础快速入门C语言单片机编程

  第三部:设置工程名称及路径(均为英文,名称只能使用数字、字母、下划线)

  第四步:按要求下一步(默认)

  第五步:工程创建好后,会显示工程的目录结构及基本代码

  

0基础快速入门C语言单片机编程

  #include //头文件包含,必须要有

  int main(int arg, char *argv[]) //C语言中只能有一个主函数main(),且从这里开始(程序的入口函数)

  {

  printf("hellow world!

  ");

  return 0;

  }

  点击左下角绿色三角符号或者Ctrl+r即可编译运行

  关键字就是C语言已经定义好的名字,直接拿过来使用,不需要定义

  用于定义变量或者类型,定义变量的语法结构:类型 + 变量名

  char short long int float double struct union enum signed unsigned void

  

  char 字符型,定义字符型变量 ,占一个字节char='1'; //正确

  char='1234'; //错误

  // 字符用单引号括起来且里面只有一个字符,'1234'里面有多个,属于字符串,应该用双引号,且不能用char定义有符号:-2^7~2^7-1无符号:0~2^8-1short 短整型 使用short定义的变量是超短整型,占两个字节有符号:-2^15~2^15-1无符号:0~2^16-1int 整型 用int 定义的变量是整型变量,在32位系统中占4个字节long 长整型 用long定义的变量是长整型,在32位操作系统中占4个字节,在64位系统中占8个字节float 但浮点数(实数) 用float定义的变量是单浮点数,占4个字节double 双精度浮点数 用double定义的变量是双精度浮点数,占8个字节signed 有符号(正负)的意思 在定义char,整型(int,short,long)数据的时候用signed修饰,代表定义的数据 是有符号的,可以保存正数,也可以保存负数例:signed int a=10;注意:默认情况下signed可以省略不写,即 int a=10; 默认a就是有符号类型的数据unsigned 无符号的意思,在定义char,整型(int,long ,short)数据时用unsigned修饰,代表数据是无符号类型只能保存0和正数#include

  //测试基本数据类型所占内存的大小

  int main()

  {

  char ;

  long b;

  int c;

  short d;

  float e;

  double f;

  //sizeof():是一个运算符,可以获取数据类型所占用内存的大小

  printf("%d

  ",sizeof(a));

  printf("%d

  ",sizeof(b));

  printf("%d

  ",sizeof(c));

  printf("%d

  ",sizeof(d));

  printf("%d

  ",sizeof(e));

  printf("%d

  ",sizeof(f));

  return 0;

  }

  register static const auto extem

  register 寄存器变量,用register修饰的变量是寄存器变量注意:定义的变量不一定真的存放在寄存器中CPU读取数据是去寄存器中拿数据比去内存中拿数据更快因为寄存器比较宝贵,所以不能定义寄存器数组register只能修饰字符型及整型的,不能修饰 浮点型因为register修饰的变量可能存放在寄存器中不存放在内存中,所以不能对寄存器变量取地址,因为只有在内存中的数据才有地址static 是静态的意思static可以修饰全局变量、局部变量、函数使用static修饰的变量,此变量保存在内存的静态区中const 常量的意思用const修饰的变量是只读的,即不能修改它的值const int a=101; //在定义a的时候用const修饰,并赋初值为101,此后不能再给a赋初值了,const可以修饰指针auto auto int a ; 等价于 Int a; //现在基本不用extern 是外部的意思,一般用于函数和全局变量的声明

  if else break continue for while do switch case goto default

  条件控制语句:if语句:if elseswitch语句:switch case default循环控制语句:for while do goto辅助控制语句:break continue

  sizeof typedef volatile

  sizeof 用来测变量、数组的占用存储空间的大小(字节数)int a=10;

  int num;

  num=sizeof(a);

  typedef 重命名相关的关键字unsigned short int a=10;U16关键字,作用是给一个已有的类型重新定义一个类型名,并没有创建一个新的类型typedef起别名的方法:用想定义的类型先定义一个变量short int a;用新的类型名替代变量名short int INT16;在最前面加上typedeftypedef short int INT16;就可以用新的类型来定义变量了INT16 b 和short int b;是一个效果volatile 易改变的意思即告诉CPU每次用volatile时重新去内存中取最新的值。

iqifenxia
关注 关注
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于单片机C语言编程基础知识(初学注意)
BenZeph的专栏
11-13 8066
80C51上的C语言编程 C51的特色:     (1)学习过C语言的同学在对单片机有了基本了解之后,就可以开始试着写一两个基于单片机C语言的程序了。C51语言继承了ANSI C 的绝大部分的特性,基本的语法相同,同学们上手会比较快。但是,由于C51语言是对硬件进行控制的编程语言,其本身又在硬件结构上有所扩展以增强C语言对硬件的控制,如关键字sbit,data,code等(后面会讲他们是做什么的)。     (2)因为单片机不是我们平时用的计算机,他的英文名为MCU(微控制器),特点体现在这个“微”字。因
51单片机C语言编程基础及实例
04-19
文库帮手网 www.365xueyuan.com 免费帮下载 百度文库积分 资料 本文由pengliuhua2005贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 51 单片机设计跑马灯的程序用(c 语言)编写 P1 口接 8 个发光二极管共阳,烧入下面程序 #include unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } void main(void) { while(1) { temp=0xfe; P1=temp; delay(); for(i=1;i<8;i++) { a=temp(8-i); P1=a|b; delay(); } for(i=1;i>i; b=temp<= 4000 ){ us250 = 0; if( ++s1 >= 10 ){ s1 = 0; if( ++s10 >= 6 ) s10 = 0; if( key10 == 1 ){ //等松键 if( P3.2 == 1 ) key10=0; } //未按键 37. else{ 38. 39. 40. 41. if( P3.2 == 0 ){ key10 = 1; if( ++s10 >= 6 ) s10 = 0; break; //结束“循环 2”,修改显示 42. 43. 44. 45. 46. } } //按个位键处理 P3.3 = 1; //P3.3 作为输入,先要输出高电平 if( key1 == 1 ) //等松键 47. { if( P3.3 == 1 ) key1=0; } 48. 49. 50. 51. 52. 53. 54. 55. } } //循环 2’end }//循环 1’end } else { //未按键 if( P3.3 == 0 ){ key1 = 1; if( ++s1 >= 10 ) s1 = 0; break; //结束“循环 2”,修改显示 56. }//main’end 第三节: 第三节:十字路口交通灯 如果一个单位时间为 1 秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作: 60 个单位时间,南北红,东西绿;λ 10 个单位时间,南北红,东西黄;λ 60 个单位时间,南北绿,东西红;λ 10 个单位时间,南北黄,东西红;λ 解:用 P1 端口的 6 个引脚控制交通灯,高电平灯亮,低电平灯灭。 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. #include //sbit 用来定义一个符号位地址,方便编程,提高可读性,和可移植性 sbit SNRed =P1^0; //南北方向红灯 //南北方向黄灯 //南北方向绿灯 //东西方向红灯 //东西方向黄灯 //东西方向绿灯 sbit SNYellow =P1^1; sbit SNGreen =P1^2; sbit EWRed =P1^3; sbit EWYellow =P1^4; sbit EWGreen =P1^5; /* 用软件产生延时一个单位时间 */ 10. void Delay1Unit( void ) 11. { 12. 13. 14. unsigned int i, j; for( i=0; i<1000; i++ ) for( j<0; j= 8 ) i=0; 12. } 13. void Timer0IntRoute( void ) interrupt 1 14. { 15. 16. TL0 = -1000; //由于 TL0 只有 8bits,所以将(-1000)低 8 位赋给 TL0 TH0 = (-1000)>>8; //取(-1000)的高 8 位赋给 TH0,重新定时 1ms 17. 18. } DisplayBrush(); 19. void Timer0Init( void ) 20. { TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器 T0,工作方式 1 21. 22. 23. 24. 25. } 26. void Display( unsigned char index, unsigned char dataValue ){ DisBuf[ inde x ] = dataValue; } 27. void main( void ) 28. { 29. unsigned char i; 30. for( i=0; i>8; TR0 = 1; ET0 = 1; //允许 T0 开始计数 //允许 T0 计数溢出时产生中断请求 第五节:键盘驱动 第五节: 指提供一些函数给任务调用,获取按键信息,或读取按键值。 定义一个头文档 ,描述可用函数,如下: 代码 1. 2. 3. 4. 5. 6. 7. #ifndef _KEY_H_ #define _KEY_H_ //防止重复引用该文档,如果没有定义过符号 _KEY_H_,则编译下面语句 防止重复引用该文档, , 防止重复引用该文档 //只要引用过一次,即 #include ,则定义符号 _KEY_H_ 只要引用过一次, 只要引用过一次 , unsigned char keyHit( void ); //如果按键,则返回非0,否则返回0 unsigned char keyGet( void ); //读取按键值,如果没有按键则等待到按键为止 void keyPut( unsigned char ucKeyVal ); //保存按键值 ucKeyVal 到按键缓冲队列末 void keyBack( unsigned char ucKeyVal ); //退回键值 ucKeyVal 到按键缓冲队列首 #endif 定义函数体文档 KEY.C,如下: 代码 1. 2. 3. #include “key.h” #define KeyBufSize 16 //定义按键缓冲队列字节数 定义按键缓冲队列字节数 unsigned char KeyBuf[ KeyBufSize ]; //定义一个无符号字符数组作为按键缓冲队列。该队列为 先进 4. 5. 6. 7. 8. 9. 10. //先出,循环存取,下标从0到 KeyBufSize-1 unsigned char KeyBufWp=0; //作为数组下标变量,记录存入位置 unsigned char KeyBufRp=0; //作为数组下标变量,记录读出位置 //如果存入位置与读出位置相同,则表明队列中无按键数据 unsigned char keyHit( void ) { if( KeyBufWp == KeyBufRp ) return( 0 ); else return( 1 ); } 11. unsigned char keyGet( void ) 12. { unsigned char retVal; //暂存读出键值 13. while( keyHit()==0 ); //等待按键,因为函数 keyHit()的返回值为 0 表示无按键 14. retVal = KeyBuf[ KeyBufRp ]; //从数组中读出键值 15. if( ++KeyBufRp >= KeyBufSize ) KeyBufRp=0; //读位置加1, 超出队列则循环回初始位置 16. 17. } 18. 19. void keyPut( unsigned char ucKeyVal ) 20. { KeyBuf[ KeyBufWp ] = ucKeyVal; //键值存入数组 21. if( ++KeyBufWp >= KeyBufSize ) KeyBufWp=0; //存入位置加1, 超出队列则循环回初始位置 return( retVal ); 22. } 23. 由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。 就如取错了信件,有必要退回一样 24. void keyBack( unsigned char ucKeyVal ) 25. { 26. 27. 如果 KeyBufRp=0; 减 1 后则为 FFH,大于 KeyBufSize,即从数组头退回到数组尾。或者由于干扰使得 KeyBufRp 超出队列位置,也要调整回到正常位置, 28. */ 29. if( --KeyBufRp >= KeyBufSize ) KeyBufRp=KeyBufSize-1; 30. KeyBuf[ KeyBufRp ] = ucKeyVal; //回存键值 31. } 下面渐进讲解键盘物理层的驱动。 电路共同点:P2 端口接一共阴数码管,共阴极接 GND,P2.0 接 a 段、P2.1 接 b 段、…、P2.7 接 h 段。 软件共同点:code unsigned char Seg7Code[10] 是七段数码管共阴编码表。 Code unsigned char Seg7Code[16]= // 0 1 2 3 4 5 6 7 8 9 A b C d E F {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; 例一:P1.0 接一按键到 GND,键编号为‘6’,显示按键。 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. #include #include “KEY.H” void main( void ) { P1_0 = 1; //作为输入引脚,必须先输出高电平 while( 1 ) //永远为真,即死循环 { if( P1_0 == 0 ) //如果按键,则为低电平 { keyPut( 6 ); //保存按键编号值为按键队列 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键 } 10. if( keyHit() != 0 ) //如果队列中有按键 11. P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上 12. 13. } } 例二:在例一中考虑按键 20ms 抖动问题。 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. #include #include “KEY.H” void main( void ) { P1_0 = 1; //作为输入引脚,必须先输出高电平 while( 1 ) //永远为真,即死循环 { if( P1_0 == 0 ) //如果按键,则为低电平 { delay20ms(); //延时 20ms,跳过接下抖动 keyPut( 6 ); //保存按键编号值为按键队列 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键 10. delay20ms(); //延时 20ms,跳过松开抖动 11. } 12. if( keyHit() != 0 ) //如果队列中有按键 13. P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上 14. 15. } } 例三:在例二中考虑干扰问题。即小于 20ms 的负脉冲干扰。 代码 1. 2. 3. 4. 5. 6. #include #include “KEY.H” void main( void ) { P1_0 = 1; //作为输入引脚,必须先输出高电平 while( 1 ) //永远为真,即死循环 { if( P1_0 == 0 ) //如果按键,则为低电平 7. 8. 9. 10. { delay20ms(); //延时 20ms,跳过接下抖动 if( P1_0 == 1 ) continue; //假按键 keyPut( 6 ); //保存按键编号值为按键队列 while( P1_0 == 0 ); //如果一直按着键,则不停地执行该循环,实际是等待松键 11. delay20ms(); //延时 20ms,跳过松开抖动 12. } 13. if( keyHit() != 0 ) //如果队列中有按键 14. P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上 15. 16. } } 例四:状态图编程法。通过 20ms 周期中断,扫描按键。 代码 采用晶体为 12KHz 时,指令周期为 1ms(即主频为 1KHz),这样 T0 工作在定时器方式 2,8 位自动重载。 计数值为 20,即可产生 20ms 的周期性中断,在中断服务程序中实现按键扫描 2. 3. 4. 5. 6. 7. 8. 9. #include #include “KEY.H” void main( void ) { TMOD = (TMOD & 0xf0 ) | 0x02; //不改变 T1 的工作方式,T0 为定时器方式 2 TH0 = -20; TL0=TH0; TR0=1; //计数周期为 20 个主频脉,即 20ms //先软加载一次计数值 //允许 T0 开始计数 //允许 T0 计数溢出时产生中断请求 //允许 CPU 响应中断请求 1. 10. ET0=1; 11. EA=1; 12. while( 1 ) //永远为真,即死循环 13. { 14. if( keyHit() != 0 ) //如果队列中有按键 15. P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上 16. 17. } 18. void timer0int( void ) interrupt 1 //20ms;T0 的中断号为 1 19. { static unsigned char sts=0; 20. P1_0 = 1; //作为输入引脚,必须先输出高电平 } 21. switch( sts ) 22. 23. 24. { case 0: if( P1_0==0 ) sts=1; break; //按键则转入状态 1 case 1: //假按错,或干扰,回状态 0 25. if( P1_0==1 ) sts=0; 26. else{ sts=2; keyPut( 6 ); } //确实按键,键值入队列,并转状态 2 27. break; 28. case 2: if( P1_0==1 ) sts=3; break; //如果松键,则转状态 3 29. 30. 31. 32. 33. } } case 3: if( P1_0==0 ) sts=2; else sts=0; //假松键,回状态 2 //真松键,回状态 0,等待下一次按键过程 例五:状态图编程法。 代码 如果采用晶体为 12MHz 时,指令周期为 1us(即主频为 1MHz),要产生 20ms 左右的计时,则计数值达到 20000,T0 工作必须为定时器方式 1,16 位非自动重载,即可产生 20ms 的周期性中断,在中断服务程序中 实现按键扫描 2. 3. 4. 5. 6. 7. 8. 9. #include #include “KEY.H” void main( void ) { TMOD = (TMOD & 0xf0 ) | 0x01; //不改变 T1 的工作方式,T0 为定时器方式 1 TL0 = -20000; TH0 = (-20000)>>8; TR0=1; //计数周期为 20000 个主频脉,自动取低 8 位 //右移 8 位,实际上是取高 8 位 1. //允许 T0 开始计数 //允许 T0 计数溢出时产生中断请求 //允许 CPU 响应中断请求 10. ET0=1; 11. EA=1; 12. while( 1 ) //永远为真,即死循环 13. { 14. if( keyHit() != 0 ) //如果队列中有按键 15. P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上 16. 17. } 18. void timer0int( void ) interrupt 1 //20ms;T0 的中断号为 1 19. { static unsigned char sts=0; 20. TL0 = -20000; 21. TH0 = (-20000)>>8; 22. P1_0 = 1; //方式 1 为软件重载 //右移 8 位,实际上是取高 8 位 } //作为输入引脚,必须先输出高电平 23. switch( sts ) 24. 25. 26. { case 0: if( P1_0==0 ) sts=1; break; //按键则转入状态 1 case 1: //假按错,或干扰,回状态 0 27. if( P1_0==1 ) sts=0; 28. else{ sts=2; keyPut( 6 ); } //确实按键,键值入队列,并转状态 2 29. break; 30. 31. 32. 33. case 2: if( P1_0==1 ) sts=3; break; //如果松键,则转状态 3 case 3: if( P1_0==0 ) sts=2; else sts=0; //假松键,回状态 2 //真松键,回状态 0,等待下一次按键过程 34. 35. } } 例六:4X4 按键。 代码 由 P1 端口的高 4 位和低 4 位构成 4X4 的矩阵键盘, 本程序只认为单键操作为合法, 同时按多键时无效。 这样下面的 X,Y 的合法值为 0x7, 0xb, 0xd, 0xe, 0xf,通过表 keyCode 影射变换可得按键值 1. 2. 3. 4. 5. 6. 7. 8. #include #include “KEY.H” unsigned char keyScan( void ) //返回 0 表示无按键,或无效按键,其它值为按键编码值 { code unsigned char keyCode[16]= /0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0 xF 9. { 0, }; 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 3, 4, 0 10. unsigned char x, y, retVal; 11. P1=0x0f; 12. x=P1&0x0f; 13. P1=0xf0; //低四位输入,高四位输出 0 //P1 输入后,清高四位,作为 X 值 //高四位输入,低四位输出 0 14. y=(P1 >> 4) & 0x0f; //P1 输入后移位到低四位,并清高四位,作为 Y 值 15. retVal = keyCode[x]*4 + keyCode[y]; //根据本公式倒算按键编码 16. if( retVal==0 ) return(0); else return( retVal-4 ); 17. } 18. //比如按键‘1’,得 X=0x7,Y=0x7,算得 retVal= 5,所以返回函数值 1。 19. //双如按键‘7’,得 X=0xb,Y=0xd,算得 retVal=11,所以返回函数值 7。 20. void main( void ) 21. { 22. TMOD = (TMOD & 0xf0 ) | 0x01; //不改变 T1 的工作方式,T0 为定时器方式 1 23. TL0 = -20000; 24. TH0 = (-20000)>>8; 25. TR0=1; 26. ET0=1; 27. EA=1; //计数周期为 20000 个主频脉,自动取低 8 位 //右移 8 位,实际上是取高 8 位 //允许 T0 开始计数 //允许 T0 计数溢出时产生中断请求 //允许 CPU 响应中断请求 28. while( 1 ) //永远为真,即死循环 29. { 30. if( keyHit() != 0 ) //如果队列中有按键 31. P2=Seg7Code[ keyGet() ]; //从队列中取出按键值,并显示在数码管上 32. 33. } 34. void timer0int( void ) interrupt 1 //20ms;T0 的中断号为 1 } 35. { static unsigned char sts=0; 36. TL0 = -20000; 37. TH0 = (-20000)>>8; 38. P1_0 = 1; //方式 1 为软件重载 //右移 8 位,实际上是取高 8 位 //作为输入引脚,必须先输出高电平 39. switch( sts ) 40. 41. 42. { case 0: if( keyScan()!=0 ) sts=1; break; //按键则转入状态 1 case 1: //假按错,或干扰,回状态 0 43. if( keyScan()==0 ) sts=0; 44. else{ sts=2; keyPut( keyScan() ); } //确实按键,键值入队列,并转状态 2 45. break; 46. 47. 48. 49. 50. 51. } } case 2: if(keyScan()==0 ) sts=3; break; //如果松键,则转状态 3 case 3: if( keyScan()!=0 ) sts=2; else sts=0; //假松键,回状态 2 //真松键,回状态 0,等待下一次按键过程 第六节: 第六节:低频频率计 实例目的:学时定时器、计数器、中断应用 说明:选用 24MHz 的晶体,主频可达 2MHz。用 T1 产生 100us 的时标,T0 作信号脉冲计数器。假设 晶体频率没有误差,而且稳定不变(实际上可达万分之一);被测信号是周期性矩形波(正负脉冲宽 度都不能小于 0.5us),频率小于 1MHz,大于 1Hz。要求测量时标 1S,测量精度为 0.1%。 解:从测量精度要求来看,当频率超过 1KHz 时,可采用 1S 时标内计数信号脉冲个数来测量信号频, 而信号频率低于 1KHz 时,可以通过测量信号的周期来求出信号频率。两种方法自动转换。 对于低于 1KHz 的信号,信号周期最小为 1ms,也就是说超过 1000us,而我们用的定时器计时脉冲周 期为 0.5us,如果定时多计或少计一个脉冲,误差为 1us,所以相对误差为 1us/1000us=0.1%。信号 周期越大,即信号频率越低,相对误差就越小。 从上面描述来看,当信号频率超过 1KHz 后,信号周期就少于 1000us,显然采用上面的测量方法,不 能达到测量精度要求,这时我们采用 1S 单位时间计数信号的脉冲个数,最少能计到 1000 个脉冲,由 于信号频率不超过 1MHz,而我们定时脉冲为 2MHz,最差多计或少计一个信号脉冲,这样相对误差为 1/1000,可见信号频率越高,相对误差越小。 信号除输入到 T1(P3.5)外,还输入到 INT1(P3.3)。 代码 //对 100us 时间间隔单位计数,即有多少个 100us。 1. 2. 3. 4. 5. 6. 7. unsigned int us100; unsigned char Second; unsigned int K64; unsigned char oldT0; //对 64K 单位计数,即有多少个 64K unsigned int oldus, oldK64, oldT1; unsigned long fcy; bit HighLow=1; //存放频率值,单位为 Hz //1:表示信号超过 1KHz;0:表示信号低于 1KHz。 8. 9. 10. void InitialHigh( void ) { IE=0; IP=0; HighLow=1; 11. TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; PX0=1; T0=1; 12. 13. 14. 15. 16. 17. } 18. void InitialLow( void ) 19. { 20. IE=0; IP=0; HighLow=0; TMOD = (TMOD & 0x0f) | 0x50; TH1=0; TL1=0; T1=1; ET1=1; Us100=0; Second=0; K64=0; oldK64=0; oldT1=0; TCON |= 0x50; EA = 1; //同时置 TR0=1; TR1=1; 同时置 21. TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; ET0=1; TR0=1; 22. 23. 24. 25. 26. } 27. void T0intr( void ) interrupt 1 28. { if( HighLow==0 ) ++us100; 29. else 30. if( ++us100 >= 10000 ) 31. { unsigned int tmp1, tmp2; INT1 = 1; IT1=1; EX1=1; Us100=0; Second=0; K64=0; oldK64=0; oldT1=0; EA = 1; 32. TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1; 33. fcy=((tmp2-oldK64)<<16) + (tmp1-oldT1); 34. oldK64=tmp1; oldT1=tmp2; 35. Second++; 36. us100=0; 37. } 38. } 39. void T1intr( void ) interrupt 3 { ++K64; } 40. void X1intr( void ) interrupt 2 41. { static unsigned char sts=0; 42. switch( sts ) 43. { 44. case 0: sts = 1; break; 45. case 1: oldT0=TL0; oldus=us100; sts=2; break; 46. case 2: 47. { 48. 49. 50. 51. 52. } 53. 54. 55. Sts = 0; break; } unsigned char tmp1, tmp2; TR0=0; tmp1=TL0; tmp2=us100; TR0=1; fcy = 1000000L/( (tmp2-oldus)*100L + (256-tmp1)/2 ); Second ++; 56. } 57. void main( void ) 58. { 59. if( HighLow==1) InitialHigh(); else InitialLow(); 60. 61. While(1) { 62. if( Second != 0 ) 63. { 64. Second = 0; 65. //display fcy 引用前面的数码管驱动程序, 引用前面的数码管驱动程序,注意下面对 T0 中断服务程序的修改 66. { unsigned char i; 67. 68. } 69. if( HighLow==1 ) 70. if( fcy1000L ){ InitalHigh();} for( i=0; i= 10000 ) 83. { unsigned int tmp1, tmp2; 84. TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1; 85. fcy=((tmp2-oldK64)<= 10 ){ ms=0; DisplayBrush(); } //1ms 数码管刷新 第七节: 第七节:电子表 单键可调电子表:主要学习编程方法。 外部中断应用,中断嵌 解:电子表分为工作状态和调整状态。平时为工作状态,按键不足一秒,接键为换屏‘S’。按键超过一 秒移位则进入调整状态‘C’,而且调整光标在秒个位开始。调整状态时,按键不足一秒为光标移动‘M’, 超过一秒则为调整读数,每 0.5 秒加一‘A’,直到松键;如果 10 秒无按键则自动回到工作状态‘W’。 如果有年、月、日、时、分、秒。四联数码管可分三屏显示,显示格式为“年月.”、“日.时.”、“分.秒”, 从小数点的位置来区分显示内容。(月份的十位数也可以用“-”和“-1”表示)。 代码 1. 2. 3. enum status = { Work, Change, Add, Move, Screen } //状态牧举 //计时和调整都是对下面时间数组 Time 进行修改 unsigned char Time[12]={0,4, 0,6, 1,0, 0,8, 4,5, 3,2}; //04 年 06 月 10 日 08 时 45 分 32 秒 4. 5. 6. 7. unsigned char cursor = 12; //指向秒个位,=0 时无光标 unsigned char YmDhMs = 3; //指向“分秒”显示 ,=0 时无屏显 static unsigned char sts = Work; 如果 cursor 不为 0,装入 DisBuf 的对应数位,按 0.2 秒周期闪烁,即设一个 0.1 秒计数器 S01,S01 为奇数时灭,S01 为偶数时亮。 8. 9. 小数点显示与 YmDhMs 变量相关。 */ 10. void DisScan( void ) //动态刷新显示时调用。没编完,针对共阴数码管,只给出控控制算法 11. { 12. //DisBuf 每个显示数据的高四位为标志,最高位 D7 为负号,D6 为小数点,D5 为闪烁 13. unsigned char tmp; 14. 15. 16. 17. 18. 19. } 20. void Display( void ) 21. { 22. if( cursor != 0 ){ YmDhMs=(cursor+3)/4; } //1..4=1; 5..8=2; 9..12=3 //根据状态进行显示 tmp = Seg7Code[?x & 0x1f ]; //设?x 为显示数据,高 3 位为控制位,将低 5 位变为七段码 if( ?x & 0x40 ) tmp |= 0x80; //添加小数点 if( ?x & 0x20 ){ if( S01 & 0x01 ) tmp=0; } //闪烁,S01 奇数时不亮 //这里没有处理负号位 //将 tmp 送出显示,并控制对应数码管动作显示 23. for( i=(YmDhMs-1)*4; i ‘9’) Dat=‘0’; } 二、 在上题的基础上,改为 2400bps,循环发送小写字母‘a’到‘z’,然后是大写字母‘A’到‘Z’。 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. #include void main( void ) { TMOD = (TMOD & 0x0F) | 0x20; TH1 = -96; //注意不用倍频方式 PCON &= 0x7F; //SMOD = 0 TR1 = 1; SCON = 0x42; while( 1 ) { if( TI==1 ) { static unsigned char Dat=‘a’; SBUF = Dat; TI = 0; //If( ++Dat > ‘9’) Dat=‘0’; ++Dat; if( Dat == (‘z’+1) ) if( Dat == (‘Z’+1) ) } } Dat=‘A’; Dat=‘a’; 22. } 上述改变值时,也可以再设一变量表示当前的大小写状态,比如写成如下方式: 代码 1. 2. 3. 4. ++Dat; { static unsigned char Caps=1; if( Caps != 0 ) 5. 6. 7. 8. } if( Dat>‘Z’){ Dat=‘a’; Caps=0; } else if( Dat>‘z’){ Dat=‘A’; Caps=1; } 如下写法有错误:因为小 b 比大 Z 的编码值大,所以 Dat 总是‘a’ 代码 1. 2. 3. ++Dat; if( Dat>‘Z’){ Dat=‘a’} else if( Dat>‘z’){ Dat=‘A’} 三、 有 A 和 B 两台单片机,晶体频率分别为 13MHz 和 14MHz,在容易编程的条件下,以最快的速度进 行双工串行通信,A 给 B 循环发送大写字母从‘A’到‘Z’,B 给 A 循环发送小写字母从‘a’到‘z’,双方都用 中断方式进行收发。 解:由于晶体频率不同,又不成 2 倍关系,所以只有通信方式 1 和方式 3,由于方式 3 的帧比方式 1 多一位,显然方式 3 的有效数据(9/11)比方式 1(8/10)高,但要用方式 3 的第 9 位 TB8 来发送数 据,编程难度较大,这里方式 1 较容易编程。 在计算最高速率时,由于单方程,双未知数,又不知道波特率为多少,所以要综合各方面的条件,估 算出 A 和 B 的分频常数,分别为-13 和-14 时,速率不但相同,且为最大值。如下给出 A 机的程序: 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. #include void main( void ) { TMOD = (TMOD & 0x0F) | 0x20; TH1 = -13; //注意用倍频方式 PCON |= 0x80; //SMOD = 1 TR1 = 1; SCON = 0x52; //REN = 1 ES = 1; EA = 1; while( 1 ); 12. } 13. void RS232_intr( void ) interrupt 4 14. { 15. 16. 17. 18. 19. 20. unsigned char rDat; if( RI == 1 ){ RI=0; rDat=SBUF; } if( TI==1 ) { static unsigned char tDat=‘a’; SBUF = tDat; //注意 RI 和 TI 任一位变为 1 都中断 21. 22. 23. 24. } } TI = 0; If( ++Dat > ‘z’) Dat=‘a’; 四、 多机通位 在方式 2 和方式 3,SM2 只对接收有影 响,当 SM2=1 时,只接收第 9 位等于 1 的帧(伪地址帧), 而 SM2=0 时,第 9 位不影响接收。λ 多机通信中,地址的确认与本机程序有关,所以可以实现点对点、点对组、以及通播方式的通信。λ 如果收发共用一总线,任何时刻只有一个发送源能占用总线发送数据,否则发生冲突。由此可构造无 竞争的令牌网;或者多主竞争总线网。λ 1
单片机C语言入门
热门推荐
weixin_52013159的博客
09-18 1万+
将CPU芯片、存储器芯片、I/O接口芯片和简单的I/O设备(小键盘、LED显示器)等装配在一块印刷电路板上,再配上监控程序(固化在ROM中),就构成了一台单片微型计算机(简称单片机)。由于单片机在使用时,通常处于测控系统的核心地位并嵌入其中,因而,国际上通常把单片机称为嵌入式控制器( Embedded MicroController Unit, EMCU )或微控制器( MicroContoller Unit,MCU)。而在我国,大部分工程技术人员则习惯使用“单片机”这一名称。
单片机编程入门:从基础知识到实战应用
最新发布
技术研究中心
08-04 604
单片机编程涉及多个方面,从基本的编程语言和工具使用,到实际应用中的通信和数据采样。通过不断的实践和学习,可以在单片机领域取得更大的成就。单片机(Microcontroller,简称MCU)是一种集成了计算机处理器、内存和输入/输出外设的微型计算机系统。大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨单片机编程,从基础知识到实战应用,帮助你快速上手单片机开发。使用仿真工具可以模拟单片机的运行,帮助调试程序中的问题。模拟信号采样是单片机应用中的常见功能。
单片机C语言基础
嵌入式分享
02-13 6048
介绍一下单片机开发常见C使用
单片机编程语言——C语言(1)
weixin_51914919的博客
03-29 2471
C语言结构注释变量定义与赋值数据类型强制转换 前言:我们都知道单片机要对其写指令、编程等就需要一种编程语言。在众多的编程语言中不可否认的是c语言是最适合成为单片机编程语言的。我们在这里分享一下c语言的知识点。 结构 一般来说c语言的结构,一般都是包括若干个头文件(以#include" xxx ")和函数组合而成的。例: #include "stdio.h" int main(void) { printf("hello wold"); return 0; } 在这里我们看到有两部分#include
单片机编程语言——C语言(2)
weixin_51914919的博客
04-05 2379
C语言关系运算符逻辑运算符if、else if语句 关系运算符 关系运算符主要就是进行逻辑判断,主要就是运用在if、if....else if、while语句中。 注意:>=, <=, ==, !=这种符号之间不能存在空格。 逻辑运算符 逻辑运算符也是和关系运算符一样的进行逻辑判断。一般也是运用在if、if....else if、while语句中。 if、else if语句 这个语法主要是进行逻辑判断用的。 if语句 if(表达式) { ...... } 其含义主要是:当里面的表达式为
51单片机C语言入门_C语言_单片机_51单片机C语言_51单片机_
09-29
本文将深入探讨51单片机C语言结合进行下位机开发的相关知识点,帮助读者从零开始掌握单片机编程。 首先,了解51单片机基础架构至关重要。51系列单片机由Intel公司推出,其内部集成了CPU、存储器、定时器/计数器...
单片机c语言教程,c语言单片机编程教程,C,C++
09-11
单片机C语言教程是入门电子工程领域的重要学习资源,尤其对于初学者而言,它提供了从...通过阅读提供的“单片机c语言教程.PDF”文档,读者可以系统地学习并实践这些知识点,为自己的单片机编程之旅打下坚实基础
51单片机C语言程序设计快速入门_C语言_单片机C语言_学习资料_
10-04
《51单片机C语言程序设计快速入门》是一本专为初学者设计的教程,旨在帮助读者快速掌握使用C语言进行51系列单片机编程基础知识和技能。51单片机是广泛应用的微控制器,而C语言则以其易读性、可移植性和强大的功能...
8051单片机C语言编程入门指导书.rar
04-05
8051单片机是微控制器领域中的经典模型,被广泛应用于电子设备、...通过《8051单片机C语言编程入门指导书》的学习,读者将逐步了解并熟练运用C语言进行8051单片机的程序设计,为后续的嵌入式系统开发打下坚实的基础
51单片机C语言入门教程.rar_51 C 语言_51单片机 C语言_51单片机入门_C语言入门_单片机C语言
07-14
掌握它们的使用方式和配置是单片机编程的关键。 8. **串行通信**:51单片机通常支持UART串行通信,这在设备间通信、数据传输等方面有广泛应用。理解波特率、帧格式和握手协议是进行串行通信编程基础。 9. **模拟...
51单片机C语言编程入门(详讲版).pdf
09-11
51单片机C语言编程入门(详讲版).pdf
很好用的单片机c语言入门教程
05-12
单片机c语言编程100个实例目录1 函数的使用和熟悉 实例3:用单片机控制第一个灯亮 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 实例6:使用P3口流水点亮8位LED 实例7:通过对P3口地址的操作流水点亮8位LED 实例8:用不同数据类型控制灯闪烁时间 实例9:用P0口、P1 口分别显示加法和减法运算结果 实例10:用P0、P1口显示乘法运算结果 实例11:用P1、P0口显示除法运算结果 实例12:用自增运算控制P0口8位LED流水花样 实例13:用P0口显示逻辑"与"运算结果 实例14:用P0口显示条件运算结果 实例15:用P0口显示按位"异或"运算结果 实例16:用P0显示左移运算结果 实例17:"万能逻辑电路"实验 实例18:用右移运算流水点亮P1口8位LED 实例19:用if语句控制P0口8位LED的流水方向 实例20:用swtich语句的控制P0口8位LED的点亮状态 实例21:用for语句控制蜂鸣器鸣笛次数 实例22:用while语句控制LED 实例23:用do-while语句控制P0口8位LED流水点亮 实例24:用字符型数组控制P0口8位LED流水点亮 实例25: 用P0口显示字符串常量 实例26:用P0 口显示指针运算结果 实例27:用指针数组控制P0口8位LED流水点亮 实例28:用数组的指针控制P0 口8 位LED流水点亮 实例29:用P0 、P1口显示整型函数返回值 实例30:用有参函数控制P0口8位LED流水速度 实例31:用数组作函数参数控制流水花样 实例32:用指针作函数参数控制P0口8位LED流水点亮 实例33:用函数型指针控制P1口灯花样 实例34:用指针数组作为函数的参数显示多个字符串 单片机c语言编程100个实例目录2 实例35:字符函数ctype.h应用举例 实例36:内部函数intrins.h应用举例 实例37:标准函数stdlib.h应用举例 实例38:字符串函数string.h应用举例 实例39:宏定义应用举例2 实例40:宏定义应用举例2 实例41:宏定义应用举例3 * 中断、定时器中断、定时器 *中断、定时器*中断、定时器 / 实例42:用定时器T0查询方式P2口8位控制LED闪烁 实例43:用定时器T1查询方式控制单片机发出1KHz音频 实例44:将计数器T0计数的结果送P1口8位LED显示 实例45:用定时器T0的中断控制1位LED闪烁 实例46:用定时器T0的中断实现长时间定时 实例47:用定时器T1中断控制两个LED以不同周期闪烁 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 实例49:用定时器T0的中断实现"渴望"主题曲的播放 实例50-1:输出50个矩形脉冲 实例50-2:计数器T0统计外部脉冲数 实例51-2:定时器T0的模式2测量正脉冲宽度 实例52:用定时器T0控制输出高低宽度不同的矩形波 实例53:用外中断0的中断方式进行数据采集 实例54-1:输出负脉宽为200微秒的方波 实例54-2:测量负脉冲宽度 实例55:方式0控制流水灯循环点亮 实例56-1:数据发送程序 实例56-2:数据接收程序 实例57-1:数据发送程序 实例57-2:数据接收程序 实例58:单片机向PC发送数据 实例59:单片机接收PC发出的数据 *数码管显示*数码管显示 数码管显示数码管显示*/ 实例60:用LED数码显示数字5 实例61:用LED数码显示器循环显示数字0~9 实例62:用数码管慢速动态扫描显示数字"1234" 实例63:用LED数码显示器伪静态显示数字1234 实例64:用数码管显示动态检测结果 实例65:数码秒表设计 实例66:数码时钟设计 实例67:用LED数码管显示计数器T0的计数值 实例68:静态显示数字“59” 单片机c语言编程100个实例目录3 键盘控制*键盘控制* *键盘控制 *键盘控制 */ 实例69:无软件消抖的独立式键盘输入实验 实例70:软件消抖的独立式键盘输入实验 实例71:CPU控制的独立式键盘扫描实验 实例72:定时器中断控制的独立式键盘扫描实验 实例73:独立式键盘控制的4级变速流水灯 实例74:独立式键盘的按键功能扩展:"以一当四" 实例75:独立式键盘调时的数码时钟实验 实例76:独立式键盘控制步进电机实验 实例77:矩阵式键盘按键值的数码管显示实验 //实例78:矩阵式键盘按键音 实例79:简易电子琴 实例80:矩阵式键盘实现的电子密码锁 液晶显示LCD*液晶显示LCD *液晶显示LCD * *液晶显示LCD*液晶显示LCD *液晶显示LCD */ 实例81:用LCD显示字符'A' 实例82:用LCD循环右移显示"Welcome to China" 实例83:用LCD显示适时检测结果 实例84:液晶时钟设计 *一些芯片的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控/ 实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 实例87:对I2C总线上挂接多个AT24C02的读写操作 实例88:基于AT24C02的多机通信 读取程序 实例89:基于AT24C02的多机通信 写入程序 实例90:DS18B20温度检测及其液晶显示 实例91:将数据"0xaa"写入X5045再读出送P1口显示 实例92:将流水灯控制码写入X5045并读出送P1口显示 实例93:对SPI总线上挂接多个X5045的读写操作 实例94:基于ADC0832的数字电压表 实例95:用DAC0832产生锯齿波电压 实例96:用P1口显示红外遥控器的按键值 实例97:用红外遥控器控制继电器 实例98:基于DS1302的日历时钟 实例99:单片机数据发送程序 实例100:电机转速表设计 模拟霍尔脉冲
MCS-51系列单片机C语言编程基础模板
11-15
本源程序是每一个MCS-51系列单片机C语言程序的必备内容,包括程序开始处的说明信息、头文件、SFR定义、子函数、主函数和C语言常用的5大语句(if,while,do while,for,switch)模板。可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。 注意:使用本模板必须熟悉单片机C语言编程
单片机C语言入门自学指南(前期准备)
无际单片机编程
06-21 8359
很多学习单片机的伙伴们刚入手的时候都因为C语言卡壳了,也因此放弃了单片机的学习。 百度“单片机C语言”,一大堆的资料,一阵手忙脚乱,不知道如何筛选适合自己学习的资料,也不知道从何下手。 为了方便伙伴们尽快的掌握单片机C语言知识,今天我就给大家分享一下单片机C语言到底如何入门自学C语言是一种偏向底层的语言,更多的是应用在嵌入式领域,或者操作系统的开发单片机只是C语言应用的一个小分支。 下面,我给大家简单的介绍一下单片机C语言入门前期准备: 1.在某宝上,买个开发...
单片机基础——C语言
国庆的博客
05-21 4998
无论是51、arduino还是stm32,在大学期间常用的单片机都是以C语言基础的,这里列出C语言基础的一些语句函数,希望可以帮助初学者。 目录 一、语言基础 1.1、C语言概述 1.2、C语言语法基础 1.3、C语言的数据类型 1.4 C语言运算符与表达式 二、数据的输入和输出 2.1 字符输入输出函数 2.2 格式输入输出函数 三、选择结构程序设计语句 3.1 if语...
零基础怎么学习学单片机单片机软件编程培训
weixin_34226706的博客
11-13 866
曾经自己也是对电子一窍不通的小白,面对单片机这个陌生的概念,满脑子都是畏惧。自己也是从零基础开始学习的单片机,关于零基础如何学好单片机。意在给零基础单片机的小白一些干货和帮助。一、什么是单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。...
一小时快速入门单片机C语言编程之路
在决定学习单片机编程时,面临的一个关键选择是采用何种编程语言。汇编语言虽能直观地理解单片机的工作细节,但对于初学者来说,理解和编写程序可能会有很大难度。相比之下,C语言,尤其是C51,因其与传统C语言的...
写文章

热门文章

  • Cisco 思科交换机配置Telnet远程连接 24084
  • 旧手机改造成Linux服务器 14740
  • Python画各种有趣的图及源码 13808
  • TCL的file命令 9191
  • 10个最受欢迎的JavaScript图表库,你用过几个? 7944

最新评论

  • 高分文献解读|8+单细胞文章从解读到套路,全部送给你

    christylst: 这是2019年发的表情包

  • Python画各种有趣的图及源码

    2401_86739754: 是不是用成中文了

  • Python画各种有趣的图及源码

    2401_86739754: 是一种颜色的代码

  • Cisco 思科交换机配置Telnet远程连接

    逸如初见: 抱歉,没有看到是给vlan1分配

  • Cisco 思科交换机配置Telnet远程连接

    逸如初见: 交换机怎么能给端口配IP呢?

最新文章

  • java程序员修炼之路线程:中断
  • C#-委托
  • 跟我从零开始学Python:函数的定义
2022年78篇
2021年443篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家韶关工艺玻璃钢卡通雕塑玻璃钢鸟雕塑吉祥物白银户外玻璃钢雕塑玻璃钢人像雕塑品牌伊春玻璃钢雕塑定制价格峨眉山玻璃钢景观雕塑辽宁大型商场创意商业美陈费用辽宁动物玻璃钢造型雕塑制作惠州玻璃钢造型雕塑张家界人物玻璃钢雕塑安装玻璃钢垃圾桶玻璃钢花盆东莞门店玻璃钢雕塑黑龙江环保玻璃钢雕塑哪家便宜贵州玻璃钢雕塑公司哪家好佛像玻璃钢雕塑电话玻璃钢雕塑哪个比较好怀集玻璃钢卡通雕塑玻璃钢雕塑艺术茶几海南玻璃钢雕塑介绍园林玻璃钢雕塑厂家直销乌当区玻璃钢雕塑厂有哪些临平玻璃钢雕塑公司珠海玻璃钢蝴蝶雕塑玻璃钢海洋雕塑找哪家美陈图片 商场高淳商场美陈道具山西动物玻璃钢雕塑定做价格宜春抽象玻璃钢雕塑供应商仿铜玻璃钢雕塑怎么制作吉安玻璃钢雕塑工厂香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化