51单片机C语言编程实例 基础知识:51单片机编程基础 单片机的外部结构: 1. DIP40双列直插; 2. P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3. 电源VCC(PIN40)和地线GND(PIN20); 4. 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5. 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6. 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1. 四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2. 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一个串行通信接口;(SCON,SBUF) 4. 一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 C语言编程基础: 1. 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3. ++var表示对变量var先增一;var—表示对变量后减一。 4. x |= 0x0f;表示为 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。 6. While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。 在某引脚输出低电平的编程方法:(比如P2.7引脚) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 在某引脚输出方波编程方法:(比如P3.1引脚) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 5. { 6. P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC 7. P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND 8. } //由于一直为真,所以不断输出高、低、高、低……,从而形成方波 9. } 将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) ) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { 7. if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC 8. { P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 2 51单片机C语言编程实例 9. else //否则P1.1输入为低电平GND 10. //{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 11. { P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC 12. } //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平 13. } 将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) ) 代码 1. #include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { //取反的方法是异或1,而不取反的方法则是异或0 7. P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出 8. } //由于一直为真,所以不断将P3取反输出到P2 9. } 注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。 第一节:单数码管按键显示 单片机最小系统的硬件原理接线图: 1. 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF 2. 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF 3. 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理 4. 接配置:EA(PIN31)。说明原因。 发光二极的控制:单片机I/O输出 将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K = 0.4mA。只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。 开关双键的输入:输入先输出高 一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。 代码 1. #include <at89x52.h> 2. #define LED P1^1 //用符号LED代替P1_1 3. #define KEY_ON P1^6 //用符号KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符号KEY_OFF代替P1_7 5. void main( void ) //单片机复位后的执行入口,void表示空,无输入参数,无返回值 6. { 7. KEY_ON = 1; //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1 8. KEY_OFF = 1; //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1 9. While( 1 ) //永远为真,所以永远循环执行如下括号内所有语句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭 13. } //松开键后,都不给LED赋值,所以LED保持最后按键状态。 14. //同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态 15. } 数码管的接法和驱动原理 一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。 我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。 以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据
㈡ 《单片机C语言程序设计实训100例——基于8051+Proteus仿真》 第03篇源代码
单片机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:电机转速表设计
模拟霍尔脉冲
http://www.dzkfw.com.cn/myxin/51c_language.chm 单片机c语言一百例子
㈢ 单片机C语言程序设计实训100例:基于AVR+Proteus仿真是AVR什么型号
【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:
main()
{
int i,j,k;
printf("\n");
for(i=1;i<5;i++) /*以下为三重循环*/
for(j=1;j<5;j++)
for (k=1;k<5;k++)
{
if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/
printf("%d,%d,%d\n",i,j,k);
}
}
==============================================================
【程序2】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
2.程序源代码:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d",bonus);
}
==============================================================
【程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:
2.程序源代码:
#include "math.h"
main()
{
long int i,x,y,z;
for (i=1;i<100000;i++)
{ x=sqrt(i+100); /*x为加上100后开方后的结果*/
y=sqrt(i+268); /*y为再加上168后开方后的结果*/
if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
printf("\n%ld\n",i);
}
}
==============================================================
【程序4】
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
2.程序源代码:
main()
{
int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month)/*先计算某月以前月份的总天数*/
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("data error");break;
}
sum=sum+day; /*再加上某天的天数*/
if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/
leap=1;
else
leap=0;
if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf("It is the %dth day.",sum);}
==============================================================
【程序5】
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换, 然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
2.程序源代码:
main()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y)
{t=x;x=y;y=t;} /*交换x,y的值*/
if(x>z)
{t=z;z=x;x=t;}/*交换x,z的值*/
if(y>z)
{t=y;y=z;z=t;}/*交换z,y的值*/
printf("small to big: %d %d %d\n",x,y,z);
}
==============================================================
【程序6】
题目:用*号输出字母C的图案。
1.程序分析:可先用'*'号在纸上写出字母C,再分行输出。
2.程序源代码:
#include "stdio.h"
main()
{
printf("Hello C-world!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}
==============================================================
【程序7】
题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
1.程序分析:字符共有256个。不同字符,图形不一样。
2.程序源代码:
#include "stdio.h"
main()
{
char a=176,b=219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);}
==============================================================
【程序8】
题目:输出9*9口诀。
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
2.程序源代码:
#include "stdio.h"
main()
{
int i,j,result;
printf("\n");
for (i=1;i<10;i++)
{ for(j=1;j<10;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/
}
printf("\n");/*每一行后换行*/
}
}
==============================================================
【程序9】
题目:要求输出国际象棋棋盘。
1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
2.程序源代码:
#include "stdio.h"
main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}
==============================================================
【程序10】
题目:打印楼梯,同时在楼梯上方打印两个笑脸。
1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
2.程序源代码:
#include "stdio.h"
main()
{
int i,j;
printf("\1\1\n");/*输出两个笑脸*/
for(i=1;i<11;i++)
{
for(j=1;j<=i;j++)
printf("%c%c",219,219);
printf("\n");
}
}
【程序11】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
2.程序源代码:
main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n");/*控制输出,每行四个*/
f1=f1+f2; /*前两个月加起来赋值给第三个月*/
f2=f1+f2; /*前两个月加起来赋值给第三个月*/
}
}
==============================================================
【程序12】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
2.程序源代码:
#include "math.h"
main()
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<=200;m++)
{ k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0)
{leap=0;break;}
if(leap) {printf("%-4d",m);h++;
if(h%10==0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d",h);
}
==============================================================
【程序13】
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
2.程序源代码:
main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出个位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf("\n");
}
==============================================================
【程序14】
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
2.程序源代码:
/* zheng int is divided yinshu*/
main()
{
int n,i;
printf("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{ printf("%d*",i);
n=n/i;
}
else
break;
}
}
printf("%d",n);}
==============================================================
【程序15】
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
2.程序源代码:
main()
{
int score;
char grade;
printf("please input a score\n");
scanf("%d",&score);
grade=score>=90?'A':(score>=60?'B':'C');
printf("%d belongs to %c",score,grade);
}
==============================================================
【程序16】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.程序源代码:
main()
{
int a,b,num1,num2,temp;
printf("please input two numbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1 { temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*利用辗除法,直到b为0为止*/
{
temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);
}
==============================================================
【程序17】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
2.程序源代码:
#include "stdio.h"
main()
{char c;
int letters=0,space=0,digit=0,others=0;
printf("please input some characters\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letters++;
else if(c==' ')
space++;
else if(c>='0'&&c<='9')
digit++;
else
others++;
}
printf("all in all:char=%d space=%d digit=%d others=%d\n",letters,
space,digit,others);
}
==============================================================
【程序18】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
2.程序源代码:
main()
{
int a,n,count=1;
long int sn=0,tn=0;
printf("please input a and n\n");
scanf("%d,%d",&a,&n);
printf("a=%d,n=%d\n",a,n);
while(count<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}
printf("a+aa+...=%ld\n",sn);
}
==============================================================
【程序19】
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。
1. 程序分析:请参照程序<--上页程序14.
2.程序源代码:
main()
{
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i {
if((j%i)==0)
{ n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i printf("%d,",k[i]);
printf("%d\n",k[n]);
}
}
}
==============================================================
【程序20】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
1.程序分析:见下面注释
㈣ 单片机C语言程序设计实训100例:基于8051+Proteus仿真的目录
第1章8051单片机C语言程序设计概述1
1.1 8051单片机引脚1
1.2 数据与程序内存2
1.3 特殊功能寄存器3
1.4 外部中断、定时/计数器及串口应用4
1.5 有符号与无符号数应用、数位分解、位操作5
1.6 变量、存储类型与存储模式7
1.7 数组、字符串与指针9
1.8 流程控制11
1.9 可重入函数和中断函数11
1.10 C语言在单片机系统开发中的优势12
第2章Proteus操作基础13
2.1 Proteus操作界面简介13
2.2 仿真电路原理图设计14
2.3 元件选择16
2.4 调试仿真20
2.5 Proteus与? V3的联合调试21
第3章 基础程序设计22
3.1 闪烁的LED 22
3.2 从左到右的流水灯23
3.3 左右来回循环的流水灯25
3.4 花样流水灯26
3.5 LED模拟交通灯28
3.6 单只数码管循环显示0~9 30
3.7 8只数码管滚动显示单个数字31
3.8 8只数码管显示多个不同字符33
3.9 数码管闪烁显示35
3.10 8只数码管滚动显示数字串36
3.11 K1~K4控制LED移位37
3.12 K1~K4按键状态显示39
3.13 K1~K4分组控制LED 40
3.14 K1~K4控制数码管移位显示42
3.15 K1~K4控制数码管加减演示44
3.16 4×4键盘矩阵控制条形LED显示46
3.17 数码管显示4×4键盘矩阵按键48
3.18 开关控制LED 51
3.19 继电器控制照明设备52
3.20 数码管显示拨码开关编码53
3.21 开关控制报警器55
3.22 按键发音56
3.23 播放音乐58
3.24 INT0中断计数59
3.25 INT0中断控制LED 61
3.26 INT0及INT1中断计数63
3.27 TIMER0控制单只LED闪烁66
3.28 TIMER0控制流水灯68
3.29 TIMER0控制4只LED滚动闪烁70
3.30 T0控制LED实现二进制计数72
3.31 TIMER0与TIMER1控制条形LED 73
3.32 10s的秒表75
3.33 用计数器中断实现100以内的按键计数77
3.34 10 000s以内的计时程序78
3.35 定时器控制数码管动态显示81
3.36 8×8 LED点阵屏显示数字83
3.37 按键控制8×8 LED点阵屏显示图形85
3.38 用定时器设计的门铃87
3.39 演奏音阶89
3.40 按键控制定时器选播多段音乐91
3.41 定时器控制交通指示灯93
3.42 报警器与旋转灯96
3.43 串行数据转换为并行数据98
3.44 并行数据转换为串行数据99
3.45 甲机通过串口控制乙机LED闪烁101
3.46 单片机之间双向通信104
3.47 单片机向主机发送字符串108
3.48 单片机与PC串口通信仿真110
第4章 硬件应用115
4.1 74LS138译码器应用115
4.2 74HC154译码器应用116
4.3 74HC595串入并出芯片应用118
4.4 用74LS148扩展中断121
4.5 I2C-24C04与蜂鸣器123
4.6 I2C-24C04与数码管127
4.7 用6264扩展内存132
4.8 用8255实现接口扩展134
4.9 555的应用136
4.10 BCD译码数码管显示数字138
4.11 MAX7221控制数码管动态显示139
4.12 1602字符液晶滚动显示程序142
4.13 1602液晶显示的DS1302实时时钟148
4.14 12864LCD图像滚动显示154
4.15 160128LCD图文演示160
4.16 2×20串行字符液晶显示167
4.17 开关控制12864LCD串行模式显示169
4.18 ADC0832模数转换与显示175
4.19 用ADC0808控制PWM输出178
4.20 ADC0809模数转换与显示181
4.21 用DAC0832生成锯齿波183
4.22 用DAC0808实现数字调压184
4.23 PCF8591模数与数模转换186
4.24 DS1621温度传感器输出显示193
4.25 DS18B20温度传感器输出显示198
4.26 正反转可控的直流电动机203
4.27 正反转可控的步进电动机205
4.28 键控看门狗208
第5章 综合设计211
5.1 可以调控的走马灯211
5.2 按键选播电子音乐214
5.3 可演奏的电子琴216
5.4 1602LCD显示仿手机键盘按键字符219
5.5 1602LCD显示电话拨号键盘按键222
5.6 12864LCD显示计算器键盘按键225
5.7 数码管随机模拟显示乘法口诀231
5.8 1602LCD随机模拟显示乘法口诀234
5.9 用数码管设计的可调式电子钟236
5.10 用1602LCD设计的可调式电子钟239
5.11 用DS1302与数码管设计的可调式电子表243
5.12 用DS1302与1602LCD设计的可调式电子日历与时钟247
5.13 用DS1302与12864LCD设计的可调式中文电子日历252
5.14 用PG12864LCD设计的指针式电子钟257
5.15 高仿真数码管电子钟266
5.16 1602LCD显示的秒表269
5.17 数码管显示的频率计274
5.18 字符液晶显示的频率计276
5.19 用ADC0832调节频率输出279
5.20 用ADC0832设计的两路电压表281
5.21 用数码管与DS18B20设计的温度报警器284
5.22 用1602LCD与DS18B20设计的温度报警器289
5.23 数码管显示的温控电动机295
5.24 温度控制直流电动机转速298
5.25 用ADC0808设计的调温报警器303
5.26 160128LCD中文显示温度与时间306
5.27 用DAC0808设计的直流电动机调速器309
5.28 160128液晶中文显示ADC0832两路模数转换结果310
5.29 160128液晶曲线显示ADC0832两路模数转换结果313
5.30 串口发送数据到2片8×8点阵屏滚动显示315
5.31 用74LS595与74LS154设计的16×16点阵屏318
5.32 用8255与74LS154设计的16×16点阵屏320
5.33 8×8 LED点阵屏仿电梯数字滚动显示323
5.34 用24C04与1602LCD设计电子密码锁325
5.35 光耦控制点亮和延时关闭照明设备331
5.36 12864LCD显示24C08保存的开机画面334
5.37 12864LCD显示EPROM2764保存的开机画面340
5.38 160128液晶显示当前压力342
5.39 单片机系统中自制硬件字库的应用344
5.40 用8051与1601LCD设计的整数计算器349
5.41 模拟射击训练游戏357
参考文献363
㈤ 单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录
第1章PIC单片机C语言程序设计概述
1.1 PIC单片机简介
1.2 MPLAB+C语言程序开发环境安装及应用
1.3 PICC/PICC18/MCC18程序设计基础
1.4 PIC单片机内存结构
1.5 PIC单片机配置位
1.6 基本的I/O端口编程
1.7 中断服务程序设计
1.8 PIC单片机外设相关寄存器
1.9 C语言程序设计在PIC单片机应用系统开发中的优势
第2章PROTEUS操作基础
2.1 PROTEUS操作界面简介
2.2 仿真电路原理图设计
2.3 元件选择
2.4 仿真运行
2.5 MPLAB IDE与PROTEUS的联合调试
2.6 PROTEUS在PIC单片机应用系统开发中的优势
第3章 基础程序设计
3.1 闪烁的LED
3.2 用双重循环控制LED左右来回滚动显示
3.3 多花样流水灯
3.4 LED模拟交通灯
3.5 单只数码管循环显示0~9
3.6 4只数码管滚动显示单个数字
3.7 8只数码管扫描显示多个不同字符
3.8 K1~K5控制两位数码管的开关、加减与清零操作
3.9 数码管显示4×4键盘矩阵按键
3.10 数码管显示拨码开关编码
3.11 继电器及双向可控硅控制照明设备
3.12 INT中断计数
3.13 RB端口电平变化中断控制两位数码管开关与加减显示
3.14 TIMER0控制单只LED闪烁
3.15 TIMER0控制流水灯
3.16 TIMER0控制数码管扫描显示
3.17 TIMER1控制交通指示灯
3.18 TIMER1与TIMER2控制十字路口秒计时显示屏
3.19 用工作于同步计数方式的TMR1实现按键或脉冲计数
3.20 用定时器设计的门铃
3.21 报警器与旋转灯
3.22 用工作于捕获方式的CCP1设计的频率计
3.23 用工作于比较模式的CCP1控制音阶播放
3.24 CCP1 PWM模式应用
3.25 模拟比较器测试
3.26 数码管显示两路A/D转换结果
3.27 EEPROM读写与数码管显示
3.28 睡眠模式及看门狗应用测试
3.29 单片机与PC双向串口通信仿真
3.30 PIC单片机并行从动端口PSP读写测试
第4章 硬件应用
4.1 74HC138与74HC154译码器应用
4.2 74HC595串入并出芯片应用
4.3 用74HC164驱动多只数码管显示
4.4 数码管BCD解码驱动器7447与4511应用
4.5 8×8LED点阵屏显示数字
4.6 8位数码管段位复用串行驱动芯片MAX6951应用
4.7 串行共阴显示驱动器MAX7219与7221应用
4.8 14段与16段数码管串行驱动显示
4.9 16键解码芯片74C922应用
4.10 1602LCD字符液晶测试程序
4.11 1602液晶显示DS1302实时时钟
4.12 1602液晶工作于4位模式实时显示当前时间
4.13 带RAM内存的实时时钟与日历芯片PCF8583应用
4.14 2×20串行字符液晶演示
4.15 LGM12864液晶显示程序
4.16 PG160128A液晶图文演示
4.17 TG126410液晶串行模式显示
4.18 HDG12864系列液晶演示
4.19 Nokia7110液晶菜单控制程序
4.20 8通道模拟开关74HC4051应用测试
4.21 用带I2C接口的MCP23016扩展16位通用I/O端口
4.22 用带SPI接口的MCP23S17扩展16位通用I/O端口
4.23 用I2C接口控制MAX6953驱动4片5×7点阵显示器
4.24 用I2C接口控制MAX6955驱动16段数码管显示
4.25 用带SPI接口的数/模转换器MCP4921生成正弦波形
4.26 用带SPI接口的数/模转换器MAX515控制LED亮度循环变化
4.27 正反转可控的直流电机
4.28 PWM控制MOSFET搭建的H桥电路驱动直流电机运行
4.29 正反转可控的步进电机
4.30 用L297+L298控制与驱动步进电机
4.31 PC通过RS-485器件MAX487远程控制单片机
4.32 I2C接口DS1621温度传感器测试
4.33 SPI接口温度传感器TC72应用测试
4.34 温度传感器LM35全量程应用测试
4.35 K型热电偶温度计
4.36 用铂电阻温度传感器PT100设计的测温系统
4.37 DS18B20温度传感器测试
4.38 SHT75温湿度传感器测试
4.39 1-Wire式可寻址开关DS2405应用测试
4.40 光敏电阻应用测试
4.41 MPX4250压力传感器测试
4.42 用I2C接口读写存储器AT24C04
4.43 用SPI接口读写AT25F1024
4.44 PIC18 I2C接口存储器及USART接口测试程序
4.45 PIC18 SPI接口存储器测试程序
4.46 PIC18定时器及A/D转换测试
4.47 用PIC18控制Microwire接口继电器驱动器MAX4820
4.48 MMC存储卡测试
4.49 ATA硬盘数据访问
4.50 微芯VLS5573液晶显示屏驱动器演示
第5章 综合设计
5.1 用DS1302/DS18B20+MAX6951设计的多功能电子日历牌
5.2 用PCF8583设计高仿真数码管电子钟
5.3 用4×20LCD与DS18B20设计的单总线多点温度监测系统
5.4 用内置EEPROM与1602液晶设计的加密电子密码锁
5.5 用PIC单片机与1601LCD设计的计算器
5.6 电子秤仿真设计
5.7 数码管显示的GP2D12仿真测距警报器
5.8 GPS全球定位系统仿真
5.9 能接收串口信息的带中英文硬字库的80×16点阵显示屏
5.10 用M145026与M145027设计的无线收发系统
5.11 红外遥控收发仿真
5.12 交流电压检测与数字显示仿真
5.13 带位置感应器的直流无刷电机PMW控制仿真
5.14 3端可调正稳压器LM317应用测试
5.15 模拟射击训练游戏
5.16 带触摸屏的国际象棋游戏仿真
5.17 温室监控系统仿真
5.18 PIC单片机MODBUS总线通信仿真
5.19 PIC单片机内置CAN总线通信仿真
5.20 基于PIC18+Microchip TCP/IP协议栈的HTTP服务器应用
参考文献