第一篇:有关51单片机中断的形式和C语言编程格式
有关51单片机中断的形式和C语言编程格式
void INT0()interrupt 0 using 1 {.........} interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;
using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;
例如:
/*-----------------
外部中断程序-----------------*/ void ISR_Key(void)interrupt 0 using 1 { P1=~P1;
//s3按下触发一次,P1取反一次 }
/*-----------------
串口中断程序-----------------*/ void UART_SER(void)interrupt 4 //串行中断服务程序 {
unsigned char Temp;
//定义临时变量
if(RI)
//判断是接收中断产生
{
RI=0;
//标志位清零
Temp=SBUF;
//读入缓冲区的值
P1=Temp;
//把值输出到P1口,用于观察
SBUF=Temp;
//把接收到的值再发回电脑端
}
if(TI)
//如果是发送标志位,清零
TI=0;}
第二篇:--单片机C语言编程实训
实习报 告
实习地点:201机房
实习时间:2014.12.1——2014.12.6 实习项目:单片机C语言编程实训 指导老师:骆
乐 姓
名:
班
级:电信3121
一、实习内容 1.计算字符的ASCII码
编写一个程序,在终端输入一个字符,输出它的ASCII码。解题思路:通常我们输出一个字符一般用printf(“%c”,c);的形式,因为输出格式规定的是“%c”,因此表示以字符的形式输出,所以我们看到的是相对应的ASCII码的字符形式。
用char定义字符a,a的值为任意值。输出结果a=%d。源代码:
#include
2.嵌套if-else语句的妙用
学校进行成绩分级管理,取消分数制,改为成绩分级评定。具体办
法是:小羽60分为E类;60分至70分(不含70分)为D类;70分至80分(不含)为C类;80分至90分(不含)为B类;90分以上为A类。设计一个程序。对输入的成绩进行等级划分。
解题思路:先把头文件和主函数输入。定义score为整型变量,定义grade为字符型变量。定义score为任意值scanf(“%d”,score)。使用多分支条件语句,判断趁机的等级。
源代码:
#include
}
程序截图:
3.判断日期
输入一个日期(年月日),输出这是某年的第几天。源代码:
#include “stdio.h” void main(){ int year,month,day;int cday;scanf(“%d %d %d”,&year,&month,&day);switch(month){ case 1: cday = 0;break;case 2: cday = 31;break;case 3: cday = 31+28;break;case 4:
cday = 31+28+31;break;case 5: cday = 31+28+31+30;break;
case 6: cday = 31+28+31+30+31;break;case 7: cday = 31+28+31+30+31+30;break;case 8: cday = 31+28+31+30+31+30+31;break;case 9: cday = 31+28+31+30+31+30+31+31;break;case 10: cday = 31+28+31+30+31+30+31+31+30;break;case 11: cday = 31+28+31+30+31+30+31+31+30+31;break;
case 12:
cday = 31+28+31+30+31+30+31+31+30+31+30;
break;} cday += day;
if((year % 4 ==0 && year % 100!=0 || year % 400 == 0)&& month > 2){ cday += 1;} printf(“%d,n DCF 14 ”,cday);
getch();}
程序截图:
4.打印特殊图案
请设计一个程序,实现在屏幕上输出一个下面的图案 解题思路:直接输入编程,但要注意*间的空格。源代码:
#include
* n * * * n* * * * *n ,DCF 14 n”);getch();}
程序截图:
5.求两个数的最大公约数和最小公倍数
编写一个程序计算两个正整数的最大公约数和最小公倍数
源代码:
#include
int main(int argc,int *argv[]){ int num1,num2,temp;int a,b;a > b;printf(“please input 2 number:”);scanf(“%d,%d”,&num1,&num2);if(num1 < num2){ temp = num1;num1 = num2;num2 = temp;} a = num1;b = num2;while(b){ temp = a % b;a = b;b = temp;}
printf(“the zuidagongyuehsu:%d,the zuixiaogongbeishu:%dn”,a,num1 * num2 / a);printf(“%dn,dcf 14 n”);system(“pause”);return 0;getch();}
程序截图:
6.猴子吃桃问题
有一只猴子第一天摘下若干个桃子,当即吃掉了一半,又多吃了一个;第二天又将剩下的桃子吃了一半,有多吃了一个;按照这样的吃法每天都吃前一天剩下的桃子的一半又一个。到了第10天,就只剩一个桃子。问题:这只猴子第一天摘了多少个桃子。源代码:
#include
void main(){ int day,x1,x2;day=9;x2=1;while(day>0){ x1=(x2+1)*2;x2=x1;day--;} printf(“total=%dn dcf 14”,x1);getch();}
程序截图:
7.谁在说谎
3个嫌疑犯在法官面前各执一词,甲说:已在说谎;已说:甲在说谎;丙说:甲已两人都在说谎。法官为了难,甲乙丙三人到底谁在说谎,睡说的是真话呢?
源代码:
#include
int main(int argc, char *argv[]){
int a,b,c;
for(a=0;a<2;a++)
for(b=0;b<2;b++)
for(c=0;c<2;c++)
if((a&&!b ||!a&&b)&&(b&&!c || b&&c)&&(c &&a+b == 0 ||!c&&a+b!= 0))
printf(“j told a %sn”,a?“truth”:“lie”);
printf(“y told a %sn”,b?“truth”:“lie”);
printf(“b told a %sn”,c?“truth”:“lie”);
printf(“%dn dcf 14n”);
getch();}
程序截图:
第三篇:单片机外围电路设计及C语言编程视频
单片机外围电路设计及C语言编程视频教程介绍
这是一部学单片机革命性的视频教程,教程全部十二讲,每讲3小时左右,讲座从最基本的预备知识开始讲起,非常详细的讲解KEIL编译器的使用,包括软件仿真,测定时间,单步运行,全速运行,设置断点,调试,硬件仿真调试,变量观察等,整个过程全部用单片机的C语言讲解,从C语言的第一个主函数MAIN讲起,一步步一条条讲解每一个语法,每条指令的意思,即使对单片机一巧不能,对C语言一无所知,通过本课程十节课的内容也可以让你轻松掌握51单片机的C语言编程设计,全新的讲课风格跳过复杂的单片机内部结构知识,首先从单片机的应用讲起一步步深入到内部结构,让学生彻底掌握其实际应用方法,把51单片机的所有应用每个部分都讲解的非常仔细,在讲解单片机应用的同时将单片机的常用外围电路设计及电阻,电容选值等都讲的清清楚楚,教师在教室前面用电脑一条一条写程序,旁边用TX-1C单片机实验板一个实验一个的演示,给学员解释每条指令的意思及原理,通过十天的时间让学生完全掌握单片机的C语言编程及单片机外围电路设计的思想。全程的屏幕,声音,用屏幕录像,实验板现象用摄像头拍摄,这部教程算是国内首个如此创新的以教师亲自实践为主,学员现场写程序,直接下载到实验板看现象,讲单片机的视频教程,只要你认真看,认真听,保证十天让你学会单片机应用和C语言编程。
教师推荐书籍如下:
1.如果要学C语言基本知识请看 谭浩强写的《C程序设计》 教师推荐的单片机书籍为以下两本: 2.新编MCS-51单片机应用设计 哈尔滨工业大学出版社
张毅刚
上书主要以汇编语言为主,对单片机内部结构介绍较详细,初学者可选择本书,在听讲本课程的同时,不但学会了C语言,而且通过查看本书还可了解汇编语言。3.8051系列单片机C程序设计完全手册 人民邮电出版社
求是科技
第四篇:C语言编程
#include(stdio.h)
main()
{ int question[4]={-1,-1,-1,-1},i=0,j=0,k=0,A=0,B=0,answer[4]={0};
char again='y';
while(again=='y'){ srand((int)time(0));
while(i4){ k=(int)rand()%10;
for(j=0;ji;j++)if(k==question[j]){ k=-1;break;}
if(k==-1)continue;question[i]=k;i++;}/*while i*/
for(i=8;i0;i--)/*还有8次机会*/
{ A=0;B=0;printf(“n你还剩下%d次机会。”,i);
printf(“n请输入四个0-9之间的数字,中间用空格隔开n”);for(j=0;j4;j++)scanf(“%d”,&answer[j]);
for(j=0;j4;j++)
for(k=0;k4;k++)
{ if(answer[j]==question[k]){ if(j==k)A++;else B++;} }/*for*/
if(A==4){ again='0';
printf(“n你赢了,还继续猜吗?(y/n)”);
while(again!='y'&&again!='n')
scanf(“...%c”,&again);break;}/*if*/
printf(“n%dA%dB”,A,B);if(i==1){ again='0';
printf(“n你输了,正确答案是”);
for(j=0;j4;j++)
printf(“%dt”,question[j]);
printf(“n还继续吗?(y/n)”);
while(again!='y'&&again!='n')scanf(“%c”,&again);
printf(“%c”,again);break;}/*if*/ }/*for changce*/ }/*while again*/ printf(“感谢您玩这个游戏。”);}
第五篇:C语言经典编程题(推荐)
C语言经典编程题
题目01:在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同的单词。
[cpp] view plain copy print?
1.2.3.4.5.6.7.8.9.int main(){
// 用数组定义一个字符串
char array[50] = “zha junju zhamengjun z mengjun”;
char *str = array;// 定义指针变量str,指向数组array
int len = 0;// 定义变量len,用于计数
int max = 0;// 定义变量max,存放最长单词的长度
char *p = 0;// 定义指针变量p,指向最长单词的首字符
10.11.// 判断指针当前指向的字符是不是' '
12.while(*str!= ' ')13.{
14.if(*str!= ' ')// 判断字符是不是空格 15.{
16.len++;// 计数加1 17.18.// 判断最大长度跟len长度的大小
19.if(max < len){
20.max = len;// 如果max小于len,将len赋值给max
21.p = str1];
46.} 47.else
48.{
49.sumDaysOfMonth += pingYear[monthDay;// 定义整型变量days,存储一个月内相隔的天数
54.int sumDays = 0;// 定义整型变量sumDays,存储两个时间点相隔的总天数
55.56.// 得到两个时间点相隔的总天数
57.sumDays = sumDaysOfYear + sumDaysOfMonth + days;58.59.printf(“两个时间点相隔%d天n”, sumDays);60.61.// 根据相隔的天数,判断小明遇到的人
62.if((sumDays % 2 == 0)&&(sumDays % 3 == 0))63.{
64.printf(“小明既结识了帅哥又结识了美女!n”);65.}
66.else if(sumDays % 2 == 0)67.{
68.printf(“小明结识了帅哥!n”);69.}
70.else if(sumDays % 3 == 0)71.{
72.printf(“小明结识了美女!n”);73.} 74.else
75.{
76.printf(“小明没有结识帅哥和美女n”);77.} 78.}
心得体会:(1)利用for循环遍历,if条件来判断是平年还是闰年,求出相隔年数的累加的天数(2)同理,利用第一步的方法,求出相隔月数的累加的天数,只是要注意每月的天数,根据平年和闰年的不同分别保存在两个不同的数组中,以便利于累加
(3)将输入的日减1,计算出当月相隔的天数,最后求出两个日期相隔的总天数。(4)根据总天数取余2和3,判断出小明当天结识的是美女还是帅哥。
题目05:提示用户输入一个正整数n,利用while循环计算并输出:1-2+3-4+5-6+7…+n的和。
[cpp] view plain copy print?
1.2.3.4.5.6.7.8.9.int main(){
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while(n <= 0){
// 2.1 提示输入
printf(“输入一个正整数:n”);
10.11.// 2.2 让用户输入
12.scanf(“%d”, &n);13.} 14.15.// 3.计算阶乘
16.int sum = 0;// 存储计算结果
17.int current = 0;// 当前要累加的数值
18.while(current < n){ 19.current++;20.21.// 如果是偶数,就减
22.if(current % 2 == 0){ 23.sum-= current;24.} else { // 如果是奇数,就加
25.sum += current;26.} 27.} 28.29.// 4.输出结果 30.printf(“%dn”, sum);31.32.return 0;33.}
心得体会:
(1)确保从键盘上输入的是一个整数(用while来判断);(2)用while循环来遍历从1到n的值;
(3)通过奇偶性判断所要累加数值的正负性,奇数就累加,偶数就累减。
题目06:提示用户输入一个正整数n,计算并输出n的阶乘结果:1*2*3*…*n。
[cpp] view plain copy print?
1.2.3.4.5.6.7.8.9.int main(){
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while(n <= 0){
// 2.1 提示输入
printf(“输入一个正整数:n”);
10.11.// 2.2 让用户输入
12.scanf(“%d”, &n);13.} 14.15.// 3.计算阶乘
16.int result = 1;// 存储计算结果
17.int current = 1;// 当前的乘数
18.while(current <= n){
19.result *= current;// 累乘每次的乘数
20.current++;// 乘完一次就++
21.} 22.23.// 4.输出阶乘结果
24.printf(“%d!= %dn”, n, result);25.26.return 0;27.}
心得体会:
(1)可以利用for循环或者while循环进行遍历,利用累乘即可求出值。(2)还可以利用递归来做,更简单。
题目07:编写一个函数,判断某个字符串是否为回文。回文就是从左边开始读 和 从右边开始读 都是一样的,比如“abcba” [cpp] view plain copy print?
1.2.3.4.5.6.7.8.9.int main(){
printf(“%dn”, isHuiwen(“a”));
return 0;}
/*
返回1代表是回文
返回0代表不是回文
10.*/ 11.int isHuiwen(char *str)
12.{
13.// 1.定义一个指向变量left指向字符串的首字符
14.char *left = str;
15.// 2.定义一个指向变量right指向字符串的末字符
16.char *right = str + strlen(str)1)+ count(n);// 求出每一个阶乘的累加和
58.} 59.60.// 定义和求出一个累加和
61.int count(int n)
62.{
63.if(n == 1)64.return 1;
65.return count(n1;22.23.// 如果左边元素的下标 < 右边元素的下标
24.while(left < right)25.{
26.// 利用中间变量交换两个元素的值
27.int temp = array[left];28.array[left] = array[right];29.array[right] = temp;30.31.// 交换一次后,左边元素下标增加,右边元素下标减小
32.33.left++;34.right--;35.} 36.}
心得体会:
(1)首先要明白一点,为什么不能通过sizeof(array)/ sizeof(int)来求出数组元素的个数?因为当数组作为参数传递的时候,函数的参数array实际上当做变量来存储传来的数组首元素的地址。而每一个指针变量占用8个字节。
(2)分别拿出数组首元素和数组尾元素,然后利用中间变量交换两个元素的值。(3)利用while循环,遍历数组元素,并使left< right保证循环到中间即可,否则每个元素又进行一次交换,结果值没有改变。
(4)函数reverse不需要返回值,因为改变了形参数组也就改变了外面的实参数组,因为数组是按址传递的。